[OS] 프로세스와 쓰레드
프로세스(Process)
: OS가 작업을 할당하는 단위, 현재 실행 중인 프로그램(program in executing)을 뜻한다. 일반적으로 잡(job)이라는 용어와 혼용해 사용하기도 한다.
- 독자적인 메모리 공간을 가지고 다른 프로세스와 통신하기 위해 시스템콜을 호출하여 진행해야 한다.
- 컨텍스트 스위치 과정에서 모든 영역에 대하여 PCB에 저장하고 넘겨야되기에 쓰레드보다 많은 시간이 소요된다.
프로세스의 주소 영역(메모리 영역)
프로세스의 주소 영역은 크게 코드(Code), 데이터(Data), 힙(Heap), 스택(Stack)영역으로 구분된다.
코드 영역은 실행할 프로그램 코드가 저장되는 부분이다.
데이터 영역은 전역 변수(global variable)나 static 변수 등 프로그램이 사용하는 데이터가 저장되는 부분이다.
힙 영역은 동적 메모리 할당을 위한 부분이다.
스택 영역은 지역변수(local variable)나 함수의 매개변수(parameter) 등이 저장되는 부분이다.
프로세스의 상태
프로세스의 상태는 실행(running), 준비(ready), 봉쇄(blocked, wait, sleep)로 구분할 수 있다.
실행 상태는 프로세스가 CPU를 보유하고, 기계어 명령을 실행하고 있는 상태를 가리킨다.
준비 상태는 프로세스가 CPU만 보유하면 당장 명령을 실행할 수 있지만 CPU를 할당받지 못해 기다리고 있는 상태를 가리킨다.
봉쇄 상태는 CPU를 할당받더라도 당장 명령을 실행할 수 없는 프로세스의 상태를 말한다.
ex.) 프로세스가 요청한 입출력 작업이 진행 중인 경우
쓰레드(Thread)
프로세스가 작업을 할당하는 단위
프로세스 밑에 여러 쓰레드가 존재할 수 있고 그 쓰레드들은 프로세스 내에서 스택과 PC를 제외한 나머지 정보들을 공유할 수 있다 (code, heap, data)
기본적으로 컨텍스트 스위치가 프로세스보다 빠르다.
프로세스보다 간편하게 다른 쓰레드들과 데이터를 공유할 수 있다. 하지만 가장 중요한 것은 디버깅이 어려운 부분과 데이터를 공유하였을 때 그것에 대하여 동기화 작업을 해줘야 된다는 것이다.
1개의 process에서 여러개의 thread가 존재가능.
Data, code, heap영역은 공유하여서 사용하고 stack과 register는 thread별로 가지고 있는다.
Process보다 context switch가 빠르며(register와 stack만 바꾸면 되니까), 생성시에도 빠른 속도가 있다.
각 thread는 스택영역을 따로 가지고 있다.
: 스택과 레지스터는 프로세스에서 어떤 부분을 실행하고 어떤 함수를 실행하고 있었는지에 대한 정보를 저장한다. 그런데 그런 정보를 공유하고 있다고 한다면 3개의 쓰레드를 생각해봤을 때. A, B, C. A에서 B로 넘어가면서 콜 스택이 쌓이고 그것을 다시 A로 갔을 때 어떤 부분이 자신의 것인지 파악하기 어렵고. PC같은 것도 A를 가르키고 있다고 CS가 일어나서 B로 넘어갔다고 하면 기존 A의 PC는 어디에 저장해야되는 문제들이 존재한다고 생각합니다. 그렇기 때문에 따로 저장된다.
Process vs thread
Process는 운영체제로부터 자원을 할당받는 작업의 단위이고 thread는 process가 할당받은 자원을 이용하는 실행의 단위이다.
각 Process는 별도에 주소 공간과 자원을 가지고 있지만 각 thread는 process안에서 스택을 제외한 자원을 공유한다. 멀티 프로세스를 사용하면 되는데 굳이 thread를 사용하는 이유는 multitasking을 위해서 여러 process를 만드는 것은thread를 만드는 것보다 자원을 더 많이 소모하며 process간 통신하기 위해 설정하는 것보다 thread간 통신을 위해 소모되는 자원이 더 적기때문이다. Thread는 자원의 효율을 증가시키지만 공유 자원을 사용하면서 생기는 문제를 막기 위해서 동기화 문제에 신경써야한다.
Multi tasking에서 thread에 개념
process를 하나 더 만들어서 multi tasking을 하면 되지만 너무 많은 자원을 소비하게 된다. 또한 IPC 또한 설정하여서 process간에 정보교환도 하게 만들어야된다. Multithreading이라는 개념을 만들어 보자.
프로세스 간 통신(Inter-Process Communication, IPC)
: 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻
멀티프로세스 vs 멀티쓰레딩
Process를 만드는 것은 thread를 만드는 것에 비해 자원에 소모가 심하며 context switch를 하는 경우 더욱 적은 자원을 소모하며 가능하다. 그리고 또한 process간 통신 방법보다 thread간에 통신방법이 훨씬 간단하다. 하지만 thread로 멀티태스킹을 하는 경우 디버그가 어려운 점과 가장 큰 문제는 thread간 통신을 하며 공유자원을 사용하면서 동기화 문제에 신경써야한다.
'CS > OS' 카테고리의 다른 글
프로세스의 컴파일 (0) | 2023.10.15 |
---|---|
[OS] CPU란? (0) | 2021.09.08 |
[OS] 메모리 구조(Memory Structure) (2) | 2021.08.21 |
[OS] 메모리(Memory) (0) | 2021.08.21 |
[OS] Operating System (0) | 2021.08.17 |