[OS] 스레드

touhou09·2024년 11월 8일
0

컴퓨터 이론

목록 보기
19/47

Thread

Process를 구성하는 실행의 흐름 단위.
전통적으로는 하나의 process는 하나의 thread를 갖는 단일 thread process라고도 볼 수 있다.
Process에 thread라는 개념이 동비되면서 하나의 process에 여러 thread가 존재해 한 번에 여러 일을 동시에 처리할 수 있게 되었다.

thread는 process내에서 각기 다른 thread ID, program counter 등을 비롯한 register 값, stack으로 구성된다.
각자 다른 값들을 가지기 때문에 thread는 process 내에서 각자 다른 코드들을 실행할 수 있다.

여기서 핵심적으로 알아야 할 내용은 하나의 process의 thread들은 stack을 제외한 heap/data/code 영역의 내용을 공유한다는 사실이다.

요약하자면, process가 실행되는 프로그램이라면 thread는 process를 구성하는 실행의 흐름 단위이고, 각 thread는 stack을 제외한 영역의 내용을 서로 공유한다.

Linux에서는 Process와 Thread간의 구분을 명확하게 하지 않고 Task라는 이름으로 통일해서 명명한다.
Process와 Thread 모두 실행 시의 Context라는 점에서 동등하다고 여기기 때문이다.

Multiprocess와 Multithread

컴퓨터가 실행하는 과정에서 여러 process가 동시에 실행될 수 있고, 그 process를 이루는 thread가 여러 개 있을 수 있다.
이때 여러 process를 동시에 실행하는 것을 Multi Process라 하고, 여러 thread로 process를 동시에 실행하는 것을 Multithread라고 한다.

만약 fork()를 통해 동일한 process를 2개 실행한다면, 각 process는 서로 다른 code, data, heap, stack을 가진 상태로 memory에 적재된다. 같은 process가 여러개 적재되는 것으로 memory 사용에 있어서 낭비가 있다고도 볼 수 있다.
하지만 thread는 각기 다른 thread ID, program counter를 포함한 register, stack만 가질 뿐 process의 자원을 공유하기 때문에 memory의 사용이 더 효율적이라고 볼 수 있다.

즉, process는 기본적으로 자원을 공유하지 않기 때문에 독립적으로 실행되는 반면 thread는 process의 자원을 공유하기 때문에 협력과 통신에 유리하다는 특성이 있음을 알 수 있다.

단, thread는 process의 자원을 공유하는 만큼 multithread 환경에서는 하나의 thread에 문제가 생겼을 때, 다른 thread도 영향을 받을 수 있다.

Process 간에는 기본적으로 자원을 공유하지는 않으나 IPC(Inter-Process Communication)를 통해서 데이터를 공유하고 자원을 주고 받을 수 있다.
같은 컴퓨터 내의 process나 thread 간에 데이터를 주고 받는 것 또한 통신으로 간주한다.
또한 process 간에 서로 공유하는 memory 영역을 두어 데이터를 주고 받을 수 있는데 이 영역을 Shared Memory라고 한다.
이 외에도 Socket, Pipe 등을 통해 통신할 수 있으며, Process 간 데이터를 교환하는 것은 thread에 비하면 까다로운 것 뿐이지 불가능한 것은 아니다.

profile
Engineer가 되기 위하여

0개의 댓글