막연하게 프로세스는 프로그램이 메모리에 올라가서 실행 중인 상태,
스레드는 프로세스의 하나의 실행 단위 라고 생각해왔다.
동기화나 세마포어, 뮤텍스 .. 등을 다시 한번 되짚어보며 정리의 필요성을 느꼈다.
Program
어떤 작업을 위해 실행할 수 있는 파일
Process
컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
메모리 에 올라와 실행되고 있는 프로그램의 인스턴스
운영체제로부터 시스템 자원을 할당받은 작업의 단위
메모리 에 올라와 실행된 프로그램
할당받는 시스템 자원의 예
- CPU 시간
- 운영되기 위해 필요한 주소 공간
Code
,Data
,Stack
,Heap
의 구조로 되어있는 독립된 메모리 영역
프로세스의 독립된 메모리 영역
- 기본적으로 프로세스당 최소 1개의 스레드 (메인 스레드)를 가지고 있다.
- 각 프로세스는 별도의 주소 공간 에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간 통신 (IPC, inter-process communication) 이 필요하다.
- 파이프, 파일, 소켓 등을 이용한 통신 방법 이용
Thread
프로세스 내에서 실행되는 여러 흐름의 단위
프로세스가 할당받은 자원을 이용하는 실행의 단위
프로세스 내의 스레드 영역
- 스레드는 프로세스 내에서
Stack
만 각자 할당받고Code
,Data
,Heap
영역은 공유한다. - 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름 으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유 하면서 실행된다.
- 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유하는 반면, 프로세스는 다른 프로세스의 메모리에 직접 접근이 불가능(통신하기 위해선 IPC를 이용 -위에서 언급-) 하다.
→ 이렇게 길게 써놓았지만 결론은
프로세스 내 Code
, Data
, Heap
영역은 공유 되고, Stack
만 각자 할당 받는다. 따라서 프로세스끼리는 서로의 메모리에 직접 접근이 불가하지만 한 프로세스 내의 형제 스레드(sibling thread)끼리는 Code
, Data
, Heap
영역은 변경 내역을 즉시 확인 할 수 있다.
Stack
이 독립적으로 할당되는 이유?
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다.
따라서 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고, 이는 독립적인 실행 흐름이 추가되는 것이다.
결과적으로 실행 흐름의 추가를 위한 최소 조건이 독립된 스택을 제공하는 것이다.
그 이외의 영역이 공유되는 이유?
코드 영역을 공유
프로세스는 독립적인 구조이기 때문에 다른 프로세스의 Code
영역에 있는 함수를 호출할 수 없다.
스레드는 Code
영역을 공유하기 때문에 두 개 이상의 쓰레드가 자신이 포함된 프로세스의 Code
영역에 있는 함수를 호출할 수 있다.
데이터 영역과 힙 영역을 공유
전역 변수와 동적 할당된 메모리 공간을 공유할 수 있고, 이를 통해 쓰레드 간 통신을 할 수 있지만 동시에 메모리에 접근하기 때문에 주의해야 한다.
다음은 PCB(그리고 context switch)와 공유자원(임계구역) 동기화 (세마포어, 뮤텍스)에 대해 정리하겟음.
참고
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://brownbears.tistory.com/39