CS/운영체제
메모리 구조
동 코
2020. 3. 20. 18:42
프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 합니다.
또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요합니다.
아래가 낮은주소 위가 높은주소
메모리 구조
- UNIX 시스템은 실행중인 프로세스에게 4GB의 가상 메모리 공간을 할당합니다.
- 상위 1GB는 커널이, 하위 3GB는 사용자 프로그램이 차지합니다.
스택영역
- 프로그램이 자동으로 사용하는 임시 메모리 영역으로 지역변수, 매개변수, 리턴 값 등이 잠시 사용되었다가 사라지는 임시적인 데이터를 저장하는 영역입니다. 함수 호출 시 생성되고 함수가 끝나면 반환됩니다.
- 스택의 사이즈는 각 프로세스마다 할당되지만 프로세스가 메모리에 로드될때 Stack사이즈가 고정되어 있어 런타임시 Stack 사이즈를 바꿀 수 없습니다.
- 스택영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 저장됩니다.
힙영역
- 필요에 의해 메모리를 동적 할당하고자 할 때 사용하는 메모리 영역으로 동적 데이터 영역이라고 부릅니다. 메모리 주소값에 의해서만 참조되고 사용하는 영역입니다. 이 영역에 데이터를 저장하기 위해 C에서 malloc()함수를 사용합니다.
- 힙영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.
heap영역과 stack영역은 사실 같은 공간을 공유한다. heap이 메모리 위쪽 주소부터 할당되면 stack은 아래쪽에서 할당 되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOW, STACK OVERFLOW라고 칭한다.
데이터 영역
- 프로그램이 실행될 때 생성되고 프로그램이 종료되면 시스템에 반환되며 전역변수(global), 정적변수(static), 배열(array)(전역), 구조체(structure) 등이 저장됩니다. 이때 초기화 된 데이터는 Data영역에 저장되고 초기화 되지 않은 데이터는 BSS(Block Stated Symbol)영역에 저장됩니다. 함수 내부에 선언된 Static 변수는 프로그램이 실행될 때 공간만 할당되고 그 함수가 실행될 때 초기화 됩니다.
- 쓰기가능, 크기고정
BSS영역
- 초기화되지 않은 정적, 전역변수는 BSS영역에 저장.
- bss영역에 저장하면 변수 크기에 대한 정보만 저장하고, 파일 자체에는 그 영역을 잡지 않는다. 프로그램을 실행하면 그때서야 bss를 위한 공간을 확보한다.
코드 영역
- 프로세스가 실행할 코드와 매크로 상수가 기계어의 형태로 저장된 공간. 컴파일 타임에 결정되고 중간에 코드를 바꿀수 없게 Read-Only로 지정되어 있다.
헷갈리기 쉬운 문제
- 포인터는 힙에 저장될까? 아니다. 포인터는 스택에 저장된다. 동적할당되는 영역이 힙이다. c는 call by value라서 4byte인 reference변수는 스택에 저장되고 할당된 공간은 힙영역에 존재한다. 스택에 있는 포인터가 힙에 있는 할당영역을 가리키는 구조입니다.