실행 중인 프로그램 program on executing
프로세스의 현재 상태를 나타내는데 필요한 모든 요소를 프로세스 문맥이라고 함
특점 시점에 프로세스가 어느만큼 작업을 했고 과연 이 프로세스가 어디까지 와있는지
프로그램 카운터(PC)가 어느 부분을 가리키고 있는가 → 코드의 어디까지 실행했는가
참고
프로그램 카운터(PC) : 코드에서 실행하는 부분을 가리키고 있는 장치
참고
메모리 주소 공간 → code / data / stack
레지스터에 어떤 값을 넣어놓고 어떤 명령까지 실행했는가
Q. 왜 프로세스의 문맥 파악이 필요할까?
A. CPU는 계속 여러 프로세스를 번갈아 담당하기 때문에 어떤 프로세스를 어디까지 작업했는지 알아야 함. 그렇지 않으면 매번 처음부터 다시 실행해야 하기 때문.
프로세스를 CPU에게 할당하는 과정
프로세스의 처리를 위한 각각의 큐가 존재 → ready queue, IO device queue, resource(공유 데이터) queue 등
프로세스는 상태에 따라 큐에 가서 줄을 서고 작업이 해결되기를 기다림
참고
Queue → First In First Out
Job queue : 메모리 할당을 기다리는 모든 프로세스
Ready queue : 메모리에 올라와서 CPU 할당을 기다리는 상태의 프로세스 (= ready 상태)
Device queue : 각 IO 디바이스의 작업을 기다리는 프로세스 (= block 상태)
Q. 시스템콜이나 인터럽트가 발생하면 반드시 문맥 교환이 일어나는 걸까?
A. 문맥 교환의 의미 → CPU가 작업하는 프로세스가 교체되는 것!
그렇기 때문에 시스템콜이나 인터럽트 이후 CPU가 다시 원래 작업하던 프로세스로 돌아가면 그건 문맥 교환이 일어나는 것이 아님. 따라서 시스템콜이나 인터럽트가 발생한다고 무조건 문맥 교환이 일어나는 것은 아니다.
Short-term 스케쥴러(CPU 스케쥴러) : 어떤 프로세스를 바로 다음에 running 시킬지 결정
→ 일반적으로 생각하는 스케쥴링의 의미
Long-term 스케쥴러(Job 스케쥴러) : 어떤 프로세스가 메모리에 올라갈지를 결정 → degree of multiprogramming을 제어
참고
degree of multiprogramming : ****메모리에 몇 개의 프로그램이 동시에 올라와 있는지
But, 실제 시스템에서는 장기 스케쥴러가 없음. 프로그램이 시작되자 마자 ready 상태(메모리에 올라가 있는 상태)가 되기 때문.
그러면 어떻게 메모리의 프로세스 수를 조정할까? → mid-term 스케쥴러를 사용
Medium-term 스케쥴러(Swapper) : 너무 많은 프로그램이 동시에 올라가 있을 때, 여유 공간 마련을 위해 일부 프로그램을 메모리에서 통째로 쫓아냄(swap out 시킴) → 이를 통해 degree of multiprogramming을 제어
장기 스케쥴러 vs 중기 스케쥴러
blocked vs suspended
참고
프로세스가 시스템콜 혹은 인터럽트로 인해 커널모드가 되었을 경우에도 프로세스가 running하고 있다고 간주