Be realist
4. 스레드, 멀티스레드 프로그래밍 본문
스레드는 프로세스와 마찬가지로 CPU의 작업 단위. (경량 프로세스 라고도 불린다)
스레드는 자원의 관리보다는 프로그램의 하나의 실행 흐름으로서 CPU가 실행되기 위해 스케줄되어야 하는 개체이다.
스레드 식별자, 프로그램 카운터, 레지스터 집합, 스택만을 가지며,
텍스트 부분, 데이터 부분, 다른 운영체제 자원은 같은 프로세스에 속한 다른 스레드와 공유한다.
하나의 프로세스에서 병행 수행되는 스레드 : 주소 공간과 같은 자원을 서로 공유
하나의 컴퓨터에서 병행 수행되는 프로세스 : 물리적 메모리, 디스크 등을 공유
모든 프로그램을 다중 스레드를 사용하도록 바꾼다고 하여 성능이 향상되는 것은 아니다.
스레드의 도입으로 한 응용프로그램에서 여러 가지 일을 동시에 수행할 수 있다. 각 일을 처리하기 위해 자식프로세스를 생성하며 처리할 수 도 있지만 프로세스의 생성은 비용이 크며, 자원 공유가 쉽지 않다. —> 비용을 줄이고 자원 공유를 쉽게 하기 위해 도입된 개념이 스레드이다.
특성 : 프로세스와 마찬가지로 같은 상태 변화를 한다.
응답성(responsiveness) : 다중 스레드 프로그램은 일부가 블록되어도 나머지 부분은 계속 실행될 수 있다.
자원 공유(resource sharing) : 같은 프로세스의 스레드는 메모리와 그 밖의 프로세스의 자원을 공유한다. 스레드는 같은 주소공간을 공유하므로 스레드 간 통신이 더 용이하다.
경제성(economy) : 프로세스마다 메모리와 자원을 할당하면 많은 오버헤드가 발생한다.
- 사용자 스레드
사용자 공간에서 스레드 라이브러리를 통해 제공
이 라이브러리는 커널의 지원 없이 스레드의 생성, 스케줄링 관리를 제공한다. (커널의 관여는 없다!)
—> 모드 변경이 필요없어 스레드의 빠른 생성과 관리가 가능해진다.
자체적인 스케줄링 알고리즘을 가질 수 있다.
- 커널 스레드
운영체제가 직접 지원한다
커널이 스레드의 생성, 스케줄링, 관리를 담당한다.
모드 변경이 필요하기 때문에 스레드의 생성과 관리가 사용자 스레드보다 느리다.
하나의 스레드가 블록되어도 같은 프로세스에 있는 다른 스레드를 계속 실행할 수 있다.
<다중 스레드 모델>
보통 운영체제는 사용자 스레드와 커널 스레드 모두를 제공한다. 커널은 커널스레드의 존재만 인식하며, 커널은 커널 스레드를 스케줄하여 실행한다.
- 다대일 모델
여러 사용자 스레드를 하나의 커널 스레드로 매핑! —> 스레드의 관리가 사용자 모드에서 이루어지므로 처리가 빠르다.
대신, 하나의 스레드가 블록되면 전체 프로세스가 블록된다. 또한, 다중 프로세스에서 다중 스레드가 동시에 수행될 수 없다 (뭐지?)
- 일대일 모델
각 사용자 스레드는 하나의 커널 스레드로 매핑된다. —> 하나의 스레드가 블록되어도 나머지 스레드는 계속 실행된다. 또한 다중 프로세서에서 동시에 수행될 수 있다.
대신, 비용이 비싸서 보통 스레드의 수를 제한한다.
- 다대다 모델
여러 사용자 스레드를 동일 수 또는 그 이하의 수의 커널 스레드로 매핑한다. —> 비용이 일대일 모델보다 저렴하며 다대일 모델과 달리 스레드의 동시 수행이 가능하다.
운영체제에 따라 fork는 프로세스의 모든 스레드를 복사하거나, 하나의 스레드만 복사한다. exec는 전체 프로세스가 새 프로그램으로 교체된다!
스레드 취소에는 목표 스레드가 바로 종료되는 비동기식 취소와 종료 조건을 주기적으로 검사한 뒤 종료되는 지연된 취소가 있다.
비동기식 취소에서는 스레드에게 할당된 자원이 모두 자동으로 해제되지 않을 수 있다.
신호처리와 운영체제별 스레드 종류 추가정리!
'Operating System' 카테고리의 다른 글
6. CPU 스케줄링 (0) | 2018.04.16 |
---|---|
5. 프로세스 동기화 (0) | 2018.04.16 |
3. 프로세스 (0) | 2018.04.16 |
2. 컴퓨터 시스템 구조 (0) | 2018.04.16 |
1. 운영체제란? (0) | 2018.04.16 |