Thread
Thread의 정의
Thread란 process 내부에서 실행되는 여러 흐름의 단위를 말한다.
Thread의 주소 공간
Thread는 Process와 달리 Stack만을 고유하게 가지며, Code, Data, Heap 등을 공유한다.
Thread의 장점
1. Responsiveness
I/O interrupt에 의해 특정 실행이 Block되더라도, 다른 Thread가 Block된 작업과 무관한 다른 작업을 수행하여 사용자에게 빠른 응답을 제공한다.
2. Resource Sharing
Process를 새로 생성하면 각 프로세스마다 메모리 공간을 전부 새롭게 할당해주어야 한다.
Thread는 스택 영역을 제외한 데이터 공간을 공유하므로, 메모리 공간을 절약할 수 있다.
3. Economy
프로세스를 생성하거나, 스위칭하는 것 보다 Thread를 생성하고 스위칭하는 것이 훨씬 더 비용이 적게 든다.
일반적으로 각각 30배, 5배의 차이가 나는 것으로 알려져 있다.
4. Utilization of MP Architecture
Multi Processor 환경 즉, CPU에 코어가 여러개 존재하는 경우 멀티 Thread를 사용하면 작업을 병렬적으로 처리할 수 있어 효율적이다.
Thread의 Context Switching
Process에서는 Code, Data, Heap, Stack을 모두 독립적으로 가지고있기 때문에 Context Switching 과정에서 발생하는 Cost가 높다.
반면 Thread는 Stack을 제외한 나머지 영역을 모두 공유하기 때문에, Process간 Context Switching에 비해 cost가 낮다는 장점이 존재한다.
따라서 Multi Thread 환경은 Multi Process 환경보다 Cost를 덜 사용하면서 빠르게 작업을 수행할 수 있다.
다만 데이터 영역을 공유한다는 것은 Thread의 실행 순서에 따라 의도하지 않은 결과가 발생할 수 있다는 것을 의미한다.
따라서 이러한 공유 영역, 즉 Critical Section 에 대한 접근을 제한하는 알고리즘을 사용한다.
Thread의 경우도 Process처럼 Context Switching 시 Thread의 정보를 저장해두어야 한다.
그래야 제어권을 넘겨주었던 Thread가 제어권을 되찾았을 때, 정상적으로 동작할 수 있기 때문이다.
Process가 PCB에 정보를 저장하는 것과 유사하게, Thread는 TCB에 정보를 저장한다.
저장하는 정보는 `stack 데이터`, `register 데이터`, `thread metadata` 에 해당한다.
Thread의 Context Switching에는 Voluntary Context Switching과 Involuntary Context Switching이 존재한다.
Voluntary Context Switching은 thread가 thread_yield를 호출하여 다른 thread에게 제어권을 넘겨주는 것을 말하며
Involuntary Context Switching은 Interrupt나 exception, 또는 다른 더 높은 우선순위를 가진 thread에 의해 강제로 제어권을 빼앗기는 것을 의미한다.
Voluntary Context Switching은 아래 `Thread의 Lifecycle`에서 설명하는 State 이동 과정을 통해 처리되며,
Involuntary의 경우 다음과 같은 방식으로 처리된다.
1. 현재 실행중인 thread의 state를 저장한다.
2. kernel로 제어권이 넘어가며, interrupt handler나 exception handler가 작동된다.
3. 처리가 완료되면 다음으로 실행할 thread의 state를 복구한다.
Thread의 Lifecycle
`Ready State`의 경우 실행되기 위해 준비 된 thread들의 state에 해당한다.
CPU 실행 시간을 할당받을 준비가 되어 있지만 아직 실행되지는 않은 thread로, thread scheduler에 의해 Running Waiting Queue로 들어간다.
`Running State`의 경우, 스케줄러에 의해 running waiting queue에서 선택된 thread가 실행되고 있는 상태를 의미한다.
CPU에서 코드를 실행하며 작업을 수행한다.
이 때, `thread yield`에 의해 Context switching이 일어나면 Ready 상태로 들어가며, 다시 큐에서 대기하게 된다.
`Waiting State` 의 경우 자원을 얻기 위해 기다리고 있는 상태를 의미한다.
thread가 `thread_join` 함수를 호출하면 Waiting State로 변하는데, thread_join 함수의 경우 매개변수로 넣어준 thread가 종료될 때 까지 대기하는 함수이다.
보통 parent thread가 child thread를 호출하여 제어권을 넘겨주고 대기하는 상태로 동작한다.
`Exit` State는 Thread가 실행을 모두 마치고 종료되면 도달하는 State이다.
'OS' 카테고리의 다른 글
[OS] 8. Virtual Memory (0) | 2023.10.03 |
---|---|
[OS] 7. Address Translation (0) | 2023.10.03 |
[OS] 4. Process Scheduling (0) | 2023.10.02 |
[OS] 6.Deadlock (0) | 2023.09.30 |
[OS] 5. Synchronization(동기화) (0) | 2023.09.21 |