시스템 자원
, 독립된 메모리 영역
, code
, data
, stack
, heap
, 메모리 공유
, 강제 종료 시나리오
Process가 메모리에 올라가면, 운영체제로부터 시스템 자원을 할당 받습니다. 이때, 시스템 자원으로 각 Process마다 독립된 메모리 영역을 할당해주는데, Code,Data,Stack,Heap 영역을 할당해줍니다. 이렇게 각 Process는 독립된 메모리 영역을 할당 받기 때문에, 서로의 메모리에 접근할 수 없습니다.
Thread의 경우, Process내에서 서로 메모리를 공유할 수 있습니다. 각 Thread는 Stack 영역으로 할당된 메모리 영역은 각 Thread 마다 할당받고, Code,Data,Heap 영역은 서로 공유하게 됩니다. 그래서 각 Thread는 각자의 Stack을 가지고 있지만, 다른 메모리 영역은 공유할 수 있습니다.
이 차이 때문에, 만약 한 Process가 오류로 인해 강제 종료가 되었을 때, 다른 Process에게 영향을 주지 않지만, Thread의 경우, 메모리가 공유되고 있기 때문에, 같은 Process 내부의 다른 Thread가 모두 함께 종료됩니다.
정적 할당 영역 (static)
크기가 변하지 않는 영역, 컴파일 단계에서 필요한 메모리 공간을 할당함.
- Code segment (코드 영역)
text segment라고도 불리는 이 영역에는 기계어로 이루어진 명령어가 저장된다. 그리고 이 영역은 read-only 공간이다.
- Data segment (데이터 영역)
Data segment는 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다. 주로 전역 변수나 정적 변수들이 저장된다.
동적 할당 영역 (dynamic)
크기가 변할 수 있는 영역, 런타임에서 메모리 공간을 할당함.
동적 할당 영역에서 Stack segment는 높은 주소부터 낮은 주소로 할당되고, Heap segment는 낮은 주소부터 높은 주소로 할당된다.
Heap segment (힙 영역)
프로그래머가 직접 할당할 수 있는 저장 공간이다. 해당 공간을 사용하지 않게 되면, 메모리 공간을 반환해야 한다. 그렇지 않으면 memory leak(메모리 누수)가 발생한다.Stack segment (스택 영역)
데이터를 일시적으로 저장하는 공간이다. data segment에 저장되는 값과 달리, 일시적으로 사용하는 값이 이곳에 저장되며 주로 함수의 실행이 끝나면 사라지는 매개 변수나 지역 변수가 저장된다.
Stack 영역은 함수의 인자나 PC 값, 지역 변수가 저장이 된다. 즉, 해당 실행 컨텍스트에서 필요한 데이터를 저장한다. 그렇기 때문에 thread 간에는 stack 영역을 독립적으로 두어야, 서로의 실행 컨텍스트를 안정적으로 관리할 수 있다. stack 영역이 독립적이기 때문에, 각 thread는 독립적으로 함수를 호출할 수 있다.
PC 값은 현재 실행되어야할 명령어의 주소를 가르킨다. context switching이 발생하게 되면, 각 thread는 자신이 어디까지 실행했는지를 각자 기억해야 하기 때문에, thread마다 PC register를 독립적으로 할당받아야한다.
스크립트 두 번째 문단에 '각 Thread는 Stack 영역으로 할당된 메모리 영역은 각 Thread 마다 할당받고, Code,Data,Heap 영역은 서로 공유하게 됩니다' 라는 문장, 여러번 읽었을 때 이해는 되지만 처음 볼 때 살짝 어색하네요. '할당된 메모리 영역은' -> '할당된 메모리 영역을' 로 고치면 조금 더 매끄러울 것 같아요!