프로세스와 스레드
프로세스란?
프로세스는 메인 메모리에 할당되어 실행중인 상태인 프로그램의 인스턴스를 말한다.
( 이 때 프로그램과는 개념이 다르다. 프로그램은 어떤 작업을 위해 실행할 수 있는 파일으로,. 정적인 개념을 의미한다.)
프로세스는 운영체제로부터 시스템 자원을 할당받는 작업의 단위가 된다.
특징은 다음과 같다.
- 프로세스는 각각 독립된 메모리 영역을 할당받는다.
- Code, Data, Stack, Heap으로 구성되어 있다.
- 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다. ex) 파이프, 파일, 소켓 등을 이용한 통신 방법 이용
프로세스 상태는 다섯가지가 존재한다.
- New: 프로그램이 메인 메모리에 할당된다. 프로세스가 생성이 된 상태를 말한다.
- Ready: 할당된 프로그램이 초기화와 같은 작업을 통해 실행되기 위한 모든 준비를 마친다. CPU 할당을 기다리고 있는 상태다.
- Running: CPU가 해당 프로세스를 실행한다.
- Waiting: 프로세스가 끝나지 않은 시점에서 I/O로 인해 CPU를 사용하지 않고 다른 작업을 한다. (해당 작업이 끝나면 다시 CPU에 의해 실행되기 위해 ready 상태로 돌아가야 한다.)
- Terminated: 프로세스가 완전히 종료된다.
PCB(Process Control Block)
PCB는 프로세스에 대한 모든 정보가 모여있는 곳으로, Task Control Block(TCB) 이라고도 한다.
CPU는 수행중인 프로세스를 나갈 때, 이 프로세스의 정보를 어딘가에 저장하고 있어야 다음에 이 프로세스를 수행할 때 이전에 수행한 그 다음부터 이어서 작업할 수 있다. 이러한 정보를 저장하는 곳이 PCB이다.
PCB 안에는 다음과 같은 정보가 포함되어 있다.
- Process ID : 프로세스를 구분하는 ID
- Process State : 프로세스의 상태를 저장
- Program Counter: 프로그램 계수기는 이 프로세스가 다음에 실행할 명령어의 주소를 가리킵니다.
- Register : 프로세서 내에서 요청을 처리하는 데 필요한 데이터를 일시적으로 저장
- CPU Scheduling Information : 우선 순위, 최종 실행시간, CPU 점유시간 등
- Memory Information : 해당 프로세스의 주소 공간 등
- Process Information : 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등
- Device I/O Status : 프로세스에 할당된 입출력장치 목록, 열린 파일 목록 등
- Pointer : 부모 프로세스에 대한 포인터, 자식 프로세스에 대한 포인터, 프로세스가 위치한 메모리 주소에 대한 포인터, 할당된 자원에 대한 포인터 정보 등
- Open File List : 프로세스를 위해 열려있는 파일의 리스트
프로세스 큐
프로세스는 수행하면서 상태가 여러 번 변하는데 이에 따라 서비스를 받아야하는 곳이 다르다. 그리고 프로세스는 일반적으로 여러 개가 한 번에 수행되므로 그에 따른 순서가 필요하다. 이러한 순서를 대기하는 곳을 큐(queue)라고 부른다.
- Job Queue: 메모리 할당을 대기중인 프로세스로 구성
- Ready Queue: CPU 할당을 대기중인 프로세스로 구성
- Device Queue: I/O 장치 할당을 대기중인 프로세스로 구성
스케줄링 큐는 PCB의 링크드 리스트로 관리되며, 멀티 프로세스 환경에서 스케쥴링 과정에서 사용 된다.
위 그림처럼 프로세스들은 스케줄러 알고리즘에 따라 여러 queue 사이를 옮겨다니며 작업을 수행한다.
프로세스 스케쥴링
프로세스 스케쥴링 방식에는 선점(Preemptive Scheduling), 비선점(Nonpreemptive Scheduling)이 있다.
선점 스케줄링 (Preemptive Scheduling)
- 운영체제의 판단에 따라 현재 실행 중인 프로세스를 강제로 중단시키고, CPU 스케줄링을 수행한다.
- ex) SRT, RR(Round Robin), 다단계 큐 방식 등
- 장점 : 각 프로세스의 빠른 응답을 지원할 수 있다.
- 단점 : 문맥 교환(Context Switch)을 위한 커널 코드가 실행이 빈번하게 발생하여 overhead가 증가한다.
비선점 스케줄링 (NonPreemptive Scheduling)
- 현재 실행 중인 프로세스가 자발적으로 CPU 사용을 중단하는 경우에만 CPU 스케줄링을 수행하는 방법
- ex) FCFS, SJF, HRN 등
Context swtiching
Context switching은 여러개의 프로세스가 실행되고 있을 때 기존에 실행되던 프로세스를 중단하고 다른 프로세스를 실행하는 것. 즉, CPU에 실행할 프로세스를 교체하는 기술이다. 앞서 설명한 PCB에 process 상태값들을 저장하고, 해당 값들을 찾는 방법으로 구현된다.
Context Switching은 다음과 같은 절차를 통해 이루어진다.
- 스케줄러가 A 프로세스의 실행을 중단하고 B 프로세스를 실행할 것을 요청한다.
- A프로세스에서 Stack의 데이터 위치를 가리키고 있는 SP(Stack pointer)의 값과 다음 실행해야하는 코드의 주소값을 가지고 있는 PC(Program Counter)의 값을 PCB에 저장한다. (운영체제에서 관리)
* SP와 PC는 모두 중앙처리장치 안의 레지스터이다. - A 프로세스는 ready 또는 block 상태로 바뀌고, CPU에서 B 프로세스를 실행한다. 이 과정을 통해 B 프로세스의 상태가 ready에서 running으로 바뀌는데, 이 작업을 디스패치(dispatch)라고 한다.
- 반대로 다시 B프로세스에서 A프로세스로 컨텍스트 스위칭을 할 경우, B프로세스의 SP값과 PC값을 PCB에 저장하고(이 때 PCB는 A프로세스의 위치값을 저장하는 PCB와는 별도로 생성되는 메모리 공간임) A프로세스의 PCB에서 SP값과 PC값을 찾아 SP와 PC에 덮어씌운다.
Context Switching이 주로 발생하는 상황은 다음과 같다.
- I/O interrupt
- CPU 사용시간 만료
- 자식 프로세스 Fork
- 인터럽트 처리를 기다릴 때
Context Switching이 진행중일 때, CPU는 아무런 일을 하지 않으므로 잦은 컨텍스트 스위칭은 성능저하를 일으킬 수 있다.
Degree of multiprogramming
Degree of multiprogramming 는 현재 메모리에 할당되어 있는 프로세스 개수를 말한다.
I/O bound process VS CPU bound process
프로세스는 I/O bound process 와 CPU bound process 로 나뉜다.
- I/O bound process: 해당 프로세스에서 I/O(입출력) 작업이 차지는 비중이 높은 프로세스를 말한다.
- CPU bound process: 해당 프로세스에서 CPU 작업(계산)이 차지는 비중이 높은 프로세스를 말한다.
운영체제, 정확히 말하면 job scheduler 는 I/O bound process와 CPU bound process를 적절히 분배해서 메모리에 할당해주어야 한다.
스레드(Thread)
스레드는 프로세스 내에서 실행되는 여러 흐름의 단위이자, 특정한 수행 경로, 프로세스로부터 할당받은 자원을 이용하는 실행 단위이다.
스레드의 특징은 다음과 같다.
- 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
- 프로세스 내에서 주소 공간이나 자원들을 같은 프로세스내의 스레드끼리 공유하면서 실행된다.
- 각각의 스레드는 별도의 레지스터와 스택을 가지고 있다.
Stack, Register가 메소드의 실행에 필요한 정보를 가지고 있어, 메소드의 독립적인 실행을 위해 별도의 레지스터와 스택을 할당받는다. - 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.
- 캐시메모리나 PCB에 저장해야하는 내용이 적고, 비워야 하는 내용도 적기때문에 상대적으로 더 빠른 컨텍스트 스위칭이 일어날 수 있다.
프로세스 vs 스레드
프로세스와 스레드의 차이를 묻는 질문은 면접에서 자주 등장하는 주제이다.
기본적으로는 프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이며, 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위라고 설명할 수 있다.
스레드는 프로세스 안에 포함되어 있는 개념이기 때문에, 결국 프로세스와 스레드는 개념의 범위부터가 다르다.
그런데도 이 질문이 계속 등장하는 이유는, 지원자가 프로그램, 프로세스, 스레드에 대한 기본 개념에 대해 잘 이해하고 있는지를 확인하기 위함이다. 이를 이해하고 있음에서 더 나아가 결국 운영체제가 시스템 자원을 어떤 방식으로 할당하고, 프로그램은 이 자원을 어떤 방식으로 활용하여 작동되는지에 대해 질문하고자 하는 것이다.
그래서 최종적인 답변을 작성해보면
- 운영체제가 프로세스에게 Code/Data/Stack/Heap 메모리 영역을 할당해 주고 최소 작업 단위로 삼는 반면, 스레드는 프로세스 내에서 Stack 메모리 영역을 제외한 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다.
- 프로세스는 다른 프로세스와 정보를 공유하려면 IPC를 사용하는 등의 번거로운 과정을 거쳐야 하지만, 스레드는 기본 구조 자체가 메모리를 공유하는 구조이기 때문에 다른 스레드와 정보 공유가 쉽다.
- 다만 스레드의 스케줄링은 운영체제가 처리하지 않기 때문에 프로그래머가 직접 동기화 문제에 대응할 수 있어야 한다.
출처
프로세스와 스레드의 차이
프로세스와 스레드의 차이는 프로세스와 스레드, 그리고 프로그램이 작동하는 방식에 대해서 잘 이해하고 있는지 확인하기 위해 기술면접에서 단골 질문 사항으로 나온다.
velog.io
[운영체제(OS)] 5. 프로세스 관리
1. 프로세스(Process) 프로세스는 메인 메모리에 할당되어 실행중인 상태인 프로그램을 말한다. 프로그램은 일반적으로 하드디스크(보조기억장치)에 저장되어 아무 일도 하지 않는 상태이다. 프로
velog.io
https://dev-mystory.tistory.com/119
운영체제 - PCB(Process Control Block)란?
PCB란? 운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓는 곳으로, 프로세스의 상태 정보를 저장하는 구조체이다. 프로세스 상태 관리와 문맥교환(Context Switching)을 위해 필요하다. PCB는
dev-mystory.tistory.com
https://applefarm.tistory.com/105
컨텍스트 스위칭이란
멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(
applefarm.tistory.com
https://hyunie-y.tistory.com/31
운영체제 5: 컨텍스트 스위칭 (Context Switching)
컨텍스트 스위칭이란 여러개의 프로세스가 실행되고 있을 때 기존에 실행되던 프로세스를 중단하고 다른 프로세스를 실행하는 것. 즉, CPU에 실행할 프로세스를 교체하는 기술이다. PCB 컨텍스트
hyunie-y.tistory.com