프로세스와 스레드
1. 프로세스
실행중인 프로그램 (program in excution)
중요! context : 프로세스의 문맥
- 프로세스의 수행 상태를 나타냄
- 하드웨어 문맥 : CPU의 프로세스 카운터(PC)가 프로세스 메모리에 있는 특정 코드를 가리킴
- 프로세스의 주소공간 : code | data | stack
- 커널도 주소공간을 가짐
- data에 PCB 존재
- PCB(Process Control Block) -> 프로세스가 실행될 때마다 운영체제는 PCB를 보고 결정
- 프로세스를 실행하다가 운영체제에게 요청할 때(System Call)는 PC가 커널의 주소공간을 가리킴
2. 프로세스의 상태
(CPU가 하나일 때로 가정)
Running
Ready
- CPU를 기다리는 상태
- 실행을 위한 준비는 된 상태
Blocked
- 또는 sleep, wait
- CPU를 줘도 당장 실행할 수 없는 상태
- 요청한 이벤트가 완료되면 ready가 될 수 있음
- ex) 오래걸리는 I/O 작업, 디스크를 읽어오는 작업, 공유 자원을 가져올 때 등
Suspended(stopped)
- 외부적인 이유로 프로세스 수행이 정지된 상태
- 프로세스가 디스크로 swap out된 경우
- 외부에서 resume해줘야 실행 가능
- ex) 사용자가 일시정지 시킨 경우
+ 추가적으로 넣기도 하는 상태
- new: 프로세스가 생성 중인 상태
- Terminated: 수행이 끝나고 정리하는 상태
상태 변화
- ready queue에서 기다리다가 실행 후 다시 맨 뒤로 들어가서 CPU를 기다림
- 커널이 자료구조로 큐를 만들어놓고 CPU를 주고 안주고 관리함
3. PCB
- 운영체제가 프로세스를 관리하기 위해 프로세스마다 유지하는 정보 정보
PCB의 구성
1) 운영체제가 관리상 사용하는 정보
- 프로세스 상태, 프로세스 ID
- 스케줄링 정보, 우선순위
2) CPU 수행 관련 하드웨어 값
3) 메모리 관련
4) 파일 관련
4. 문맥 교환(context Switch)
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
(+ 스레드 사이에서도 문맥 교환은 발생함. 아래는 프로세스 문맥 교환에 관한 내용)
문맥 교환 작업
- 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- 새롭게 얻는 프로세스 상태를 PCB에서 읽어옴
커널 모드 시 문맥 교환
- System Call이나 Interrupt 시 반드시 Context Switch가 발생하는 것은 아님
유저 모드 --(system call 또는 interrupt)--> 커널모드 ---> 유저 모드(=같은 프로세스)
- timer interrupt 또는 I/O 요청하는 오래걸리는 작업을 system call 해서 다른 프로세스로 넘어갈 경우 문맥 교환이 발생
- 다른 프로세스로 넘어가지 않아도 커널 모드로 가면 현재 상태를 저장하긴 하지만 문맥 교환만큼의 작업은 발생하지 않음
5. 프로세스 큐
Job Queue
- 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready Queue와 Device Queue에 있는 프로세스가 포함됨
Ready Queue
- 현재 메모리에 있으며 CPU를 기다리고 있는 프로세스의 집합
Device Queue
- I/O Device의 처리를 기다리는 프로세스의 집합
- 프로세스는 Ready <-> Device를 이동하면서 작업
6. 스케줄러
Short-term scheduler
- CPU 스케줄러
- 다음에 어떤 프로세스를 실행할지 결정
- 프로세스에 CPU를 주는 문제
Long-term scheduler
- job 스케줄러
- new인 프로세스 중 어떤 프로세스를 ready queue로 보낼지
- 프로세스에 메모리를 주는 문제
- 메모리에 너무 많거나 적은 프로세스가 올라가면 성능이 떨어지기 때문에 적절히 조절
- 현재 보통 시스템에서는 장기 스케줄러 없이 곧바로 메모리에 올림 -> 그럼 어떻게 조절? = Medium-term
Medium-term scheduler
- Swapper
- 메모리의 여유 공간을 마련하기 위해 프로세스를 메모리에서 디스크로 쫒아냄
- 프로세스에게서 메모리는 뺏는 문제
- Suspended 상태로 변하게 하는 이유
(막간 질문)
➕ 동기식 vs 비동기식 입출력
동기식
- 입출력을 요청한 프로세스가 결과를 기다림
- CPU를 다른 프로세스에게 넘겨주거나 or 낭비하면서 기다리게 할 수도 있음
비동기식
7. Thread
CPU의 프로세스 수행 단위
- 하나의 프로세스에서 여러 스레드를 사용하면 프로그램 카운터가 여러 곳을 가리킴
- task : 동료 스레드와 공유하는 부분
장점
Responsiveness
- 스레드 하나가 blocked일 때 같은 task 내의 다른 스레드가 실행되어 빠른 처리가 가능
Resource Sharing
- 같은 일을 하는 프로세스를 여러 개 가지면 메모리를 낭비하게 되는데 하나의 프로세스 안에 여러 스레드를 사용하여 자원을 절약할 수 있음
Economy
- 프로세스를 변경하는 문맥 교환이 발생하지 않음
Utilization of MP Architectures
- CPU가 여러 개일 경우 병렬성을 높일 수 있음
➡️ 생각해볼 개념
스레드 vs 프로세스 vs 프로그램
스레드
- 프로세스 내에서 세분화한 실행 단위
- 할당받은 자원을 실행하는 단위
프로세스
- 실행되는 프로그램
- 운영체제로부터 자원을 할당받는 단위
프로그램
- 특정 작업을 수행할 수 있는 파일
- 디스크에 있지만 메모리에 올라와 있지 않은 상태
프로세서
- 명령어를 실행하는 부분으로 보통 CPU를 일컫는다
멀티 프로세스 vs 멀티 스레드
멀티 프로세스
하나의 프로그램을 여러 프로세스로 구성하여 한 프로세스가 하나의 작업을 처리
장점
- 프로세스 중 하나에 문제가 발생해도 해당 프로세스만 죽을 뿐 프로그램은 정상 작동 가능
단점
- 문맥 교환시 오버헤드 발생
- 프로세스 문맥 교환 시 캐시 메모리 초기화같은 작업이 필요
- 공유 변수를 사용할 수 없어 프로세스 간 통신이 필요(IPC)
멀티 스레드
하나의 프로세스를 여러 스레드로 구성하고 각 스레드가 하나의 작업을 처리
장점
- 프로세스 컨텍트 스위칭이 발생하지 않음
- 프로세스 간 보다 스레드 간 통신이 더 간편
- 자원을 절약할 수 있음
단점
- 자원을 공유하기 때문에 동기화 문제에 신경써야 함
현대는 멀티 코어이기 때문에 멀티 스레드 + 멀티 프로세스 방식을 사용
(만약 단일 코어라면 멀티 스레드 방식이 유리)
참고 링크
운영체제 스터디 - 2. 프로세스 vs 스레드
반효경님 강의 - 프로세스
[운영체제(OS)] 3. 프로세스(Process)
프로세스와 스레드의 개념과 차이