프로세스의 개념
- program in execution
- 실행중인 프로그램
프로세스의 문맥(context)
- 프로그램이 무엇을 어떻게 실행했는지, 현재 시점이 어느 상태에 있는지 나타내기 위해 사용되는 개념
- 특정 시점을 기준으로 어디까지 실행이 되었는지 규명하는 데 필요한 요소.
(1) CPU수행 상태를 나타내는 하드웨어 문맥
- 현재 시점에 program counter가 프로세스의 어떤 코드를 가리키는지, register에 어떤 값이 저장되어있는지 등
(2) 프로세스의 주소 공간
- 메모리 관련
- 프로세스의 주소공간 code, data, stack에 어떤 내용이 담겨있는가
(3) 프로세스 관련 커널 자료 구조
- 프로세스가 실행될 때마다 생성되는 PCB(Process Control Block) 를 통해 운영체제가 프로세스를 관리 함.
- Kernel stack 각 프로세스가 자신의 코드를 실행중일 때는 자신의 스택에 함수 관련 작업 수행. 시스템콜을 하게 되면 kernel stack에 함수 관련 정보 쌓음
- 프로세스별로 커널 스택을 별도로 둠
→ 현대의 운영체제는 멀티 프로세싱이기 때문에 프로세스이 문맥이 중요함.
프로세스의 상태 Process State
Running
- CPU를 잡고 instruction을 수행중인 상태
Ready
- CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고 CPU만 얻으면 실행가능한 상태 )
- 당장 수행에 필요한 부분은 메모리에 올라가 있어야 함
Blocked(wait, sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- Process 자신이 요청한 event(I/O작업과 같이 오래걸리는 작업)가 즉시 만족되지 않아 이를 기다리는 상태
- ex. 디스크에서 파일을 읽어와야 하는 경우
- 자신이 요청한 event가 만족되면 Ready
Suspended(stopped) → 중기 스케줄러의 상태 표현
메모리에 너무 많은 프로세스가 올라와 있을 때
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 swap out된다
- 사용자가 프로그램을 일시정지시킨 경우 (break key)
- 시스템이 여러 이유로 프로세스를 잠시 중단시킴
- 외부에서 resume해주어야 Active
**New : 프로세스가 생성중인 상태
**Terminated : 수행이 끝난 상태
- 자진해서 CPU를 내놓는 경우 : i/o작업같이 오래걸리는 작업
- timer interrupt : CPU를 여러 프로세스에 분배하기 위함
- 수행 중간에 i/o 작업을 많이 하는 경우 : blocked했다가 다시 CPU얻고..
- terminated : 프로세스 종료
- CPU는 한번에 하나의 프로세스만 running가능, timer interrupt로 ready queue의 프로세스들이 차례로 CPU를 얻어 수행
- 프로세스 수행 중에 I/O작업을 해야하는 경우, 해당 프로세스의 상태는 Running에서 Blocked으로 변화, I/O queue에 줄서게 됨
- Disk는 controller의 지휘 하에 큐에 있는 프로세스들 수행, 수행이 끝나면 CPU에 인터럽트를 걸어 수행이 끝났음을 알리고, CPU제어권이 커널에 넘어감. 커널에서 I/O작업에 대한 처리 + 그 프로세스의 상태를 Blocked에서 Ready로 바꾸고 그 프로세스는 레디 큐에 들어가게 됨
- 공유데이터와 같은 소프트웨어 자원에 여러 프로세스가 동시에 접근할 경우, 프로세스는 blocked상태가 되어 리소스 큐에 줄서게 됨.
Process Control Block PCB
- 각 프로세스를 관리하기 위해 두는 프로세스당 유지하는 정보
(1) OS가 관리상 사용하는 정보
- Process state, Process ID, scheduling information, priority
(2) CPU 수행 관련 하드웨어 값
- Program counter, registers
(3) 메모리 관련
(4) 파일 관련
문맥 교환 Context Switch
- CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
- 짧은 간격으로 CPU를 뺏고 부여하기를 여러 프로세스에 반복. 빼앗는 시점의 문맥을 기억했다가 다시 부여할 때 그 시점에서부터 시작
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
- 사용자 프로그램에서 system call이나 interrupt로 운영체제에 CPU가 넘어가는 것은 context switch가 아님.
- 운영체제에서 다른 사용자 프로그램으로 CPU가 넘어갈 때는 context switch
- 인터럽트나 시스템콜을 처리하고 운영체제에서 원래 시스템에 CPU가 넘어가는 것은 문맥교환이 아님
프로세스 스케줄링 큐
Job queue
Ready queue
- 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
Device queues
- I/O device의 처리를 기다리는 프로세스의 집합
스케줄러 scheduler
Long-term scheduler 장기 스케줄러 / job scheduler → 현재 시스템에서는 사용 안함
- 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
- 프로세스에 memory 및 각종 자원을 주는 문제
- degree of Multiprogramming(메모리에 몇개의 프로그램이 올라갈 것인가)을 제어
- time sharing system에는 보통 장기 스케줄러가 없음 (무조건 ready)
Short-term scheduler 단기 스케줄러 / CPU scheduler
- 어떤 프로세스를 다음번에 running 시킬지 결정
- 프로세스에 CPU를 주는 문제
- 충분히 빨라야 함(millisecond 단위)
Medium-term scheduler 중기 스케줄러 / Swapper
- 무조건 ready상태가 되는 현대의 시스템에서 메모리에 많은 프로세스가 동시에 올라가게 되는 문제를 조절하기 위해
- 여유 공간 마련을 위해 일부 프로세스를 통째로 메모리에서 디스크로 쫓아냄
- 메모리에 올라가는 프로세스의 수를 제어. degree of Multiprogramming
- 프로세스에게서 memory를 뺏는 문제