프로세스는 디스크에 정적으로 저장되어 있는 프로그램을 메모리에 적재하여 동적인 상태를 프로세스라고 한다. 운영체제로부터 시스템 자원을 할당받는데 프로세스마다 각각 독립된 메모리 영역 Code/Data/Stack/Heap를 할당해 준다. 각각 독립된 메모리 영역을 할당하기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
PCB(Process Control Block, 프로세스 제어 블록)
PCB는 특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제 자료구조이다. 운영체제는 프로세스를 관리하기 위해 프로세스 생성과 같이 PCB를 생성한다. CPU를 할당 받아 작업하다가 프로세스 전환이 발생하면 진행하던 작업을 저장하고, CPU를 반환해야 하는데 이때 작업 진행 사항을 PCB에 저장한다. 그리고 다시 CPU를 할당 받으면 PCB에 저장된 내용을 불러와 종료 시점부터 다시 수행한다.
프로세스의 실행 단위라고 할 수 있다. 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다. 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 된다.
프로세스가 할당받은 메모리 영역 내에서 Stack에 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap에 할당된 메모리 영역은 공유한다. 따라서 스레드는 각각의 Stack를 가지고 있지만 Heap 메모리는 서로 읽고 쓸 수 있다.
Stack를 독립적으로 할당한 이유
Stack는 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 들을 저장하기 위해 사용되는 메모리 공간으로 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고, 독립적인 실행 흐름이 추가되는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.
왜 이런 방식으로 메모리를 공유하나?
스레드는 CPU 입장에서 최소 작업 단위이다. 반면 운영체제는 운영체제의 관점에서 프로세스가 최소 작업 단위이다.
중요한 점은 프로세스는 하나 이상의 스레드를 가진다는 것이다. 따라서 운영체제 관점에서 프로세스가 최소 작업 단위인데, 이 때문에 같은 프로세스 소속의 스레드끼리 메모리를 공유하지 않을 수 없다.