728x90
반응형
- Lightweight Process라고도 불리며, CPU의 가장 작은 Unit이다.
- Thread ID
- PC
- Register Set
- Stack Space
- 하나의 Thread는 다른 Thread들과
- Code Section
- Data Section
- Operating-System Resources
- 를 공유함
- Process 안에 오직 하나의 Thread만 가지고 있다면 heavyweight process라고 함
- 그림과 같이 Thread의 개수로 구분
- Process보다 작은 단위임
- 장점 : 하나의 쓰레드가 Block or Waiting 상태가 된다하더라도 같은 작업에서 파생된 다른 작업은 할 수 있다.
- 같은 작업에서 파생된 여러 쓰레드가 서로 돕다. 성능 향상
- 하나의 Thread가 Block당해도 다른 Thread가 작업을 수행할 수 있기 때문에 Process보다 더 빠른 반응을 가질 수 있다.
- 자원을 공유할 수 있다
- 따라서 경제적이다.
- 하나의 CPU에 Process 하나가 작업을 수행하다 Block 당하면 아무것도 할 수 없지만 하나의 CPU, 하나의 Process가 4개의 Thread로 나뉘어 작업을 수행한다면 하나의 Thread가 Block당해도 다른 Thread는 작업을 수행할 수 있기 때문에 더욱 좋은 성능을 낼 수 있다.
- Multiple Process vs Multiple Thread
- Process는 모두 독립적, Thread는 한 Process 내 여러 작업이므로 독립적x
- 구성 요소 Stack Pointer vs Stack Space
- 주소 공간 : Process는 주소 공간이 모두 다르지만 Thread는 하나의 같은 공간 (Context Switch 작업이 필요없음)
- Process는 서로 다른 사용자로부터 만들어짐 vs Thread는 오직 한 유저로부터 생성
- 밑에는 후에
- Thread는 3가지 종류로 나뉨
- Kernel-Supported : 커널 단위로 운영체제에서 제공 및 관리
- User-level : User 레벨에서 쓰레드 라이브러리 사용하여 생성 및 관리
- Hybrid : 두 가지 유형을 모두 지원
- 맨 윗단은 Process, 그 아래는 User Level, 그 아래는 Kernel Level.
- CPU 입장에서는 Kernel 단만 볼 수 있음
- 쓰레드 라이브러리에서 지원하여 관리
- 커널에서 지원하는 Thread
- User Level Thread는 유저 레벨에서 모두 지원하기 때문에 Kernel과 상관 없음. System Call도 없음 그래서 굉장히 빠름
- Kernel Level은 Kernel에서 switching해야하기 때문에 상대적으로 무거움. 각각의 Thread가 독립적으로 CPU scheduled관리 받음
User-Level은 하나의 큰 Process를 임의로 자르는 것. 그리고 Kernel-Level의 Thread에게 작업을 할당함. Kernel-Level의 Thread에 작업이 할당되면 그 아래단에 있는 CPU가 Kernel's Thread를 볼 수 있기 때문에 이를 Scheduling하여 작업을 처리하는 방식이다.
- Thread는 3가지 모델로 나뉠 수 있다.
- to 기준으로 앞은 User-Level
- to 기준으로 뒤는 Kernel-Level
- User-Level : Many
- Kernel-Level : Kernel
간단히 비유하자면 하나의 큰 Process를 여러 User가 말로 작업을 분해한다. 그리고 실제로 작업을 수행하는 하나의 Kernel이 작업을 수행하기 위해 할당된다. 근데 Kernel 하나가 Block 당하게 되면 CPU는 작업 처리를 위해 Scheduling하는 데에 제약이 생긴다. 그래서 다른 방안이 나오게 된다.
- 하나의 Kernel Thread만 있을 때 CPU가 Scheduling하는 데에 발생했던 문제를 해결할 수 있다.
- User-Level은 자원을 사용하지 않고 비유적으로 표현하자면 말로만 생성하라 이런 명령을 내리는 것이기 때문에 몇 개를 생성해도 성능에 문제가 생기지 않는다.
- 하지만 1:1 매핑을 위해 Kernel-Level에 100개를 생성하면 이는 성능에 문제가 생기게 된다.
- 이러한 문제점이 발생하였다.
- 미리 성능 수준에 맞는 적정 개수의 Kernel을 생성한다.
- 위에서 발생한 User Thread개수만큼 Kernel Thread를 생성해야 하는 문제점을 해결할 수 있다.
- 위 문제를 해결하였지만 Kernel Thread에 할당해야 하는 우선순위 할당에 대한 문제점이 발생한다.
- 그래서 등장한 모델이 위 모델이다.
- 중요한 것은 먼저 One-To-One으로 Mapping 해주고 나머지는 Many-To-Many로 매핑해준다.
- Thread cancellation : 정상/비정상 종료
- Signal handling : interrupt로 생각
- Thread pools : 적정 개수의 Thread를 생성해낼 수 있는 Pool
- Thread specific data : Thread 자기 자신의 데이터를 저장
- Schedular activation
- Process에서 배웠던 내용
- fork()라는 System Call을 이용해서 Parent Process가 Child Process를 생성시킨다.
- Thread에서 fork() issue는 Thread는 Process 내 여러 Thread로 존재한다. 이럴 때 하나의 Thread에 대해 fork()를 수행하면 단독적으로 해당 Thread와 같은 Thread만 생성해낼지, 같은 Process 내 모든 Thread를 생성해낼지가 issue
- fork() System Call을 한 Thread가 호출한다. 그 뒤에 exec()이라는 System Call이 호출되면 하나의 Thread만 복제한다. 하지만 exec()이 호출되지 않으면 모든 Thread를 복제한다.
- 비동기 상태에서 쓰레드를 바로 날리는 것(비정상 종료) : Asynchronous cancellation
- 이것에 대한 문제점으로 작업에 대한 결과물이 날아감. 또한, 전역 변수 값을 바꾸는 과정에서 문제가 생기면(Critical Section) Defferd cancellation 즉, 지연시키게 된다.
- Process들을 실행시키는 과정에서 여러 interrput, signal 발생
- signal을 처리하려면
- signal이 우선 발생해야하고
- 그것을 process에 전달해주어야한다.
- 그리고 그것에 대해 handled(처리)한다.
[어떤 Thread에게 전달할지 Options]
- 처리하는 Thread에게 직접 전달
- Process 내부에 모든 Thread에게 전달
- Process 내부에 특정 thread한테만 전달
- 특정 thread에게만 전달
- 특정 작업들을 수행할 수 있는 Thread를 하나의 Pool에 모아두는 곳
- 장점
- 이미 만들어진 것을 할당만 하면 되기 때문에 좀 더 빠르다
- 유지기능
- Thread마다 각각의 별도 데이터를 가질 수 있다.
- 고유 데이터를 가질 수 있는 Thread를 분리시켰기 때문에 성능 측면에서 유용할 수 있다.
- communication method : upcall
- 아래 두 그림(M:M or Two-level) 모두 User level ↔ Kernel level 사이 Thread할당을 위해 통신이 필요하다. 그것에 대한 것이 UpCalls
- CPU-bound : CPU 기반이기 때문에 CPU 성능에 영향을 받는다. 즉, Kernel-Level Thread가 IO-bound보다 상대적으로 많이 필요
- LWP : User-Level ↔ Kernel-Level 사이 Communication을 위해 특수 Processor를 이용한다.
- Thread library 이름
- 쓰레드 생성과 동기화 작업에 이용
- UNIX OS 대부분 사용
- Linux에서 Thread -> Task
- fork() -> clone()
- 전 5가지 상태였는데 Java Thread States는 4가지 단계
728x90
반응형
'CS > OS' 카테고리의 다른 글
[OS] CPU Scheduling (2) - CPU 스케줄링 (0) | 2023.04.14 |
---|---|
[OS] CPU Scheduling (1) - CPU 스케줄링 (0) | 2023.04.14 |
[OS] Process (2) : 프로세스 (0) | 2023.04.04 |
[OS] Process (1) : 프로세스 (0) | 2023.03.28 |
[OS] - OS Structure(2) : System Program, Virtual Machine (0) | 2023.03.21 |