Segment(세그먼트)
C언어로 작성된 프로그램은 주기억장치를 효율적으로 운영하리 위해서 일정한 크기, 대개는 64kb크기로 논리적 단위로 나누어서 할당과 할당 해제로 관리하게 된다. 그 논리적 단위를 세그먼트(Segment)라 하고 서로 관련이 있는 데이터와 명령어를 하나의 세그먼트로 관리하는 것이 아니라 데이터를 저장하는 데이터 세그먼트(Data Segment)영역와 명령어를 저장하는 코드 세그먼트 (Code Segment)영역로 구분해서 사용한다.
또한 데이터 세그먼트영역은 기억 장소의 할당 방법에 따라 동적 할당 (Dynamic Allocation)에 의하여 관리되는 스택(Stack) 세그먼트, 힙(Heap) 세그먼트와 정적 할당(Static Allocation)에 의해서 관리되어지는 데이터(Data) 세그먼트로 구분된다.
이렇게 구분되어지는 데이터 세그먼트 영역에 데이터를 저장하기 위해서 할당되어진 기억장소를 변수(Variable)라고 한다.
C프로그램의 메모리 모델
C 프로그램에 의해서 관리되어지는 세그먼트들은 총 5가지이다.
- 코드(Code) 세그먼트 : 코드 정적 세그먼트
- 프로그램의 명령어가 저장되어지는 주기억장치 영역을 말한다.
- 이 영역은 프로그램이 시작할 때 할당되었다가 프로그램이 끝날 때 할당이 해제되어지는 정적 할당 영역이다.
- 대개는 함수 하나당 하나의 코드 세그먼트가 할당되어 진다.
- 데이터(Data) 세그먼트 : 데이터 정적 세그먼트
- 프로그램이 실행될 때 할당되어서 프로그램이 끝날 때 할당 해제되어지는 데이터 세그먼트 영역이다.
- 따라서 프로그램이 시작될 때부터 끝날 때까지 사용되어야 하는 데이터들을 관리하는 영역이고 1개의 세그먼트만으로 구성되어진다.
- 코드 세그먼트 바로 다음에 할당되어지는 영역이다.
- 대개는 문자열 리터럴(혹은 문자열 상수), 전역 변수 또는 정적(static) 변수가 저장되어지는 영역이다.
- 스택(Stack) 세그먼트 : 데이터 동적 세그먼트
- 포그램이 실행하고 있는 동안에 일시적으로 보존하고자 하는 데이터를 순서적으로 쌓아서 저장해 두는 데이터 세그먼트 영역이다.
- C언어에서의 논리적 모듈인 함수 하나가 실행될 때 할당되었다가 함수가 끝날 때 할당해제되는 데이터 세그먼트 영역이다.
- 데이터를 관리하는 데 필용한 연산, 일반적으로 삽입, 삭제, 그리고 변경의 경신과 정렬과 검색의 질의를 수행할 때 필요한 데이터들을 관리하는 영역이다.
- C프로그램에서 가장 빈번하게, 그리고 중요하게 관리되는 기억장소 영역은 스택 데이터 세그먼트이다.
- 힙(Heap) 데이터 세그먼트 : 데이터 동적 세그먼트
- 프로그램의 실행 중에 원시 코드에 의해서 동적으로 할당되고 할당 해제되는 데이터 세그먼트 영역이다.
- C프로그램을 사용해서 자신만의 데이터들을 관리하고자 하는 사용자들에 의해서 관리되어지는 사용자 데이터들을 관리하는 영역이다.
- 철저하게 C프로그래머에 의해서 할당과 할당 해제가 결정되어지는 영역이다.
- 중앙처리장치(CPU) 레지스터
- 중앙처리장치가 데이터를 처리하는 동안 사용할 값이나 연산의 중간 결과를 일시적으로 저장해 두기 위해 사용되는 중앙처리장치에 존재하는 고속 처리 기억장치이다.
메모리 할당 방법
주기억장치는 여러 프로그램(프로세스, 리소스)에 의해서 사용되어진다. 따라서 어떠한 프로그램(프로세스, 리소스)이 주기억장치를 사용하기 위해서는 다른 프로그램이 사용되는 주기억장치를 사용하면 안된다. 이러한 관리를 운영체제가 한다
C프로그램에서는 운영체제에서 주기억장치에 사용에 대한 허가를 받아야 하고, 사용이 끝난 경우에는 바로 반환을 해야한다. 이 때 주기억장치에 사용 허가를 받는 작업을 할당(Allocation)
이라 하고, 사용이 끝나 반환하는 작업을 할당 해제(Deallocation)
이라고 한다.
C프로그램에서 사용되는 기억장소를 할당하는 방법은 기본적으로 정적과 동적으로 구분되어진다.
정적할당(Static Allocation)
- 일반적으로 프로그램이 실행될 때 기억장소에 할당되고 프로그램이 끝날 때 할당 해제될 때까지 그대로 유지되어지는 기억장치 관리방식
동적할당(Dynamic Allocation)
프로그램 실행 중에 필요할 떄 마다 기억장소를 할당하고, 필요하지 않으면 할당 해제를 시스템 또는 원시코드로 제어하는 기억장소 관리 방식이다.
동적할당은 기본적으로 시스템에 의해서 관리되는 스택에 의한 동적 할당과 프로그래머의 의해서 원시코드로 관리되어지는 힙을 이용한 동적 할당으로 구분되어 진다.
1) 스택에 의한 동적 할당
- 기억장소 운영의 효율성을 위해서 함수가 실행될 때마다 시스템에 의해서 필요한 기억장소가 할당되고 함수의 실행이 끝날 때 할당이 해제되는 방식
2) 힙을 이용한 동적 할당
- 라이브러리 내장함수로 제공되는 할당(calloc, malloc)과 해제(realloc, free) 함수를 이용하여 프로그래머가 주소에 의한 접근으로 기억장소를 관리하는 방식
'임베디드 > [ Embedded ]' 카테고리의 다른 글
[ Embedded ] 26. SMP 란? (1) | 2021.03.15 |
---|---|
[ Embedded ] 25. Quota (0) | 2021.02.25 |
[ Embedded ] 23. HAL(하드웨어 추상화 계층) (1) | 2020.12.02 |
[ Embedded ] 22. 임베디드 리눅스 구성요소(BSP) (0) | 2020.10.30 |
[ Embedded ] 21. 임베디드 개발환경(Toolchain, Compile...) (0) | 2020.10.29 |