● Process Control Block (PCB)
운영체제가 각 프로세스를 관리하기 위해, 프로세스마다 해당 프로세스의 정보가 구조체로 구성되어 있는 정보이다. (프로세스 문맥)
1. 운영체제가 프로세스를 관리상 사용하는 정보
프로세스의 상태 (Ready, Running, Blocked), PID, 스케쥴링 정보, Priority 등을 담고 있다.
· Priority는 Queue에 먼저 온 순서대로 처리하지는 않고 스케줄링 기법마다 우선순위가 있는데 해당 정보를 나타낸다.
2. CPU 수행 관련 하드웨어 값
CPU에 어떤 레지스터 값을 넣어서 실행하고 있었지, 프로그램이 어디까지 실행이 되었는지 나타내는 Program Counter가 있다.
3. 메모리 관련
Code, Data, Stack이 메모리 어디에 위치해 있는지에 대한 정보가 있다.
4. 파일 관련
해당 프로세스가 어떠한 파일들을 사용하고 있는지에 대한 정보가 있다.
● 문맥 교환 (Context Switch)
CPU 제어권을 를 한 프로세스에서 다른 프로세스로 넘겨주는 과정이다. CPU가 다른 프로세스로 넘어갈 때 운영체제는 CPU를 내어주는 프로세스의 상태를 해당 프로세스의 PCB에 저장하고, CPU를 새롭게 얻는 프로세스의 상태를 해당 PCB에서 읽어온다.
· 각 해당 프로세스의 PCB는 커널 주소 공간의 Data 영역에 있다.
CPU는 굉장히 빠른 자원이기 때문에 프로세스는 짧은 시간 간격으로 CPU를 얻었다 빼앗겼다를 반복한다. 이 과정에서 프로세스를 다시 시작할 때, 프로세스를 처음부터 실행하는 게 아니라 빼앗긴 시점부터 다시 실행할 수 있게 하는 메커니즘이 필요하다. 이러한 정보들을 PCB에 저장한다.
문맥 교환이라는 것은 CPU가 사용자 프로세스에서 또 다른 프로세스로 넘어가는 과정을 말한다. Kernel Mode와 User Mode의 상태 변환을 말하는 것이 아니다. (헷갈리지 않게 주의 필요!) System Call은 프로세스가 운영체제에 어떠한 작업을 요청할 때, 인터럽트는 Device Controller 등이 CPU한테 정보를 전달할 목적으로 발생하는 것이다. 두 개 중 어떤 것이든 발생하게 되면 CPU 제어권이 사용자로부터 운영체제 커널로 넘어간다. 이러한 경우가 문맥 교환이 일어난다고 말하지 않는다는 것이다. 문맥교환은 사용자 프로세스 A로부터 사용자 프로세스 B로 넘어가는 과정을 말하는 것이다.
- 과정 (1)
사용자 프로세스 A가 User Mode에서 자신의 코드를 실행하다가 인터럽트나 System Call을 발생하면 CPU 제어권은 운영체제에 넘어가서 운영체제 커널은 Interrupt가 들어왔으면 Interrupt Service Routine (ISR)을 실행하고, System Call이 들어왔으면 관련된 커널 함수를 실행시킨다. 해당 과정이 끝나면 운영체제는 CPU 제어권을 사용자 프로세스에게 다시 넘겨준다.
→ 문맥교환이 이루어진 게 아니라, 단지 User Mode와 Kernel Mode를 왔다 갔다 한 것이다.
- 과정 (2)
사용자 프로세스 A가 실행되고 있다가 Timer 인터럽트가 들어오면, CPU 제어권은 프로세스 A로부터 프로세스 B가 갖게 된다. 또는 오래 걸리는 작업 (I/O 작업)이면 해당 프로세스는 당장 Instruction을 수행하지 못하기 때문에 Blocked 상태가 되며 다른 프로세스에게 CPU 제어권을 넘겨준다.
- 결론
CPU 제어권이 다른 프로세스로 넘어갔으면 문맥 교환이며, CPU 제어권이 다른 프로세스로 넘어가지 않았으면 문맥 교환이 아니다.
과정(1)의 경우에도 CPU 수행정보 등 context의 일부를 PCB에 저장해야 하긴 하지만 문맥 교환이 이루어지는 과정(2)의 경우가 그 부담이 훨씬 크다. 해당 이유를 설명하자면, CPU와 Main Memory 사이에는 속도가 매우 빠른 캐시 메모리가 있다. User Mode와 Kernel Mode 사이에서는 캐시 메모리를 Flush 해 줄 필요가 없지만, 문맥교환이 일어나면 프로세스가 사용하던 캐시 메모리를 전부 지워버려야 하기 때문이다. (Cache Memory Flush라고 함)
● 프로세스를 스케줄링하기 위한 Queue
- Job Queue : 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready Queue : 현재 물리적 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- Device Queue : I/O 디바이스의 처리를 기다리는 프로세스의 집합
→ Ready Queue에 있거나 Device Queue에 있는 프로세스는 Job Queue에도 포함되어 있지만, Ready Queue에 있으면 Device Queue에서 빠지고 Device Queue에 있으면 Ready Queue에서 빠진다.
● 프로세스 스케줄링 Queue의 모습
프로그램이 메모리에 올라오게 되면 Ready Queue에 줄을 서게 되고 자신의 차례가 되면 CPU 제어권을 얻어 실행을 한다. 할당 시간이 끝나거나 오래 걸리는 작업을 한다거나 하면 다시 Ready Queue의 뒤에 와서 줄을 서는 작업을 반복하다 본인의 역할이 끝나면 프로세스가 종료가 되어 빠져 나간다. CPU를 실행하다가 인터럽트가 걸리면 인터럽트가 끝날 때까지 해당 프로세스는 Ready Queue에 줄 서있다. (근데 정확하게는 잘못되었음. 인터럽트가 발생하면 Ready 상태로 넘어가는 건 아님. 아직은 잘 이해가 안 간다...) 또, 프로세스가 자식 프로세스를 생성하면 자식 프로세스가 실행되는 동안에는 Ready Queue에 줄 서서 기다려야 한다.
● 스케줄러 (Scheduler)
- 장기 스케줄러 (Long-term scheduler, Job scheduler)
메모리를 어떤 프로세스를 줄 지에 대한 결정을 한다. 프로세스가 시작이 되면 New 상태가 되는데 CPU 제어권을 가질 기회를 갖으려면 Ready 상태에 있어야 한다. 처음 프로세스가 시작되고 나서 메모리에 올라가지 못하면 아무것도 할 수가 없다. Job Scheduler가 메모리에 올라가는 걸 허락해주면 Ready 상태가 되어 기회가 왔을 때 CPU를 얻을 수 있다. 결국 Job Scheduler는 New 상태에 있는 프로세스를 메모리에 올려 Ready Queue로 보내어 Running 상태로 만들지를 결정한다. 그리고 degree of multiprogramming(메모리에 올라가는 프로세스의 수)을 제어한다.
- 단기 스케줄러 (Short-term scheduler, CPU scheduler)
굉장히 짧은 시간(ms) 단위로 이루어지며, 다음번에 어떤 프로세스한테 CPU를 줄지 결정한다. 어떤 프로세스를 다음번에 Running 시킬지를 결정한다는 뜻이다.
- 중기 스케줄러 (Medium-Term scheduler, Swapper)
우리가 보통 사용하는 스케줄러에서는 장기 스케줄러를 사용하지 않고 중기 스케줄러를 사용한다. 장기 스케줄러는 프로그램이 시작될 때 메모리에 올릴지 말지 결정하는데, 중기 스케줄러는 일단 메모리에 올라간다. 이렇게 되면 메모리에 너무 많은 프로그램이 올라가있게 된다. 일단 메모리에 올려놓고 너무 많은 프로그램이 올라가 있으면 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아낸다.
※ degree of multiprogramming : 메모리에 올라가있는 프로세스의 개수
다중 프로그래밍에선 메모리에 여러 프로세스가 올라가 있어야 CPU가 번갈아 가면서 실행할 수 있다. 그런데 너무 많은 프로세스가 메모리에 올라가게 되면(메모리를 너무 잘게 쪼개어 쓰면) 프로세스 실행에 필요한 명령어도 디스크 쪽에 있을 수 있다. 그러면 디스크로 접근하는 Swapping이 너무 자주 일어나기 때문에 메모리에 올라가 있는 프로세스가 적절한 개수로 조절되는 것이 필요하다.
프로세스 상태도에서 중기 스케줄러 때문에 Suspanded 상태가 추가되었다. 중기 스케줄러 때문에 메모리를 통째로 빼앗긴 프로세스의 상태가 표현은 기존의 세 가지 상태(Running, Ready, Wait)로는 표현이 되지 않기 때문이다. 프로세스에게서 메모리를 통째로 빼앗아 버리면 하던 일을 멈추고 정지 상태가 된다. 프로세스가 메모리에서 디스크로 Swap Out 된 상태라고 한다.
- bolcked : 자신이 요청한 일을 하면서 오래 기다리고 있는 상태. event가 만족되면 ready 상태로 돌아갈 수 있음.
- suspended : 외부에서 정지시켜놓은 상태이기 때문에 외부에서 다시 재개를 시켜줘야지 active 상태로 넘어갈 수 있음