서론
process란
프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 이는 프로그램이 실행되면서 발생하는 모든 정보를 포함하며, 프로세스는 메모리에 저장되어 CPU에 의해 한 번에 하나씩 처리된다. 각 프로세스에는 프로세스 ID, 현재 상태, 프로그램 카운터 등의 정보를 담고 있는 프로세스 제어 블록이 있다.
thread란
스레드는 프로세스 내에서 실행되는 흐름의 단위다. 각 스레드는 프로세스의 자원을 공유하며 동작하고, 프로세스 내에서 멀티 스레딩을 통해 여러 작업을 동시에 처리할 수 있다. 스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택 등의 정보를 담고 있는 스레드 제어 블록을 갖는다.
본론
process의 상태와 PCB
Process와 Thread는 리눅스에서는 task라고 하고, Thread를 Process의 가장 작은 하나의 작업 단위로 취급한다. 공통적으로 볼 수 있는 것은 일을 하는 주체라는 점이다. 다른 점을 상위 체계가 누구인가의 차이라고 말하면 좀 쉽게 이해할 수 있는 것 같다. 먼저 Process는 다음과 같은 작업을 통하여 cpu자원을 사용한다.
생각 확장
운영체제가 PCB를 할당하여 Process들을 관리한다. 그럼 PCB를 가진 Process들은 각자만의 고유한 영역이 생긴다.
만약 .exe를 두 개의 Process로 돌리면 어떨까? PCB가 두 개 생긴다. 즉, 낭비가 발생한다. 똑같은 Job을 수행함에도 동일한 PCB를 사용하는게 아니라 독립적인 공간을 사용하기 때문이다. 자 그럼 당연하게도 낭비를 줄이기 위해서 공유하려고 생각할 것이다. 이것이 Thread의 시작이지 않을까 싶다.
Process 상태 전이
process와 thread 각각 n개로 돌려보면?
각각 돌려보면 다음과 같은 차이를 볼 수 있다. 만약 독립적으로 동작하는 process로 만들면 ready Queue에 n개의 process가 들어간 것을 알 수 있다. 하지만 Thread로 돌린다면 공통적인 영역인 코드, 데이터, 힙을 공유하여 사용하여, 하나의 process만 만들어진 것을 볼 수 있다.
process 구현
Thread 구현
각각의 특징
process를 통한 구현
특징
- 상호 영향을 주지 않는다.
- 독립적인 공간
- 데이터 공유는 IPC기술을 이용해야 한다.
- 낭비가 될 수 있다.
Thread를 통한 구현
특징
- PCB 내의 영역을 자유롭게 공유할 수 있다.
- Thread는 Process에 종속적이다.
- Process보다 적은 문맥교환 비용
- 빠른 응답성을 제공할 수 있다. 이유는 문맥교환시에 발생하는 오버헤드와 자원공유가 가능하기 때문이다.
결론
Process는 고유의 PCB를 부여 받아 OS의 관리 체계 하에 속한다. 하지만 Thread는 Process내의 공통된 영역을 공유할 수 있고, 이를 통하여 낭비를 줄일 수 있다. 즉, Process내에 속하게 된다. 이 때문에 발생할 수 있는 문제는 Process가 죽는다면 모든 Thread가 죽을 수 있다. 그렇기에 상호 영향을 주면 안되는 프로그램을 만들어야 한다면 Thread보다는 IPC를 이용하여 Process간 통신을 통하여 공유하는 것이 더 좋은 선택지가 될 수 있다.