14_스레드 개념과 다중 스레드
스레드(thread)는 CPU 이용의 기본 단위다. 스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택 으로 구성 된다. 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 열린 파일이나 신호와 같은 운영체제 자원들을 공유 한다.
프로세스에 하나의 제어 모델이 있으면 단일 스레드 이며, 프로세스가 다수의 제어 스레드를 가진다면 다중 스레드 모델이다.
[다중 스레드의 장점]
다중 스레드 프로그래밍을 장점을 크게 네 가지로 분류하면 다음과 같다.
- 응답성(Responsivness) : 응용 프로그램의 일부분이 봉쇄 되거나 긴 작업을 수행하는 경우에도 프로그램의 수행이 계속 되는 것을 허용 함으로써 사용자에 대한 응답성을 증가 시킨다.
- 자원 공유(Resource Sharing) : 스레드는 자동적으로 그들이 속한 프로세스의 자원들과 메모리를 공유 한다. 코드와 자료 공유의 이점은 한 응용 프로그램이 같은 주소 공간 내에 여러 개의 다른 작업을 하는 스레드를 가질 수 있다.
- 경제성(Economy) : 프로세스 생성을 위해 메모리와 자원을 할당하는 것은 비용이 많이 든다. 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에 스레드를 생성하고 문맥맥 교환하는 것 보다 더 경제적이다.
- 다중 처리기 구조의 활용 (Utilization of multiprocessor architectures) : 다중 스레드의 이점은 다중 처리기 구조에서 더욱 증가 된다. 각각의 스레드가 다른 처리기에서 병렬로 수행 될 수 있기 떄문이다. 단일 스레드는 CPU가 많다고 하더라도 단지 한 CPU에서만 실행된다. 다중 CPU에서 다중 쓰레딩을 하면 병렬성이 증가 된다.
스레드를 위한 지원은 사용자 스레드(user thread)와 커널 스레드(kernel thread)가 있다
- 사용자 스레드 : 커널 위에서 지원되며 커널의 지원 없이 관리 된다.
- 커널 스레드 : 운영체제에 의해 직접 지원된고 관리 되며 대부분의 운영체제들은 커널 스레드를 지원 한다.
[다중 스레드 모델]
다대일 모델(Many-To-One Model) : 다대일 모델은 많은 사용자 수준 스레드를 하나의 커널 스레드로 매핑 한다. 스레드 관리는 사용자 공간의 스레드 라이브러리에 의해 행해 진다. 스레드 관리에는 효유율적이지만 한 스레드가 긴 작업을 실행 할 경우 나머지 작업들은 대기하게 된다. 다중 CPU환경에서도 병렬로 작업을 처리 할 수가 없다.
일대일 모델(One-To-One Model) : 일대일 모델은 각 사용자 스레드를 각각 하나의 커널 스레드로 매핑 한다. 이 모델은 하나의 스레드가 긴 작업을 처리하는 동안에도 다른 스레드가 실행 될 수 있기 때문에 다대일 모델보다 더 많은 병렬성을 제공 한다. 이 모델의 단점은 사용ㅈ 수준 스레드를 생성 할 때 그에 따른 커널 스레드를 생성해야 한다는 것이다. 커널 스레드를 생성하는 오버헤드로 응용프로그램의 성능저하가 발생 할 수도 있다.
다대다 모델(Many-To-Many Model) : 다대다 모델은 여러 개의 사용자 스레드를 그보다 작거나 같은 수의 커널 스레드로 다중화 한다. 커널 스레드의 수는 응용 프로그램이나 특정 기계에 따라 결정 된다. 응용프로그램은 단일 처리기보다 다중 처리기에 더 많은 커널 스레드를 할당 받을 수 있다. 개발자는 필요한 만큼 많은 사용자 수준 스레드를 생성 할 수 있으며 그에 상응하는 커널 스레드가 다중 처리기에서 병렬로 수행 된다. 스레드가 긴 작업등의 호출을 발생 시켰을 때 커널이 다른 스레드의 수행을 스케줄링 한다.
다대다 모델의 변형은 많은 사용자 스레드를 적거나 같은 수의 커널 스레드로 다중화 시키는 것을 유지하지만 하나의 사용자 스레드가 하나의 커널 스레드에 종속되도록 허용 한다. 이 변형은 두 수준 모델(Two-Level Model)이라고 불리며 HP-UX, UNiX Tru64 모델이 지원 하였다.
[참고자료]
Operating System Concept / 홍릉과학출판사
'SW Engineering > OS Concept' 카테고리의 다른 글
16_스레드 이슈(Threading Issues) (0) | 2015.07.16 |
---|---|
15_스레드 라이브러리 (0) | 2015.07.16 |
13_클라이언트 서버 환경에서 통신 (0) | 2015.07.16 |
12_프로세스간 통신 (0) | 2015.07.16 |
11_프로세스에 대한 연산 (0) | 2015.07.16 |