리미로그
[OS] 프로세스 주소 공간 본문
이전 글에서 프로세스에 대해 설명하면서 각 프로세스는 주소 공간을 가진다고 얘기했다.
2022.12.13 - [CS/OS] - [OS] 프로세스와 스레드 차이
[OS] 프로세스와 스레드 차이
Process • 실행 중인 프로그램 c.f. program : HD나 secondary storage에 저장되어 있는 정적인 파일 • OS로부터 자원을 할당받는 작업 단위 • 각 프로세스는 자신만의 주소 공간을 가짐 Code : text 영역, inst
limi-log.tistory.com
이번엔 그 주소 공간이 어떻게 이루어져 있는지, 또 각 주소 공간은 무엇을 위한 공간인지 알아보겠다.
프로세스가 메모리를 할당받으면 자기 자신의 주소 공간이 생긴다.
주소 공간은 4가지로 구성되어 있다.
1. Code
프로그램에 작성되어 있는 함수 코드들이 CPU가 이해할 수 있게 명령어로 변경되어 저장되는 공간이다.
컴파일 때 결정되고 실행 중에 프로그램이 수정되면 안 되므로 read-only이다.
2. Data
global 변수, static 변수가 저장되어 있는 공간이다.
컴파일 완료 후 프로그램은 data 영역의 주소 값을 가리킨다.
전역 변수는 실행 중에 변경될 수 있으므로 read-write이다.
3. Heap
사용자가 동적으로 메모리를 할당할 때 사용하는 메모리 공간이다.
런타임 때 결정된다.
자바의 경우 객체는 heap 영역에 저장 후 GC가 메모리를 정리한다.
4. Stack
임시 데이터를 저장하는 공간이다.
함수의 파라미터, 돌아가야 할 주소, 지역 변수 등이 저장된다.
Stack Pointer register가 stack의 top을 가리키고 있다.
heap 영역과 stack 영역은 같은 공간에 있고 실행되면서 점점 공간을 넓혀간다.
이때 heap 영역과 stack 영역이 겹치지 않기 위해서 stack pointer가 사용된다.
만약 재귀 함수의 반복 호출 횟수가 많거나 지역변수가 메모리를 초과해서 할당되어야 한다면 stack overflow가 발생하게 된다.
소스코드를 통해 프로세스 주소 공간의 어느 영역에 할당되는지 살펴보자.
#include <stdio.h>
#inlcude <stdlib.h>
int x;
int y = 10;
int main(int argc, char *argv[])
{
int *values;
int i;
values = malloc(sizeof(int) * 5);
for(i=0; i<5; i++) values[i] = i;
return 0;
}
x, y는 전역 변수이므로 Data 영역에 할당된다.
위에서는 설명하지 않았지만 초기화되지 않은 변수는 Data가 아닌 BSS 영역에 저장된다.
따라서 x는 BSS 영역에 저장된다.
data영역과 bss 영역을 구분하는 이유는 무엇인가?
초기화되지 않은 변수는 영역만 할당하고 값을 프로그램에 저장해 줄 필요가 없다. 따라서 초기화되지 않은 변수까지 메모리의 공간을 차지하게 되면 더 큰 ROM 공간을 요구하기 때문에 초기화 여부에 따라 나누어 저장하게 된다.
data 영역은 실제로 ROM에 저장된다. 이때 ROM은 read-only이다.
하지만 전역 변수는 변경될 수 있기 때문에 RAM에 복사해서 변경되는 값을 적용시킨다.
argc, *argv[]는 함수의 파라미터이고, *values, i는 지역변수이므로 Stack 영역에 저장된다.
values는 malloc을 사용하여 동적으로 메모리를 할당받으므로 heap 영역에 저장된다.
참고
'CS > OS' 카테고리의 다른 글
[OS] 스케줄러 종류 (0) | 2022.12.16 |
---|---|
[OS] PCB & Context Switching (0) | 2022.12.15 |
[OS] 프로세스와 스레드 차이 (0) | 2022.12.13 |