프로세스, 스레드(2)
프로세스에서 실행 제어만 분리한 실행 단위
중량 프로세스(HWP)는 스레드를 하나 가진 작업
- 경량 프로세스(LWP): 프로세서를 사용하는 기본 단위이며, 명령어를 독립적으로 실행할 수 있는 하나의 제어 흐름
- 작업: 스레드의 그룹 환경, 같은 그룹의 스레드, 코드, 주소 공간, 운영체제의 자원(파일, 신호) 등 공유
작업에 스레드가 없으면 아무일도 할 수 없으므로 반드시 스레드가 있어야 한다.
프로세스는 스레드를 하나 이상 가지며, 각 스레드는 아래 내용을 포함한다.
- 스레드 실행 시 상태(실행, 준비)
- 실행 스택
- 지역 변수, 스레드의 특정 데이터를 저장하기 위한 스레드별 정적 저장소
- 프로세스의 다른 스레드가 공유하는 프로세스의 메모리와 자원에 대한 접근 등의 스레드 실행 환경 정보(문맥 정보)
스레드의 장점
프로세스에 포함된 스레드들은 공통의 목적 달성을 위해 병렬로 수행한다.
- 시스템 성능과 효율 향상: 하나의 프로세스가 서로 다른 프로세서에서 프로그램의 다른 부분을 동시에 실행 가능
운영체제는 단일 프로세스에서 단일 스레드 실행과 다중 스레드 실행을 지원한다.
- 단일 스레드 프로세스: 프로세스 하나에 스레드 하나가 실행되는 전통적인 방식(MS-DOS)
- 다중 스레드 프로세스: 프로세스 하나에 여러 스레드를 실행하는 것을 지원(Windows NT/XP, Solaris)
다중 스레드의 특징
1 | 각 스레드를 별도의 프로세서에서 실행하는 측면 다중 프로세싱(프로세서)와 같은 의미 |
단일 스레드, 다중 스레드 모델
- 단일 스레드 프로세스 모델: 프로세스를 하나의 스레드, 스레드가 가진 레지스터와 스택으로 표현한다.
- 다중 스레드 프로세스 모델: 프로세스를 각각의 스레드와 고유의 레지스터, 스택으로 표현, 프로세스 주소 영역을 모든 스레드가 공유한다.
단일 사용자 다중 처리 시스템 환경
1 | 시스템 호출이 아닌 사용자 라이브러리 수준에서 스레드 개념을 제공, 빠른 속도 |
공유 메모리 형태의 다중 프로세서 시스템 환경
프로그램을 공유 메모리에 저장, 스레드를 각 프로세서에 할당, 병렬처리하여 프로세서 성능을 매우 향상시킬 수 있다.
스레드의 단점
사용자 수준 스레드는 커널 자체가 스레드 하나로 구성, 시스템 호출 실행 시 해당 스레드가 포함된 전체 작업이 시스템 호출 결과가 돌아올 때까지 대기
스레드의 특징
1 | 준비, 실행, 대기, 종료 상태로 구분. 프로세서를 함께 사용하며 항상 스레드 하나만 실행한다. |
여러 수준에서 스레드 구현 가능
운영체제에 따라 다르며 일반적으로 사용자 수준, 커널 수준 혹은 혼합한 방식 중 하나를 사용한다.
Windows 2000/XP, Mach, OS/2, Solaris 운영체제는 커널 수준 지원, 시스템 호출 제공
사용자 수준에서 라이브러리 호출을 통한 지원 가능
사용자 수준 스레드
1 | 커널 스레드를 지원하지 않는 운영체제에서 사용 |
장점
- 높은 이식성: 기본 커널 변경없이 모든 운영체제에 적용 가능
- 오버헤드 감소: 스레드 관리를 위한 모든 데이터 구조가 프로세스의 사용자 주소 공간에 있어 커널의 도움없이 스레드 교환 가능
- 스케줄링의 유연성: 스레드 라이브러리에서 스레드 스케줄링을 제어하므로 스케줄링이 응용 프로그램에 맞게 적절히 구성
단점
- 시스템의 동시성 지원 불가: 한 번에 하나의 스레드만 커널에 접근 가능, 여러 스레드가 시스템 호출을 동시에 사용할 수 없음
- 시스템 규모 확장 제약: 커널이 프로세서 내부의 다중 스레드를 프로세스 하나로 관리, 다중 처리 환경에서 여러 프로세스를 이용한 분산 처리를 할 수 없음
- 스레드 간 보호 어려움: 스레드 간 보호에 커널의 보호 기법을 사용할 수 없고, 스레드 라이브러리에서 스레드 간 보호를 제공해야 프로세스 수중에서 보호함
병렬 실행 가능
하나가 시스템 호출 시 다른 스레드가 중단되는 M:1 방식의 문제를 해결할 수 있어 다중 프로세서에서 다중 스레드를 병렬로 실행 가능
시스템 규모 확장이 쉬우며 처리량을 늘릴 수 있다.
이식성
시스템 변경 시 제공된 스레드 API 를 사용하여 프로그램을 수정한다.
제한적인 자원으로 인해 사용자 수준 스레드 생성에 따라 커널 스레드를 무한정 생성할 수 없다.