프로세스와 쓰레드에 대해 알아보자.
# 프로세스(Process)
먼저, 프로세스란 실행 중인 프로그램을 의미한다.
프로세스는 디스크로 부터 메모리에 적재되어 CPU 할당을 받을 수 있게 되며, 운영체제로 부터 주소 공간, 파일, 메모리 등을 할당받는다.
이러한 프로세스의 특징으로는 다음과 같다.
- 프로세스는 각각 독립된 메모리 영역을 할당받는다 (아래의 메모리 구조 참고)
- 기본적으로 프로세스당 최소 1개의 쓰레드(메인 쓰레드)를 가지고 있다.
- 각 프로세스는 독립적인 메모리 공간에서 실행되므로 다른 프로세스에 접근이 불가능하다.
- 프로세스 간 정보를 주고받으려면 IPC(Inter-Process Communication)를 사용해야 한다. (파이프, 공유 메모리, 소켓 등을 이용한 통신)
프로세스의 메모리 구조
프로세스의 메모리 구조는 다음과 같다.
- Stack : 지역 변수와 함수 호출에 필요한 데이터가 저장되는 영역이다. (automatic 변수, 임시 변수, 함수 리턴시 돌아갈 주소값)
- Heap : 동적 메모리 할당이 일어나는 영역으로, 런타임에 크기가 결정된다.
- BSS : 초기화되지 않은 data 영역으로 해당 영역의 데이터는 프로그램 실행 전 OS 커널에 의해 0으로 초기화된다. (초기화 되지 않은 전역, 정적 변수)
- Data : 초기화 된 data 영역이다. (초기화된 전역, 정적 변수)
- Code(Text) : 실행가능한 명령어(소스코드)를 저장하고 있는 영역이다.
프로세스의 상태
프로세스의 상태는 다음과 같다.
- New : 프로세스가 생성 중인 상태
- Ready : CPU의 할당을 기다리는 상태
- Running : CPU를 할당받아 instruction을 수행 중인 상태
- Blocked (wait, sleep) : I/O 등의 이벤트를 스스로 기다리는 상태 ex) 디스크에서 file 읽어 오기
- Suspended (stopped) : 외부 이유로 프로세스의 수행이 정지된 상태 ex) 리눅스의 ctrl + z
Blocked 상태의 경우 자신이 요청한 이벤트가 완료되면 Ready 상태로 바뀌지만, Suspended 상태의 경우 외부에서 resume 명령을 내려야 Ready 상태로 전환된다.
PCB(Process Control Block)
PCB란 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조이다.
운영체제는 프로세스의 생성과 동시에 고유한 PCB를 생성하며, 프로세스의 진행상황을 저장하고 불러오는 역할을 한다.
PCB에 저장되는 정보들은 다음과 같다.
- OS가 관리상 사용하는 정보
- Process state (New, Ready, Running 등의 프로세스 상태)
- Process ID (프로세스 식별번호)
- CPU 수행 관련 하드웨어 값
- Program Counter (프로세스가 다음에 실행할 명령어의 주소)
- registers
- 메모리 관련 (code, data, stack 영역의 위치 정보)
- 파일 관련 (Open file descriptors)
문맥 교환 (Context Switch)
문맥 교환이란 CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정이다.
이 문맥 교환은 cache memory flush 등 오버헤드가 많은 작업이며,
CPU가 다른 프로세스에게 넘어갈 때 운영체제가 수행하는 일은 다음과 같다.
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
스케줄러 (Scheduler)
우선 프로세스를 스케줄링하기 위한 큐에는 다음과 같은 세 가지 종류가 있다.
- Job Queue : 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready Queue : 현재 메모리 내에 있으면서 CPU를 잡아 실행되길 기다리는 프로세스의 집합
- Device Queue : Device I/O 작업을 대기하고 있는 프로세스의 집합
프로세스들은 각 큐들을 오가며 수행된다.
이러한 큐에 프로세스들을 넣고 빼주는 스케줄러에도 세 가지 종류가 있다.
- Long-term scheduler (장기 스케줄러, job scheduler)
- 시작되는 프로세스들 중 어떤 것을 Ready Queue에 보낼지 결정한다.
- 프로세스에 메모리를 할당하는 문제를 담당한다.
- degree of Multiprogramming을 제어한다. (실행 중인 프로세스의 수 제어)
- time sharing system에서는 보통 장기 스케줄러가 없다. (그냥 곧바로 메모리에 올라가 Ready 상태가 되기 때문)
- Short-term scheduler (단기 스케줄러, CPU scheduler)
- Ready Queue에 존재하는 프로세스 중 어떤 프로세스를 Running 상태로 바꿀지 결정한다.
- 프로세스에 CPU를 할당하는 문제를 담당한다.
- millisecond 단위로 충분히 빨라야 한다.
- Medium-term scheduler (중기 스케줄러, Swapper)
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아낸다.
- 프로세스에게서 메모리를 뺏는 문제를 담당한다.
- degree of Multiprogramming을 제어한다.
- 현 시스템에서 메모리에 너무 많은 프로그램이 동시에 올라가는 것을 조절하는 스케줄러이다.
# 쓰레드(Thread)
쓰레드란 프로세스의 실행 단위를 의미한다.
한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유함으로써 같은 일을 하고자 할 때 자원 낭비를 방지한다.
쓰레드의 독립적인 구성요소는 다음과 같다.
- Thread ID (쓰레드 식별번호)
- Program Counter
- register set
- stack space
쓰레드가 동료 쓰레드와 공유하는 부분은 다음과 같다.
- code section
- data section
- heap section
- OS resources
stack space를 쓰레드마다 독립적으로 할당하는 이유
stack space는 함수 호출 시 전달되는 인자와 되돌아갈 주소값 및 함수 내 변수 등을 저장하기 위한 메모리 공간이다.
따라서, stack space가 독립적이어야 독립적인 함수 호출이 가능해지며, 이를 통해 독립적인 실행 흐름이 추가될 수 있기 때문이다.
Program Counter를 쓰레드마다 독립적으로 할당하는 이유
Program Counter는 instruction이 어디까지 수행되었는지를 나타낸다.
쓰레드는 CPU를 할당받아도 스케줄러에 의해 다시 뺏기게 되므로 작업이 연속적으로 수행되지 않기 때문에 어느 부분까지 수행했는지 기억할 필요가 있다.
따라서, Program Counter를 쓰레드마다 독립적으로 할당한다.
이러한 쓰레드의 장점은 다음과 같다.
- 한 쓰레드가 Blocked 상태여도 다른 쓰레드는 실행을 계속하는 것이 가능하다.
- 쓰레드들끼리 프로세스의 리소스를 공유한다.
- 쓰레드를 생성하는 것이 프로세스를 생성하는 것보다 비용이 적게들며, 문맥 교환(Context Switch)의 오버헤드가 적다.
- 멀티 프로세서 구조의 이점을 활용할 수 있다. (각각의 쓰레드를 다른 프로세서에서 병렬로 수행할 수 있다.)
'Computer Science > Operating Systems' 카테고리의 다른 글
[Operating Systems] 인터럽트(Interrupt) (0) | 2023.01.06 |
---|---|
[Operating Systems] 컴퓨터 시스템 구조 (0) | 2022.12.26 |
[Operating Systems] 운영체제란? (0) | 2022.12.21 |