Threads( Light Weight Process )
⇒ CPU 이용의 가장 작은 단위.
- Thread ID
- Program Counter
- Register
- Stack Space
등으로 구성되어있다.
Peer Threads 와는
- Code Section (명령어)
- Data Section (명령어 실행에 필요한 정보)
- OS Resources
등을 공유한다.
🛑 하나의 Process에 하나의 Thread만 존재할 때 Heavy Weight Process라고 한다.
Multithread에서는 한 Thread가 Blocked 되어도 다른 Thread가 Run할 수 있다.
→ 처리량과 성능이 증가한다. ⬆️ ⬆️ ⬆️ ⬆️ ⬆️ ⬆️ ⬆️ ⬆️
Thread의 장점
- Responsiveness : 반응시간이 좋아진다.
- Resource Sharing ⇒ Economy : 자원을 공유하여 경제적이다.
- CPU가 여러개인 구조 : Multi-Processor구조에서 효율적이다. 각각의 Processor에 Thread가 mapping된다.
User-level Thread, Kernel-level Thread
- Kernel-level Thread : 운영체제가 관리하는 Threads.
- User-level Thread : Kernel위에서 동작하는 Threads.
- Hybrid : Kernel + User level → 요즘 나오는 Thread들은 Hybrid.
Kernel-level Threads 수가 User-level Threads 수에 비에 적다. Kernel < User
CPU는 Kernel-level Threads만 처리할 수 있다.
User-level Threads들은 System Call을 호출하지 않아 매우 빠르다.
→ Kernel은 Process단위로 CPU Scheduling을 하므로 Thread입장에서는 Unfair할 수 있다.
Multithreading Models
1. Many to One Models
- User Thread는 많은데 Kernel Thread는 1개.( 다 : 일 )
- User Thread간 경합이 발생한다.
- Kernel Thread가 Block되면 문제가 발생한다.
- Ex. Solaris Green Threads / CU Portable Threads
2. One to One Models
- User Thread 한개에 Kernel Thread 한개 ( 일 : 일 )
- User Thread의 갯수와 같은 Kernel Thread를 만들어낼 수 없다.
- Ex. Windows NT/XP/2000, Linux
3. Many to Many Models
- User Thread 여러개, Kernel Thread 여러개. ( 다 : 다 )
- 충분한 수의 Kernel Thread 생성
- 단점 : 중요한 Thread가 경합에서 밀려 Starvation이 일어날 수 있다.
4. Two-level Models
- M : M + 1 : 1
- 중요한 일은 1 : 1 모델에서 처리를 한다.
Threading Issue
fork()와 exec()
fork() : Parent Process가 Child Process를 생성한다.
⇒ 호출한 Thread만 복사할 것이냐 or 모든 thread를 복사할 것이냐?
- fork() + exec() ⇒ 호출한 Thread만 복사한다.
- fork() ⇒ 모든 Thread를 복사한다.
Thread Cancellation
정상적으로 종료되기 전에 Thread를 종료시키는 것.
- Asynchronous Cancellation ⇒ 종료 시 즉시 종료. 🖐️
- Deferred Cancellation ⇒ Check Point(Cancellation Point)를 만들고 그 Point마다 Cancel할지 말지를 결정한다. Cancellation Point에서만 종료가 가능하다.
Signal Handling
이벤트 발생 시 누구에게 알려줄지?!. Process Signals / Interrupts와 유사한 개념
Signal Handling의 순서 : Signal 생성 → Signal 전달 → Signal 처리
- 누구한테 알려줄 것이냐? 여러 Option이 있다.
- 관련있는 모든 Threads
- 모든 Threads
- 특정 Threads(전담반)
- 특정 Thread 한 놈.
Thread Pools
특정 갯수의 Thread를 미리 생성하고, 일을 대기하는 것.
장점
- Thread의 생성, 파괴가 없어 처리속도가 증가한다.
- 프로그램의 Thread가 Pool의 Size에 제한된다.
Thread Specific Data
Thread가 일에 필요한 Data를 전달해주어야 한다.
Scheduler Activation
M:M or Two-level Model은 User Thread, Kernel Thread 간에 통신이 필요하다.
Upcall : Kernel과 User Thread 사이의 통신
Upcall을 통해서 적절한 Kernel Thread의 갯수를 정한다.
- CPU-Bound Task = Thread의 갯수 ⬆️
- IO-Bound Task = Thread의 갯수 ⬇️
Light Weight Process(LWP) : Kernel과 User - level 간 Virtual Processor, Kernel Thread와 User Thread를 Mapping해주는 역할을 한다.
여러가지 Thread종류
Pthreads
Thread Creation, Synchronization에 대한 POSIX Standard API.
UNIX의 기반이 되는 Thread.
Windows XP Threads
- One to One Model 사용
- 각각의 Thread에 Thread ID, Register Set이 있고, User Thread와 Kernel Thread의 Stack을 분리, Private Data Storage Area을 사용한다.
- 저 각각은 Thread의 Context(구성요소)로 알려져있다.
Linux Threads
- task라는 단위 사용
- clone()으로 Thread 생성
- clone()을 통해 만들어진 애들은 같은 주소공간을 공유
Java Threads
- JVM으로 관리되는 Threads
- Thread 클래스를 상속받아 사용한다.
'Computer Science > OS' 카테고리의 다른 글
CPU Scheduling (1) (0) | 2023.11.27 |
---|---|
4강. 연습문제 (1) | 2023.11.27 |
3강 연습문제 (2) | 2023.11.25 |
Processes(2) (2) | 2023.11.24 |
Processes(1) (0) | 2023.11.24 |