공부기록
코타쿠
« 2024/11 »
일 |
월 |
화 |
수 |
목 |
금 |
토 |
|
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
관리 메뉴
공부기록
프로세스와 스레드 본문
CS/OS
프로세스와 스레드
코타쿠
2021. 5. 14. 16:23
- 프로세스의 특징
- 자원 소유권
- 스케줄링/실행
- interleave하게 수행
- 프로세스는 OS에 의해 스케줄 되고 디스패치 되는 개체임
- 자원 소유권 / 스케줄링 특성은 각 프로세스의 본질 (essence)
- 두 가지 특성은 독립적이며 OS에 의해 독립적으로 취급 될 수 있음
- 디스패칭의 단위는 thread or lightweight process
- 소유권의 단위는 process or task
- 다중스레딩
- OS 가 하나의 process 내에서 수행되는 여러 개의 스레드를 지원하는 기능
- 다중 스레드 환경에서 프로세스는 보호의 단위와 자원할당의 단위로 정의
- 프로세스 이미지를 유지하는 가상의 주소공간
- 처리기, (IPC하는) 다른 프로세스, 파일, 입출력 자원 (장치, 채널) 등에 대한 보호된 접근
- 프로세스는 하나 이상의 쓰레드를 가지며, 각 쓰레드는 다음 사항들을 포함
- 쓰레드 수행항태 ( 수행, 준비, 블락)
- 수행 중이 아닐 때 저장되어 있는 쓰레드 문맥 : 쓰레드를 보는 관점 중 하나는 쓰레드를 한 프로세스 내부에서 동작하는 독립된 프로그램 카운터로 간주하는 것이다.
- 수행스택
- 지역변수 저장을 위해 각 쓰레드가 사용하는 어떤 정적 저장장소
- 프로세스의 메모리 및 자원에 대한 접근으로, 메모리 및 자원은 프로세스 내의 모든 쓰레드에 의해 공유됨
- 프로세스 관리의 관점에서 스레드와 프로세스의 차이점
- 단일 스레드 프로세스 모델 (진정한 스레드가 아님)
- 프로세스는 프로세스 제어블록, 사용자 주소공간, 사용자 스택과 커널 스택 등으로 표현됨
- 스택은 프로세스 수행 중에 함수 호출/복귀 행위를 관리
- 프로세스가 수행되는 동안 처리기 레지스터는 그 프로세스에 의해서 제어되고, 프로세스가 수행 상태가 아니면, 처리기 레지스터들의 내용은 저장된다.
- 다중 스레드 프로세스 모델
- 프로세스와 관련된어 하나의 프로세스 제어블록과 사용자 주소 공간 존재
- 단일스레드 모델과 달리 다중스레드 환경에서는 각 스레드마다 별도의 스택, 레지스터 값, 우선순위, 그 외 스레드 관련 상태정보를 포함하고 있는 별도의 제어블록이 존재
- 프로세스 내의 모든 스레드들은 그 프로세스 상태와 자원을 공유
- 그 스레드들은 같은 주소공간에 존재하며 동일한 데이터에 접근한다. 프로세스 내의 한 스레드가 메모리에 있는 데이터 항목을 변경했을 경우, 다른 스레드도 그 데이터 항목에 접근하여 그 결과를 확인할 수 있음
- 성능 면에서 스레드의 장점
- 새로운 프로세스를 생성하는 시간보다, 존재하는 프로세스 내에서 새로운 스레드를 생성하는 시간이 더 짧음
- 프로세스 종료시간보다 스레드 종료시간이 더 짧음
- 같은 프로세스에 있는 두 쓰레드 간 교환이 효율적임
- 대부분의 OS에서, 독립된 프로세스들 간의 통신에는 보호 및 통신 기법을 제공하기 위해 커널이 개입해야함
- 그러나 같은 프로세스 내의 스레드들은 메모리 및 파일을 공유하기 때문에, 커널을 호출하지 않고도 서로 통신할 수 있음
- 연관된 수행단위의 집합으로 구현되어야 하는 응용이나 기능이 있다면, 이들을 독립적인 프로세스가 아닌 스레드의 모음으로 구현하는 것이 훨씬 효율적임
- 쓰레드를 이용한 응용의 예
- 파일 서버
- 파일에 대한 요청이 있을 때마다 파일 관리 프로그램은 새로운 쓰레드를 생성
- 서버는 많은 요청을 처리할 것이므로 짧은 시간 동안 많은 쓰레드가 생성되고 소멸할 것임
- 서버 응용이 다중 처리기 상에서 수행된다면, 한 프로세스 내의 여러 쓰레드가 동시에 다른 처리기에서 수행될 수 있음
- 파일 서버의 프로세스들 또는 스레드들은 파일자료를 공유해야 하며, 따라서 그들의 연산을 조정해야함
- 이러한 조정을 위해, 프로세스와 메세지 전송을 사용하는 것 보다는 스레드와 공유 메모리를 사용하는 것이 효율적임
- 단일 사용자 다중처리 시스템에서 스레드를 사용하는 네 가지 예
- 전면과 후면 작업
- 비동기처리
- 빠른 수행
- 모듈 프로그램 구조
- 쓰레드 상태
- 프로세스 상태와 같이, 각 쓰레드의 주요 상태에는 수행, 준비, 블록 이 있다.
- 일반적으로 보류상태는 프로세스 수준의 개념이기 때문에, 쓰레드와 연관시키는 것은 의미가 없음
- 특히 프로세스가 주기억장치로부터 스왑아웃 될 경우, 스 프로세스의 모든 스레드는 주소공간을 공유하기 때문에 모든 스레드도 반드시 스왑아웃됨
- 쓰레드와 관련한 기본적인 쓰레드 연산
- 생성 (Spawn)
- 일반적으로 새로운 프로세스가 생성되면 이 프로세스를 위한 쓰레드도 함께 생성됨
- 계속해서, 쓰레드는 이 프로세스 내에서 다른 쓰레드를 생성할 수 있으며, 이 경우 새로 생성된 쓰레드를 위해 명령 포인터와 인자들을 제공함
- 새로운 쓰레드는 자신의 레지스터 문맥과 스택 공간을 가지며 준비 큐에 위치함
- 블록 (Block)
- 쓰레드가 어떤 사건을 기다려야 할 때 쓰레드는 블록됨
- 이 때 자신의 사용자 레지스터, 프로그램 카운터, 스택 포인터를 저장
- 처리기는 동일 프로세스 내에 있거나 다른 프로세스 내에 있는 준비 상태의 다른 스레드를 수행
- 비블록 (Unblock)
- 쓰레드를 블록시킨 사건이 발생되었을 때 그 쓰레드는 준비 큐로 이동
- 종료 (Finish)
- 쓰레드가 작업을 완료하면 레지스터 문맥과 스택이 해제됨
- 한 쓰레드의 블록이 전체 프로세스를 블록시키는가?
- 프로세스 내의 한 쓰레드가 블록되면 같은 프로세스 내의 준비상태가 된 다른 스레드가 수행상태로 전이하게 된다.
- 만약 하나의 스레드가 전체 프로세스를 블록시킨다면, 스레드가 지닌 장점과 유연성이 사라지게됨
- 쓰레드 동기화
- 프로세스 내의 모든 쓰레드는 주소 공간 및 개방된 파일과 같은 자원을 공유하고, 하나의 쓰레드에 의한 자원의 변경은 같은 프로세스 내에 존재하는 모든 쓰레드의 환경에 영향을 끼침
- 따라서 쓰레드들이 서로 간섭하지 않도록, 자료구조를 손상시키지 않도록 쓰레드들의 행위를 동기화하는 것이 필요하다.
- 이를 위해 세마포어, 뮤텍스를 사용한다.
- ULT와 KLT
- ULT
- 순수한 ULT 구현에서, 쓰레드 관리와 관련된 모든 일은 응용이 수행하며 커널은 쓰레드의 존재를 알지 못한다.
- ULT 관리 루틴들로 구성된 패키지인 쓰레드 라이브러리를 이용하여, 모든 응용을 다중 쓰레드 기반으로 프로그램이 할 수 있음
- 쓰레드 라이브러리는 쓰레드의 생성과 제거, 쓰레드 간의 메세지와 데이터 전달, 쓰레드 수행의 스케줄링, 쓰레드 문맥의 저장과 복구 등을 위한 코드를 포함
- 기본적으로 응용은 시작하자마자 하나의 쓰레드를 가지며, 그 첫 쓰레드에서 수행을 시작
- 응용과 쓰레드는 커널에 의해서 관리되는 하나의 프로세스에 할당
- 응용이 수행되는 도중 (프로세스 수행 중) 어느 때라도, 응용은 새로운 쓰레드를 생성 (spawning)하여 같은 프로세스 내에서 실행할 수 있음
- 쓰레드 생성은 쓰레드 라이브러리 내으 ㅣ생성 유틸리티 (spawn utility)를 통해 호출 가능
- 프로시저 호출에 의해 제어는 그 유틸리티로 넘어가고, 쓰레드 라이브러리는 새로운 쓰레드를 위한 자료구조를 생성한 다음, 스케줄링 알고리즘을 사용하여 프로세스 내에서 준비 상태에 있는 한 쓰레드로 제어를 넘겨줌
- 제어가 현재 쓰레드로부터 라이브러리로 넘어갈 때는 현 쓰레드의 문맥 (context)이 저장되고, 제어가 라이브러리로부터 어떤 쓰레드로 넘어갈 때는 해당 쓰레드의 문맥이 복구됨
- 문맥은 본질적으로 사용자 레지스터의 내용, 프로그램 카운터, 스택 포인터 등으로 구성됨
- ULT의 장점
- 쓰레드 관리를 위한 모든 자료구조가 프로세스의 자용자 주소공간에 있기 때문에 쓰레드 교환에 커널 모드의 특권이 요구되지 않음
- 프로세스는 쓰레드 관리를 위해 커널모드로 전환되지 않음
- 이는 mode switching으로 인한 오버헤드를 감소시킴
- 스케줄링이 응용에 맞게 구성될 수 있다.
- ULT는 어떠한 운영체제에서도 적용될 수 있음
- ULT의 단점
- 일반 운영체제에서 대부분의 시스템 호출은 해당 쓰레드를 블록시킴
- 결과적으로, 쓰레드가 시스템 호출을 수행할 경우, 그 쓰레드 뿐 아니라 같은 프로세스에 있는 모든 쓰레드가 블록됨
- 순수한 ULT 기반의 다중 쓰레드 응용은 다중처리의 장점을 살릴 수 없음
- 커널은 한 번에 하나의 처리기에 하나의 프로세스를 할당함
- 따라서, 임의 시점에 단일 프로세스 내에서 하나의 쓰레드만을 수행가능
- 다중 쓰레드가 아닌 프로세스로 작성할 수 있으나 이는 쓰레드 교환대신 프로세스 교환을 함으로써 부하가 더 커지게 된다.
- KLT
- 순수한 KLT 구현에서는 쓰레드 관리와 관련된 모든 작업이 커널에 의해 이루어짐
- 응용영역에는 쓰레드 관리를 위한 코드가 없고, 단순히 커널 쓰레드 기능에 대한 API가 있음
- 어떤 응용이라도 다중 쓰레드로 프로그래밍 될 수 있음
- 응용에 있는 모든 쓰레드들이 단일 프로세스 내에서 지원됨
- 커널은 전체 프로세스에 대한 문맥 정보 및 각 프로세스 내 쓰레드에 대한 문맥정보를 유지
- 커널에 의한 스케줄링은 스레드를 기반으로 해서 이루어짐
- KLT의 장점
- 커널은 여러 처리기에게 같은 프로세스 내의 여러 쓰레드를 동시에 스케줄 가능
- 한 프로세스의 쓰레드가 블록되면 커널은 같은 프로세스에서 다른 쓰레드를 스케줄 가능
- 커널 루틴 자체가 다중 쓰레드로 구성 가능
- KLT의 단점
- 같은 프로세스에서 한 쓰레드에서 다른 쓰레드로 제어를 넘길 때 mode switching이 필요