프로세스와 스레드
프로세스
프로세스란, 실행 중에 있는 프로그램을 의미한다. ‘스케줄링의 대상이 되는 작업’과 같은 의미로 쓰인다. 프로세스 내부에는 최소 하나의 스레드(Thread)를 가지고있는데, 실제로는 스레드단위로 스케줄링을 한다.
하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로세스라 불린다.
메모리 구조
프로세스는 다음과 같은 메모리 구조를 가지며, 모든 프로세스마다 내부에 같은 구조를 지니고 있다.
높은 메모리 주소부터, 스택(Stack), 힙(Heap), 데이터 영역, 코드 영역으로 나눠진다.
- 스택과 힙
스택과 힙은 런타임 단계에 동적으로 메모리를 할당받는 데이터들이 저장되는 영역이다. 스택에는 지역변수, 매개변수, 함수의 호출 정보 등이 계속해서 저장된다. 힙에는 동적으로 할당되는 변수들이 저장된다.
- 데이터와 코드 영역
데이터 영역과 코드 영역은 컴파일 단계에 정적으로 메모리를 할당받는 데이터들이 저장되는 영역이다. 데이터 영역에는 전역 변수, static 이나 const로 선언되는 변수들이 저장된다. 코드 영역에는 프로그램을 실행시키는 실행 파일 내의 명령어들, 즉 코드가 저장된다.
스레드
스레드는 프로세스의 실행 가능한 가장 작은 단위이다. 하나의 프로세스는 여러 스레드를 가질 수 있다.
코드, 데이터, 스택, 힙을 각각 생성하는 프로세스와 달리 스레드는 코드, 데이터, 힙은 공유하되, 그 외 스택 등의 영역은 각각 생성된다.
상태 변화
컴퓨터에서 하나의 코어에 실행되는 프로세스는 하나이기 때문에, 다음과 같은 여러가지 상태 값으로 실행 여부를 표현한다.
프로세스의 상태는 크게 실행 상태, 비실행 상태로 구분된다. 프로세스의 실행 상태와 비실행 상태는 준비, 실행, 대기로 구분될 수 있으며, 프로세스는 준비, 실행, 대기로 변화하면서 종료가 된다.
준비 -> 실행 (Dispatch) 준비 큐 맨 앞에 있던 프로세스가 프로세서를 점유 하는 것.
실행 -> 준비 (Timeout) 프로세스가 프로세서를 독점하지 못 하도록 인터럽트 클록을 두어 특정 시간동안만 (할당된 시간만큼만) 프로세서를 점유하게 한다.
실행 -> 대기 (Block) 할당된 시간 이전에 실행상태의 프로세스에 입출력 연산 등이 필요하거나 새로운 자원 요청의 문제로 프로세서를 스스로 양도하는 상태
대기 -> 준비 (Wakeup) block 상태의 프로세스가 입출력 작업이 끝나면 대기에서 준비 상태가 된다.
컨텍스트 스위칭
컨텍스트 스위칭(Context Switching)이란, 여러 프로세스를 처리해야 하는 상황에서 현재 진행중인 작업의 상태를 PCB에 저장하고, 다음에 진행할 작업의 상태 값을 읽어 적용하는 과정을 말한다.
컨텍스트 스위칭 과정은 간단하다.
- 프로세스 P1의 실행 정보를 PCB1에 저장한다.
- 프로세스 P2의 PCB2를 불러와 실행한다.
- 프로세스 P2의 실행 정보를 PCB2에 저장한다.
- 프로세스 P1의 PCB1을 불러와 실행한다.
컨텍스트 스위칭에는 많은 비용이 소모된다.
- PCB를 저장하고 불러오는 과정에서 발생하는 유휴(Idle) 시간
- 이전 프로세스의 메모리 주소와 캐시를 초기화 하는데 발생하는 시간
- 캐시가 초기화 되면서 발생할 캐시미스
만약 스레드 간에 컨텍스트 스위칭이 일어난다면, 스레드는 스택 영역을 제외한 모든 메모리를 공유하기 때문에 비용이 적고, 시간도 적게 걸린다.
PCB
PCB(Process Control Block)이란, 운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓은 것으로, 프로세스의 상태 정보를 저장한 ‘데이터’를 말한다. 프로그램이 실행되면 프로세스가 생성되고, 프로세스 주소 값들에 스택, 힙 등의 구조를 기반으로 메모리가 할당되는데, 이 데이터들이 PCB에 저장되어 관리되는 것이다.
PCB에는 다음과 같은 내용이 저장된다:
- Process State: 생성, 준비, 실행, 대기, 종료 중에 해당하는 상태 정보를 저장한다.
- Process Number: 프로세스의 아이디 정보를 저장한다.
- Process Counter: 다음에 실행할 명령어의 주소를 가리키는 카운터를 저장한다.
- CPU Register: 프로세스를 실행하기 위해 저장해야할 레지스터에 대한 정보를 저장한다.
- CPU-Scheduling information: CPU 스케줄러에 의해 중단된 시간 등에 대한 정보를 저장한다.
- Memory-management information: 프로세스의 메모리 관리 시스템(페이지 혹은 세그먼트 테이블)에 대한 정보를 저장한다.
- Accounting information: 프로세스 실행에 사용된 CPU 사용량, 유저 정보를 저장한다.
- I/O status information: 프로세스에 할당된 I/O 장치들의 목록을 저장한다.
예상 질문
- 프로세스는 무엇인가요?
답변
1. 프로세스란, **메모리에 할당되어 실행되고 있는 프로그램의 인스턴스**를 말합니다. 2. 프로세스는 명령어를 수행하기 위해 각각 독립된 메모리 영역을 할당 받고, 기본적으로 최소 하나의 스레드를 가지고 있습니다. 3. 프로세스는 각각 별도의 주소 공간에서 실행되며, 기본적으로는 다른 프로세스의 자원에 접근할 수 없습니다.- 프로세스와 스레드의 차이점을 설명해 주세요.
답변
1. 먼저 간단히 말하자면, * 프로세스는 컴퓨터로부터 자원을 할당 받은 작업의 단위이고, * 스레드는 그런 작업 내에서 실행 흐름의 단위입니다. 2. 이렇게 말하는 이유는 프로세스는 최소 하나, 또 그 이상의 스레드를 내부에 포함하고 있기 때문입니다. * 프로세스가 생성될 때에는 코드, 데이터, 힙, 스택을 위한 자원을 각각 따로 받지만, * 스레드가 생성될 때에는 같은 프로세스 내의 코드, 데이터, 힙은 공유하되, 그 외의 스택 등의 영역만 따로 할당 받습니다.- 힙 영역과 스택 영역의 차이점을 설명해주세요.
답변
1. 힙과 스택 영역 모두 런타임에 할당되는 데이터를 저장하는 공간입니다. 2. 스택에는 지역변수, 매개변수 등이 저장되고, 함수가 호출될 때 할당되고 호출이 끝나면 사라집니다. 높은 주소부터 낮은 주소 순서로 저장됩니다. 3. 힙에는 동적으로 할당되는 변수들이 저장되고, 사용자가 할당과 해제를 관리합니다. 낮은 주소부터 높은 주소 순서로 저장됩니다.- 컨텍스트 스위칭이 무엇인지 설명해주세요.
답변
프로세스, 혹은 스레드를 통해 여러 작업을 처리해야 하는 상황에서 현재 진행중인 작업의 상태를 PCB나 TCB에 저장하고, 다음에 진행할 작업의 상태 값을 읽어 적용하는 과정을 말합니다.- PCB는 무엇인가요?