Difference Between a Process and a Thread
Processes and Threads
- Thread란, Process 내부의 실행단위입니다.
- 실행단위라는 것은 CPU가 수행할 instruction의 group을 의미합니다.
- 즉, Thread와 Process는 별개의 것이 아닙니다.
프로세스를 실행한다는 것은 내부에 있는 thread를 실행한다는 것과 같은 의미입니다.
프로세스 내부에는 적어도 1개의 thread를 가지고 있습니다.
필요한 경우에는 OS에게 thread를 요청할 수도 있습니다.
- Linux 운영체제에서는 thread를 lightweight process라고 부르기도 합니다.
Resource of Process and Thread
- Process는 계속 봤다시피 code・data・stack으로 구성되어있습니다.
- Thread는 Stack과 register값을 저장하기 위한 thread control block을 가집니다.
TSS vs. TCB
TSS는 특수목적, 하드웨어 수준의 task 전환을 수행합니다.
TCB는 프로세스 내부 thread의 정보를 저장합니다.
- Single Thread의 경우에는 지금까지 봐왔던 PCB의 구조와 동일합니다.
- 반면, Multithreaded process는 조금 다릅니다.
thread들은 code・data 영역은 공유합니다.
code 부분은 모든 thread에게 동일하므로 굳이 따로 가질 필요가 없고,
data 영역은 global variable을 저장하는 영역이기 때문에, 굳이 따로 가질 필요가 없습니다.
각 thread마다 register, stack을 저장하는 영역인 TCB를 1개씩 가집니다.
process마다 1개의 TCB가 있는 것과 같습니다.
그래서 별도의 thread를 생성할 때, TCB영역만 새로 만들어주면 됩니다.
같은 thread에서 작업하는 것들은 stack영역에 저장을 하지만,
thread switch가 일어나는 경우 register값들을 저장한 후에 processor를 넘겨줍니다.
code・data・stack・file?
앞에서 언급은 하지 않았지만, file 영역도 실제로 process 내부에 존재합니다.
기본적으로 3개의 파일이 OS에 의해서 할당됩니다.
여기서 3가지 파일은 I/O를 담당하는 장치파일입니다.
stdin, stdout, stderr
Benefits of Threads
- process를 생성하는 것과 다르게, 새로운 thread를 만드는 것은 TCB영역만 생성하므로 시간이 덜 걸립니다.
- terminate하는 시간 또한 프로세스보다 적게 걸립니다.
- context switch보다 thread switch가 더 빠릅니다.
state, accounting information 등의 부분들을 update하는 context switch와 달리 thread switch는 register, stack에 관련된 것만 update하면 됩니다.
- IPC를 위한 message passing, shared memory 방식보다 thread끼리 정보를 공유하는 것이 더 빠른데, 그 이유는 data영역을 이용하면 되기 때문입니다.
Use of Multithreads
- OS는 하나의 프로세스에서 하나 이상의 thread를 지원합니다.
이 때, 프로세스를 thread가 실행될 수 있는 환경을 제공하는 tool로 간주합니다.
즉, process = 실행되는 데에 필요한 컴퓨팅 자원들의 집합체로 여깁니다.
- multiple threads 방식 또한 concurrent한 일처리를 지원합니다.
- multiple threads 방식의 프로세스 여러 개가 돌아갈 때,
- 서로 다른 프로세스에 존재하는 thread끼리 소통하는 것은 IPC의 영역이 됩니다.
Multithreading
- 하나의 프로세서에서 여러 thread를 concurrent하게 실행할 수 있으며,
- 이 때, 하나 thread가 block되어도 다른 thread를 실행할 수 있습니다.
즉, process 자체가 block되는 것이 아니라, thread만 block됩니다.
Kernel-Level threads에만 해당되는 특징입니다.
아래에서 언급하겠지만, User-Level threads는 process가 block 당할 수 있습니다.
- 참고로, multiprocessing 방식에서는
thread A - CPU1
thread B - CPU2
이런 식으로 processor를 배정할 수 있습니다.
다음과 같은 프로그램은 concurrent programming이 아닙니다.
(one process, single thread)
main() {
int data, transforned_data;
...
input_handling(data);
transformed_data = transforming(data);
output_handling(transformed_data);
...
}
input_handling(int a) { ... }
transforming(int a) { ... }
output_handling(int a) { ... }
쉬운 프로그래밍이지만, I/O Event 하나로 프로세스가 block 당할 수 있다는 등의 단점이 커서 좋은 프로그래밍은 아닙니다.
Processing Concurrent Works
- Multiple processes
IPC를 이용한 정보 교환
- Multiple threads
global variable(data segment)를 이용한 정보 교환
이 둘의 효과는 똑같지만, 자원, 실행속도 측면에서는 Multiple thread가 훨씬 이득입니다.
User-Level Threads
지금까지 봤던 thread들은 kernel-level thread라고 생각하면 됩니다.
- User-Level Threads는 쉽게 설명해서 thread의 존재를 kernel은 인지하지 못하는 것입니다.
kernel이 바라보는 process는 single-threaded process입니다.
- User-Level Threads에는 kernel의 개입이 일체 없습니다.
- 그래서 thread 하나가 block되면 kernel 입장에서는 thread = process가 block된 것처럼 보입니다. 이러한 이유로 concurrent한 실행은 불가능합니다.
User-Level Thread의 TCB영역은?
kernel-level thread는 kernel이 직접 TCB영역을 만들어주었습니다.
user-level의 경우 kernel이 thread의 생성을 인지하지 못해 kernel이 TCB영역을 만들어 줄 수 없습니다.
이는 user-level thread를 제공하는 library에서 관리를 해주게 됩니다.
Kernel-Level Threads
계속 봐왔던 thread와 동일합니다.
- kernel이 직접 thread를 관리하는 형태입니다.
- User-Level threads와 다르게, thread 하나가 block 되어도 kernel 입장에서는 process 내에 아직 thread가 남아있는 것으로, process 자체를 block 하지 않습니다.
- concurrent한 실행이 가능합니다.
Advantages vs. Disadvantages of User-Level Threads
Advantages
- Kernel-level thread는 thread 생성 시(system call) mode change가 필요하기 때문에 overhead가 user-level thread보다 큽니다.
- 반면 user-level thread는 library를 이용해 thread를 생성하기 때문에 overhead가 비교적 작습니다.
- 어느 OS에서든 실행할 수 있다는 장점이 있습니다.
과거에는 thread 생성을 지원하지 않는 OS가 존재했는데, 현대에는 모두 지원을 하므로 사실상 의미가 있는 장점은 아닙니다.
- scheduling에 있어서 사용자 임의로 scheduling을 할 수 있습니다.
OS scheduling은 user가 건드릴 수 없었습니다.
user-level thread는 kernel이 인식하지 못하므로 OS scheduling 영역 밖으로 간주되기 때문에 user가 library를 이용해 scheduling을 할 수 있습니다.
Disadvantages
- concurrent한 실행을 할 수 없습니다.
Running time

- Hardware의 CPU 속도는 동일합니다.
mode에 따라서 달라지는 것이 아님!
- mode change에는 instruction이 존재하기 때문에 이 부분에서 시간이 많이 걸립니다.
kernel-level threads, processes의 경우에 해당
- kernel-level thread의 overhead가 큰 이유는 thread를 만들고 바로 user mode로 가는 것이 아니라 운영체제로서 해야 할 일들을 다 마치고 가야하기 때문에 시간이 걸리는 것입니다.
Linux Thread
- 앞서 언급했듯이 Linux의 thread는 lightweight process라고 부르기도 합니다.
- clone()이라는 system call로써 생성이 되고, task_struct를 만들어줍니다.
- fork()와 비슷한데, code・data영역은 공유를 한다는 점에서 차이가 있습니다.