[CS fundamentals] Process memory 구조


이 포스트는 In-Memory Layout of a Program (Process) 를 공부하며 번역한 포스트입니다.

이번 포스트에서는, program 이 실행될 때 실제로 main memory 에 어떤 구조를 가지고 실행되는지 설명한다. 여기에서는 32-bit x86 아키텍쳐 머신에서 실행되는 multitasking Linux OS 환경을 가정한다.

Multitasking OS 환경에서 실행되는 모든 process 는 각각의 virtual address space를 가진다. 이 address space 는 32-bit 환경에서 232 = 4GB 의 크기를 가지며, OS kernel 의 page table 에 의해 관리되고 실제 physical address 로 mapping 된다.
OS kernel 또한 그 자체로 하나의 process 이므로, virtual address space 를 가지며 OS kernel process 를 위한 전용 address space 를 가진다. Linux OS 에서 총 4GB 의 virtual address space 중 앞 3GB 부분은 user process 를 위해 사용되며, 마지막 1GB (0xC0000000~0xFFFFFFFF) 부분은 OS kernel 의 전용 address space 로 사용된다. 이를 그림으로 나타내면 아래와 같다.

Virtual memory spaces for kernel and user processes
Virtual memory spaces for kernel and user processes

자세한 내용은, Virtual Memory, Paging, and Swapping post 를 참고하자.

아래 그림은 User mode process 의 virtual memory space 부분에 대한 상세 내용을 나타낸다.

User mode process memory space
User mode process memory space
char s[] = "hello world";
int debug = 1;
// global (declared outside the main or any func.)
static int i = 10;
// 변수의 값이 추후 변경될 가능성이 있으므로, read-write 영역에 저장

const char* str = "hello world";
// 'str' pointer 변수는 read-write 영역에 저장,
// 'hello world' string literal 은 read-only 영역에 저장.