Processes and Threads
프로세스는 두 가지의 특성을 가진다.
- Resource ownership (프로세스가 메인 메모리에 있을때)
프로세스 이미지를 위한 가상 주소 공간을 포함한다.
자원 소유권의 단위는 프로세스(process)나 태스크(task) 라고 한다.
- Scheduling / execution (실행의 단위로써 프로세스가 존재)
한 프로세스는 다른 프로세스들과 번갈아가면서 수행될 수 있다.
디스패칭 단위는 쓰레드(thread) 또는 경량 프로세스(lightweight process)라고 불린다.
*디스패치 : 한 프로세스로 부터 다른 프로세스로 교체(switch) 하는 과정
Multithreading(멀티 쓰레딩)
운영체제가 하나의 프로세스 내에서 수행되는 여러개의 쓰레드를 지원하는 기능
Process vs Thread
Process
- 프로세스의 이미지를 유지하는 가상주소 공간
- 파일
- 입출력 자원(장치, 채널)
Thread
- 쓰레드 수행 상태(수행, 준비 등)
- 수행 중이 아닐때 저장되어 있는 쓰레드 문맥
- 수행 스택
- 지역 변수를 위한 정적 저장소
-> 프로세스의 메모리 및 자원에 대한 접근으로 프로세스 내의 모든 쓰레드에 의해 공유
Multithreaded process model
각 쓰레드마다 별도의 스택이 있고, 레지스터 값, 우선순위, 스레드 관련 상태 정보를 포함하고 있는 별도의 제어블록이 있다.
따라서 프로세스 내의 모든 쓰레드들은 그 프로세스의 상태와 자원을 공유한다. (같은 주소 공간, 전역 변수, 하나의 쓰레드가 파일을 개방하면 다른 쓰레드들도 그 파일을 읽을 수 있다.)
싱글 스레드에서는 PCB에서 모든 정보를 저장하지만, 멀티스레드에서는 스레드 제어 블록을 이용하기 때문에 경량 프로세스라고도 하는 이유이다.
- 두개의 스레드가 같은 함수를 실행하면 A가 업데이트한 값을 B가 볼 수 없다. -> 각 스레드 스택에서 이루어지기 때문
- A가 엑세스 한 파일을 B도 엑세스할 수 있다. -> 파일 open에 관한 정보는 PCB에 저장되어있기 때문이다.
쓰레드의 이점
- 새로운 프로세스를 생성하는 것 보다 기존 프로세스 내에서 새로운 쓰레드를 생성하는 시간이 더 짧다.
- 프로세스 종료시간보다 쓰레드 종료시간이 더 짧다.
- 프로세스들 간 교환보다 같은 프로세스에 있는 두 쓰레드 간 교환이 효율적이다.
- 쓰레드는 서로 다른 수행 프로그램 간 통신에서 효율적이다. ( 메모리와 파일을 공유하기 때문에 )
쓰레드 상태 (Thread State)
쓰레드 기능을 생각하기 전에 일반적으로 Suspend(보류) 상태는 프로세스의 개념이기 때문에 쓰레드와 연관시키지 않는다.
-> 프로세스의 모든 쓰레드는 같은 주소 공간을 공유하기 때문에 프로세스가 종료되면 그 프로세스 내의 모든 쓰레드가 종료되기 때문이다.
쓰레드 관련 연산 (Operations)
Spawn(생성)
- 새로운 프로세스가 생성되면 쓰레드도 함께 생성된다.
Block(블록)
- 어떤 이벤트를 기다릴 때 쓰레드는 블록된다.
Unblock(비블록)
- 이벤트가 발생 했을 때 레디 큐로 이동한다.
Finish(종료)
- 쓰레드가 작업을 완료하면 레지스터 문맥과 스택을 해제한다.
Types of Threads
- User-Level thread (사용자 수준 스레드)
- Kernel-Level thread (커널 수준 스레드)
User-Level Thread
- 애플리케이션에 의해 모든 스레드가 관리된다.
- 커널은 스레드의 존재를 알지 못한다.
- 스레드 라이브러리를 이용해 스레드를 생성할 수 있다.
- 제어가 현재 스레드로부터 라이브러리로 넘어갈 때는 현재 스레드의 문맥이 저장되고,
제어가 라이브러리로부터 스레드로 넘어갈 때는 해당 스레드의 문맥이 복구된다.
- 스레드 라이브러리에 있는 코드를 실행중일 때, 프로세스는 인터럽트 받는다.
이 작업들은 사용자 공간과 단일 프로세스 내에서 이루어진다. 즉 커널은 이러한 작업을 아예 알지 못한다.
커널은 프로세스 단위로 스케줄링하며, 그 프로세스에게 수행 상태(준비, 수행, 블록)을 할당한다. 그래서 발생 가능한 상황은 다음과 같다.
1)
스레드 2에서 수행 중인 애플리케이션이 B를 블록시키는 시스템 호출(입출력 호출)을 수행하면 프로세스 B를 블록 상태에 놓고, 다른 프로세스로 교환한다. 하지만 스레드 2는 스레드 라이브러리에 의해 실제로는 수행중이지 않지만, 수행상태로 인식되는 경우이다.
2)
클락 인터럽트로 인해 제어가 커널로 넘어가고 커널은 현재 수행중인 프로세스 B가 시간 할당량을 다 소모했다 생각하고 프로레스 B를 준비 상태로 놓는다. 하지만 위와 마찬가지로 스레드 2는 여전히 수행 상태에 있는 것 처럼 인식한다.
3)
스레드 2는 프로세스 B의 스레드 1에 의해 어떤 연산이 필요한 지점에 도달하면 블록 상태에 들어가며, 스레드 1이 준비 상태에서 수행 상태로 바뀐다.
유저 레벨 스레드의 장점
1. 두 모드 사이의 전환 오버헤드를 절감시켜준다. ( 스레드 관리가 프로세스의 사용자 주소 공간에 있기 때문에 커널 모드의 권한이 요구되지 않는다.)
* 오버헤드: 프로그램의 실행흐름에서 나타나는 현상중 하나로 예를 들어, 프로그램의 실행흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때 , 추가적으로 시간,메모리,자원이 사용되는 현상입니다.
2. 스케줄링이 애플리케이션에 맞게 구성된다.
3. 어떠한 운영체제에서도 실행될 수 있다.
유저 레벨 스레드의 단점
1. 스레드가 시스템 호출을 사용할 경우 그 스레드 뿐만 아니라 같은 프로세스 내에 있는 모든 스레드가 블록된다.
2.멀티 프로세서의 장점을 살릴 수 없다.
-> 이를 해결하기 위해 jacketing 기술을 사용한다.
자켓팅의 목적은 블록형 시스템 호출을 비블록형 시스템 호출로 변환하는 것이다.
Kernel-Level Threads
스레드 관리와 관련된 모든 작업이 커널에 의해 이루어진다.
- 프로세스와 스레드를 위한 문맥 정보를 유지한다.
- 스레드 기반에서 스케줄링이 일어난다.
- 윈도우가 이 방법을 사용한다.
커널에서 독자적으로 스레드를 생성
<- 애플리케이션
<- 운영체제
커널 레벨 스레드의 장점
1. 같은 프로세스 내의 여러 스레드를 동시에 스케줄링 할 수 있다.
2. 한 스레드가 블록되면 커널은 같은 프로세스에서 다른 스레드를 스케줄 할 수 있다.
커널 레벨 스레드의 단점
1. 한 스레드에서 다른 스레드로 넘길 때 모드 스위칭(mode switching)이 필요하다.
Null Fork는 null을 호출하는 프로세스/스레드의 생성부터 완료까지 걸린 시간
Signal Wait는 프로세스/스레드가 대기 중인 프로세스/스레드에게 신호를 보내고 다음 특정 조건을 기다리는데 걸린 시간
KLT를 이용했을 때가 더 빠름 (resource를 안 가지기 때문)
Combined Approaches
- 스레드 생성은 완전히 사용자 공간에서만 이루어진다.
- 스레드의 스케줄링이나 동기화도 사용자 공간에서 이루어진다.
-> 한 애플리케이션에서의 스레드들이 병렬로 수행되며 블록형 시스템 호출이 전체 프로세스를 블록시키지 않는다.
'🖥️ Computer Science > Operating System' 카테고리의 다른 글
[운영체제] Concurrency: Mutual Exclusion and Synchronization - 1 (2) | 2024.04.19 |
---|---|
[운영체제] Process Creation (0) | 2024.04.19 |
[운영체제] Process Description and Control - 3 (0) | 2024.04.03 |
[운영체제] Process Description and Control - 2 (0) | 2024.03.27 |
[운영체제] Process Description and Control - 1 (0) | 2024.03.21 |