3. 프로세스
프로세스의 개념
프로세스는 실행중인 프로그램이다
프로세스의 문맥 (context)
- CPU 수행 상태를 나타내는 하드웨어 문맥: Program Counter, 각종 Register
- 프로세스의 주소 공간: code, data, stack
- 프로세스 관련 커널 자료 구조: PCB, Kernel stack
프로세스의 상태
- Running: CPU를 잡고 instruction을 수행중인 상태
- Ready: CPU를 기다리는 상태(메모리 등 다른 조건 모두 만족)
- Blocked (wait, sleep):
CPU를 주어도 당장 instruction을 수행할 수 없는 상태
요청한 event가 만족되지 않아 기다리는 상태 (오래 걸리는 작업 등)
- New: 프로세스가 생성중인 상태
- Terminated: 프로세스가 종료중인 상태
PCB를 통해서 각 프로세스가 어떤 상태인지 관리
CPU가 넘어가려면 인터럽트 발생해야 함
Process Control Block (PCB)
운영체제가 각 프로세스를 관리하기 위해 프로세스마다 유지하는 정보
- OS가 관리상 사용하는 정보
- 프로세스 상태, 프로세스 ID, 우선순위 관리
- CPU 수행 관련 하드웨어 값
- Program Counter - CPU를 뺏기기 전에 상태 저장
- 메모리 관련
- 파일 관련
문맥 교환 (Context Switch)
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
CPU 내어주는 프로세스의 상태 저장, CPU 얻는 프로세스 상태 읽어옴 → PCB
주의!! 사용자 프로세스 A에서 커널로 CPU가 넘어가는 것은 문맥 교환 X
문맥 교환이 일어나는 경우 overhead가 훨씬 큼 (ex. cache memory flush)
프로세스를 스케줄링하기 위한 큐
- Job queue: 현재 시스템 내 모든 프로세스
- Ready queue: CPU 실행 기다리는 프로세스
- Device queues:I/O device 처리 기다리는 프로세스
스케줄러 (Scheduler)
- Long-term scheduler (장기 스케줄러 / Memory scheduler)
- 프로세스에 memory를 주는 문제
- degree of Multiprogramming을 제어
- time sharing system에는 보통 장기 스케줄러가 없음
- Short-term scheduler (단기 스케줄러 / CPU scheduler)
- 프로세스에 CPU를 주는 문제
- 매우 자주 호출, 충분히 빨라야 함
- Medium-term scheduler (중기 스케줄러 / Swapper)
- 모든 프로세스 ready 상태로 만든다
- 메모리 부족하면 프로세스를 통째로 디스크로 쫓아냄
- 프로세스에서 memory를 뺏는 문제
- degree of Multiprogramming을 제어
프로세스 상태 추가
Suspended (stopped)
외부적인 이유(OS, 사람 등)로 프로세스 수행이 정지된 상태
Blocked: 자신이 요청한 event 만족되면 Ready - active
Suspended: 외부에서 resume해 주어야 Active - inactive
Blocked → Suspended Blocked
Ready → Suspended Ready
Wakeup을 통해 넘어갈 수 있음
Thread (lightweight process)
CPU 중에서 프로세스 실행 단위
동일한 프로그램을 여러개 실행하면 프로세스 하나만 생성해서 공유
각 프로그램에서 실행중인 부분만 따로 관리
PCB에서 Program counter, Register값 따로 관리
문맥 교환이 필요 없기 때문에 효율적
Thread = Program counter + register set + stack space
동료 thread와 공유하는 부분: code, data, OS resources
Thread 장점
- Responsiveness - 한 스레드가 blocked 상태인 동안에 동일 태스크 내의 다른 스레드가 실행되어 빠른 응답 가능
- Resource Sharing
- Economy - 프로세스 1개 만드는 경우가 스레드 1개 만드는 경우에 비해 overhead 30배 / 문맥 교환 overhead 5배
- Utilization of MP Architectures
Thread 구현
- Kernel Threads: 운영체제가 스레드의 존재를 알도록 구현
- User Threads: 운영체제가 스레드의 존재를 모름 → 프로세스 내부에서 처리