운영체제 CH3.프로세스와 스레드
03. 스레드의 개념과 상태 변화
1. 스레드의 개념
스레드는 프로세의 두 가지 특성인 자원과 제어 중 제어만 분리해낸 실행 단위이다.
프로세스 하나 당 스레드 한 개 이상으로 나눌 수 있다. 프로세스의 직접 실행 정보를 제외하고 프로세스 관리 정보를 공유한다.
스레드는 보통 다른 프로시저의 호출이나 다른 실행을 기록하여 별도의 스택이 필요하다.
프로그램 카운터는 독립적이기 때문에 프로세스의 스레드들은 동시에 코드의 동일한 부분이나 다른 부분을 실행 가능.
관련 자원과 함께 메모리를 공유할 수 있어서 손상된 데이터나 스레드의 이상 동작을 고려해야 한다.
경량 프로세스 : 프로세스의 속성 중 일부만 포함하는 스레드
중량 프로세스 : 프로세스 하나당 스레드 하나인 전통적 스레드
같은 프로세스의 스레드는 같은 주소 공간을 공유한다.
- 하나의 프로세스에 존재하는 스레드들은 공통의 목적을 달성하기 위해 병렬로 수행된다.
병렬 수행의 이점으로는
1. 사용자 응답성 증가
2. 메모리와 프로세스 자원 공유 가능
3. 경제성이 좋아짐
4. 다중 처리(멀티 프로세싱)로 효율과 성능 향상
2. 단일 스레드와 다중(멀티) 스레드
단일 스레드 : 스레드의 용어가 생기기 전이라 의미가 불확실하다. 프로세스 하나 당 스레드 하나
다중 스레드 : 프로그램 하나를 여러 실행 단위로 나눠 실행한다는 측면에서 다중 처리(멀티 프로세싱)와 의미 비스
프로세스 관리 측면에서 단일 스레드와 다중 스레드를 관찰하면
스레드들은 같은 주소 공간에 있고, 동일 데이터에 접근하며 , 해당 프로세스의 자원을 공유한다. 따라서 하나의 스레드가 전역 데이터를 변경하면 다른 스레드도 그 데이터에 접근하여 변경 사항을 확인할 수 있다.
또한, 스레드 하나가 읽기 권한으로 힙에 있는 파일을 열면 다른 스레드도 그 파일을 읽을 수 있다.
이런 스레드의 특성은 프로세스의 생성과 종료에 매우 유용하다. 프로세스보다 생성 속도가 빠르고 동일한 프로세스 안에 있는 스레드 간에 교환이나 종료도 훨씬 빠르기 때문에 프로그램을 변경하지 않고 스레드의 병렬로 처리하면 효율을 극대화할 수 있다.
3. 스레드 사용 방법
스레드를 사용자 수준에서 적용할 수 있고, 프로그램의 비동기적 요소를 구현하는데도 사용 가능하다.
실행 중인 스레드를 대기 상태로 변경하고 제어를 다른 스레드로 옮기는 상태 변화를 이용하여 많은 요청을 효율적으로 처리 가능하다. 데이터 베이스 시스템에서도 스레드를 활용할 수 있다.
4. 스레드 상태 변화
스레드는 항상 프로세스와 함께 사용되고, 하나만 사용된다.
프로세스를 생성하면 스레드도 함께 생성이 된다.
프로세스 안에 있는 스레드는 항상 순차적으로 실행하고, 스레드의 정보를 저장하는 레지스터나 스택이 있다.
스레드 생성에서는 운영체제가 부모 프로세스와 공유할 자원을 초기화할 필요가 없다. 프로세스가 스택과 레지스터를 제공하기 때문이다. 따라서 프로세스의 생성과 종료보다 오버헤드가 덜 발생한다.
스레드의 장점 중 하나는 하나의 스레드가 대기 상태로 변해도 전체 프로세스의 상태가 대기 상태로 변하지 않는다.
하나의 스레드가 대기 상태가 되면 다른 스레드를 실행할 수 있다. 프로세스와 달리 독립적이지는 않다.
프로세스 하나에 있는 스레드는 프로세스의 모든 주소에 접근할 수 있으면 스레드 한 개가 다른 스레드의 스택을 읽거나 덮어쓰기가 가능하다. 스레드는 사용자 한 명이 여러 스레드로 개인 프로세스 하나를 소유한다.
5. 스레드의 제어 블록
프로세스 제어 블록과 마찬가지로 정보를 저장한다.
프로세스 제어 블록의 리스트라고 할 수 있다.
스레드 간 보호를 하지 않는다.
TCB의 내용은
- 실행 상태(프로세스 레지스터, 프로그램 카운터, 스택 포인터)
- 스케줄링 정보(상태, 우선순위, 프로세서 시간)
- 계정 정보
- 스케줄링 큐 용 포인터
- PCB를 포함하는 포인터
04. 스레드의 구현
1. 사용자 수준 스레드
사용자 수준 스레드는 사용자 영역의 스레드 라이브러리를 이용하여 구현. 스레드의 모든 작업을 사용자 영역에서 구현하여 커널은 스레드의 존재를 알지 못한다. 스레드 라이브러리는 스레드의 생성과 종료, 스레드 간의 메시지 전달, 스레드의 스케줄링, 문맥 등 정보를 보관한다. 사용자 수준 스레드에서는 스레드 교환에 커널이 개입하지 않아 사용자 영역에서 커널 영역으로의 전환이 필요하지 않다. 커널은 스레드가 아닌 프로세스를 한 단위로 인식하여 프로세서를 할당하게 된다. 다수의 사용자 수준 스레드에 하나의 커널 수준 스레드를 매핑하므로 다대일 스레드 매칭이라고도 한다.
스레드의 모든 작업이 사용자 영역에서 진행되어 커널이 스레드를 지원할 필요가 없는데 이에 따른 장점으로는
- 이식성이 높다.
- 오버 헤드가 적다.
- 유연한 스케줄링 가능
단점으로는
- 시스템의 동시성을 보장 못함
- 확장 제약이 따름
- 스레드 간 보호 불가능
2. 커널 수준 스레드
사용자 수준 스레드의 한계를 극복하기 위해서 나온 방법이 커널 수준 스레드이다. 스레드와 관련한 모든 작업을 커널에서 관리한다.
한 프로세스에서 다수의 스레드에 프로세서를 할당하여 병행 수행 가능한다. 스레드 한 개가 대기 상태가 되면 다른 스레드로 교환이 가능하다. 이때 커널이 개입하므로 사용자 영역에서 커널 영역으로 전환이 필요하게 된다.
커널이 직접 스케줄링하고, 실행 가능하여 사용자 수준 스레드에서 부족한 커널의 지원을 받을 수 있고, 동일한 프로세스에 있는 스레드 중 하나가 대기 상태가 되어도 다른 스레드로 교환 가능하다는 장점이 있지만
오버헤드가 커지고 , 스케줄링과 동기화하기 위해서 많은 자원이 필요하다는 단점이 있다.
3. 혼합형 스레드
사용자 수준 스레드와 커널 수준 스레드를 혼합한 구조이다.
스레드 라이브러리가 최적의 성능을 지원하도록 경량 프로세스 수를 동적으로 조절하여 사용자 수준 스레드와 커널 수준 스레드를 다대다 매핑하게 된다. 또한 커널 영역에서 병렬 처리 정도를 이 매핑이 결정할 수 있어서 병렬 수행이 불필요하다고 생각되면 다대일 매핑도 가능하다. 마지막으로 스레드 풀링을 이용하여 오버헤드를 감소할 수 있는 일대일 매핑도 가능하다.
**스레드의 특징**
스레드는 중량 프로세스와 동일하면서도 효율이 매우 높다.
다중 스레드 시스템인 매크는 커널이 여러 요청을 동시에 실행할 수 있도록 한다.
다중 프로세스는 각 프로세스들이 독립적으로 실행될 수 있게 한다. 따라서 각각 스택, 레지스터, 프로그램 카운터, 주소 공간을 보유한다. 그러므로 프로세서가 하나인 시스템에서 파일 서버가 디스크의 입출력을 기다리는 동안 대기 상태가 될 수 있다. 동일한 주소 공간에서 서버 하나가 대기 상태에 있는 동안 독립적인 서버를 만들 수 없기 때문이다.
스레드가 여러 개인 프로세스 하나는 서버 스레드가 대기 상태일 때 동일한 프로세스에 있는 다른 스레드가 실행 가능하다. 따라서 작업량이 증가하고 시스템의 전체 성능이 향상됨을 알 수 있다.