스레드, tcb, 사용자 수준 스레드 및 커널 수준 스레드, 멀티 프로그래밍, 멀티스레드?
2024. 1. 18. 16:55ㆍCS/운영체제
스레드
- 프로세스 안에서 실행되는 흐름의 단위로, stack영역을 제외한 나머지 영역을 공유하게 된다.
- stack을 스레드마다 독립적으로 할당하는 이유?
- stack은 함수 호출시, 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간을 의미한다.
- stack메모리 공간이 독립적이라는 것은, 독립적인 함수 호출이 가능하다는 것이고, 이것은 곧 독립적인 실행흐름을 추가되는 것을 의미한다.
- 따라서, 스레드의 정의에 따라 독립적인 실행흐름을 추가하기 위해서 최소 조건으로 독립된 stack을 할당한다.
- 장점
- 시스템의 처리량이 향상된다.
- 단점
- 여러개의 스레드를 이용하는 프로그램을 작성하는 경우에는 critical section을 잘 관리하여 여러 스레드가 함꼐 공유 자원을 이용하는데 오류가 없도록 해야한다.
스레드를 사용하는 이유?
- 멀티프로세스로 실행되는 작업을 멀티 스레드로 실행하게 되면, 프로세스를 생성하여 자원할당하는 과정도 줄어들고
- 멀티프로세스로 context-switching하는 것보다 멀티스레드로 context-switching하는 것이 오버헤드를 더 줄일 수 있다.
- 구글 docs를 이용하여 문서를 작성하는 경우
- 하나의 구글 docs를 프로세스라고 생각하고 문서에 참여하는 사용자를 스레드라고 해보자.
- 만약 멀티프로세스라고 하면, 사용자 한명당 하나의 구글 docs를 켜서 자신이 해야하는 임무를 마무리 하고 도출된 결과를 합쳐야할 것이고
- 멀티스레드라고하면, 하나의 구글 docs에서 여러 사람들이 분배받은 커서를 이용하여 자신의 임무를 마무리하면 된다.
- 참조블로그
TCB(Thread Control Block)
- 스레드를 관리하는 자료구조
- tcb는 스레드라이브러리에 의해 context-switching되는 스레드의 정보단위, pcb는 os스케줄러에 의해 context-switching되는 프로세스의 정보단위
- 멀티프로세스에서 pcb를 통해 context-switching되는 것보다 멀티스레드에서 tcb를 통해 context-switching되는 것이 오버헤드가 더 작다!
- pcb내 tcb를 수용하며, 커널은 이로써 스레드를 실현시킨다.
- 스레드가 하나 생성할때마다 pcb내에서 tcb가 확장된다.
- 아래의 그림은, 2개의 스레드가 추가 생성되어 총 3개의 스레드가 독립적으로 실행되는 중이다.
- tcb에 담기는 정보
- TID : 스레드 번호
- State : 스레드의 상태 (running, ready, blocked 등)
- PC : 스레드의 다음에 실행할 코드의 주소
- CPU 사용시간
- 레지스터값
- 우선순위
- 참고 블로그
사용자 수준 스레드 및 커널 수준 스레드
사용자 수준 스레드(user thread)
- 커널이 생성해주는게 아니라 응용 프로그램 내의 라이브러리에 의해서 구현 및 관리되는 스레드
- 커널 위에서 지원되기때문에 커널은 사용자 스레드를 인식하지 못한다.
- 장점
- 커널의 개입없이 스레드 생성, 스레드 교체, 스레드 동기화 등을 할 수 있기 때문에 관리가 빠르다.
- 단점
- 한 스레드가 i/o요청을 하면 대기 상태가 되어 blocked된다면, 다른 스레드도 함께 blocked된다.
- 현재 실행중인 프로세스에 여러 User Level Thread가 생성된 상태에서, 실행중인 스레드A가 IO요청으로 blocked되면, 현재 프로세스의 다른 스레드로 cpu가 넘어가는 것이 아니라, 아예 다른 프로세스로 스케줄링된다.
- Many-To-One모델 지원
- Kernel Level Thread가 하나이기 때문에, Many
커널 스레드(kernel thread)
- 운영체제의 의해 직접 지원되고 관리되는 스레드
- 스레드의 생성 및 스케줄링 등의 관리가 커널에서 이루어진다. (=커널이 tcb를 만들어서 관리한다.)
- 장점
- 한 스레드가 대기 상태로 들어가 blocked되어도 다른 스레드는 실행을 계속할 수 있다.
- 따라서, blocked가 빈번한 애플리케이션에서 사용하면 좋다.
- 단점
- 커널에서 모든 프로세스뿐만 아니라 스레드까지 생성관리 하기때문에 커널의 복잡도가 높아지고 그로 인한 오버헤드가 발생한다.
스레드 모델 종류
- Many-to-One
- 하나의 Kernel Thread가 다수의 User Thread를 처리하는 구조
- 이러한 구조는 User Thread를 처리하던 중 System Call에 의해 blocking이 된다면, 전체 프로세스가 막히는 병목현상이 일어나는 문제점을 갖고 있다.
- One-to-One
- User Thread당 Kernel Thread를 대응시켜 작업하는 구조
- Kernel Thread생성에 과도한 생성의 문제를 가져오게 된다.
- Many-to-Many
- 다수의 User Thread를 다수의 Kernel Thread가 처리하는 구조인데,
- Kernel Thread의 수 <= User Thread의 수
- 한 스레드가 I/O로 인한 blocked가 되어 대기상태로 들어갔을 경우, 커널이 다른 스레드의 수행을 스케줄링할 수 있다.
- Two-level-Model
- Many-to-Many Model과 One-to-One Model을 합친 구조
- 중요한 작업은 One-to-One구조를 통해 처리하고 Many-to-Many구조를 통해 처리함으로써
- 중요한 작업이 기다리는 현상을 줄일 수 있다.
- 참조 블로그
'CS > 운영체제' 카테고리의 다른 글
기아상태? 이를 위한 해결방법은? (0) | 2024.01.23 |
---|---|
Thread-Safe의 의미와 설계방법 (0) | 2024.01.19 |
프로세스끼리 협력하는 방법 (0) | 2024.01.17 |
프로세스 수행 상태 변화과정, 중기 스케줄러(=Swapper) (0) | 2024.01.17 |
PCB(프로세스 제어 블록), multi process? (0) | 2024.01.17 |