[운영체제] 멀티쓰레드 ( Multi-Thread )
쓰레드란 무엇인가?
- 쓰레드(Thread)란 실행 중인 프로그램인 프로세스(Process)의 실행 단위이다.
- 하나의 프로세스에는 여러 개의 쓰레드가 존재할 수 있다.
- 쓰레드는 다른 쓰레드와 [코드, 데이터, 기타 자원] 등을 공유한다.
- 사용자 레벨 스레드
동일한 메모리 영역에서 스레드가 생성 및 관리가 되므로, 속도가 빠릅니다.
커널에서 내부 쓰레드에 대해서 인지하지 못하여 해당 프로세를 제거하여, 여러 개의 쓰레드가 한 번에 종료 될 수 있습니다.
- 커널 레벨 스레드
운영체제가 지원하는 스레드 기능을 제공하고, 하나가 종료되도 다른 스레드에 영향을 미치지 않습니다.
예시
- 가지마 익스플로어
과거에 대부분 인터넷을 "익스플로어" 로 작업 했을 때, 이런 끔찍한 이미지를 보신적이 있나요?
기다려도 안되고, 결국 "취소"를 누르면 꺼져버리죠. 그 이유는 인터넷 익스플로어는 "멀티 스레드" 방식으로 운영이 되기 때문입니다. 그렇기 때문에 공유 자원 중 어떤 한 곳에서 문제가 발생해도 꺼진다는 단점이 있죠!
반면에, 자원을 공유 하기 때문에 "멀티 프로세스" 보다는 성능 측면에서 우위에 있을 수 있습니다.
멀티 스레드의 장점
- 응답성
멀티스레드를 사용하면, 다른 일부가 잠시 대기를 해야하거나, 시간이 오래걸리는 작업을 할 때도 다른 작업들이 지속적으로 운영되도록 합니다.
- 자원 공유
스레드는 자원과 메모리를 공유합니다.
- 경제성
자원을 공유 한다는 점 때문에, 문맥 교환 비용측면으로 볼 때 경제적이라고 말할 수 있습니다.
멀티 스레드 모델링
1. Many-to-One
- 여러 개의 유저 스레드와 1개의 커널 스레드로 구성된 모델입니다.
- 유저 사이드에 있는 라이브러리를 통해, 스레드의 관리가 이루어집니다.
- 하나의 유저 스레드만이 커널 스레드에 접근할 수 있습니다. 고로, 하나의 스레드가 blocking 되면, 시스템 전체가 커널 스레드에 접근할 수 없어서 죽게 됩니다.
2. One-to-One
- Many-to-One이 가지는 "병목 현상" 으로 인한 Down을 막기 위해 출시된 모델입니다.
- 유저 스레드와 커널 스레드가 1대1 매핑이 되어야 하기 때문에 "오버헤드" 가 발생합니다.
* 여기서 잠깐
병행성(Concurrency) 이란 쉽게 말해서, 한 번에 많은 것들을 처리 할 수 있는 것을 의미합니다.
여기서 주목 해야하는 지점은 "것" 인데요. 속도가 빨라서, 많은 업무를 처리할 수 있는 개념이 아닌 일정 양의 작업 => 다른 작업 수행을 반복하면서 여러 작업을 골고루 수행하는 정도로 생각 하시면 됩니다.
너무나도 빠르게 진행이 되어서, 사용자 입장에서는 "동시에 처리되는 것 처럼" 보이는거죠.
3. Many-to-Many
- one-one 모델에서 발생 할 수 있는 오버헤드를 줄이기 위하여 착안한 모델입니다.
4. Two-level Model
Many-to-Many 모델를 변화시켜서 비슷한 스레드를 가지고 더 많은 효용을 내기 위해 만들어진 모델입니다.