아무코딩

메모리 구조 본문

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변수는 스택에 저장되고 할당된 공간은 힙영역에 존재한다. 스택에 있는 포인터가 힙에 있는 할당영역을 가리키는 구조입니다.

 

Reference

'CS > 운영체제' 카테고리의 다른 글

[운영체제] CPU 스케줄링  (0) 2020.04.28
[운영체제] 이중 동작 모드(Dual-mode Operation)  (0) 2020.04.22
Comments