Operating System Concepts, 10th Edition을 읽고 정리하기 위해 작성하는 글입니다.
멀티프로그래밍의 목적은 CPU 활용도를 극대화하기 위해 항상 일부 프로세스를 실행하는 것이고, 타임 쉐어링의 목적은 CPU 코어를 프로세스 간에 자주 전환하는 것이다. 프로세스 스케줄러(process scheduler)는 멀티프로그래밍과 타임 쉐어링의 목적을 달성하기 위해 실행할 사용 가능한 프로세스를 선택한다.
멀티프로그래밍과 타임쉐어링의 목적을 균형있게 맞춰야 하는데 이를 I/O 바운드(I/O-bound)나 CPU 바운드(cpu-bound) 프로세스를 통해 이루어질 수 있다.
프로세스가 시스템에 들어오면 ready 큐에 들어간다음, 코어서 실행될 준비를 한다. ready 큐의 헤더에는 첫 번째 PCB의 포인터가 포함되고, 각 PCB에는 ready 큐의 다음 PCB를 가르키는 포인터 필드가 포함된다.
시스템에는 ready 큐를 제외한 다른 큐들도 포함된다.

위의 그림은 ready, wait 큐가 작동하는 과정을 보여준다.
프로세스 스케줄링는 큐잉 다이어 그램(queueing diagram)으로 보통 표현되는데 여기에는 ready, wait 큐의 집합이 존재한다.

위의 그림은 프로세스 스케줄링을 큐잉 다이어 그램으로 나타낸다. 여기서 원모양은 큐를 제공하는 리소스를 나타내고, 화살표는 시스템에서 프로세스의 흐름을 나타낸다.
프로세스는 종료될 때 까지 이 사이클을 반복하고, 종료되면 모든 큐에서 제거된다음 PCB와 리소스가 할당 해제된다.
CPU 스케줄러는 ready 큐에 있는 프로세스 중에서 선택하여 그 중 하나를 CPU 코어에 할당한다. 또, 새 프로세스를 CPU 코어에 자주 할당해야 한다.
I/O 바운드 프로세스는 보통 I/O 요청을 기다리기 전에 몇 밀리초 동안만 실행되고, CPU 바운드 프로세스는 더 오랜 시간 동안 CPU 코어가 필요하지만 스케줄러는 오랜 시간 동안 코어에 프로세스를 할당하는 방식 보다는 강제로 프로세스를 제거하고 다른 프로세스가 실행되도록 설계한다.
일부 운영 체제에는 스와핑(swapping)이라고 하는 중간 형태의 스케줄링이 존재하는데, 스와핑의 핵심은 메모리에서 프로세스를 제거하여 멀티프로그래밍의 정도를 줄이는 것이 유리할 수 있다는 점이다.
스와핑에서 프로세스는 메모리에서 디스크로 현재 상태가 저장되고, 나중에 디스크에서 메모리로 다시 상태가 복원된다. 스와핑은 일반적으로 메모리가 과도하게 커밋되어 해제해야할 때만 필요하다.
인터럽트가 발생하면 CPU 코어에서 실행 중인 프로세스의 현재 컨텍스트를 저장하여 처리가 완료되면 해당 컨텍스트(context)를 복원할 수 있어야 하며, 이때 프로세스를 일시 중단한 다음 다시 시작한다.
CPU 코어를 다른 프로세스로 전환하려면 현재 프로세스의 상태 저장과 다른 프로세스의 상태 복원을 수행해야하는데 이 작업을 컨텍스트 스위치(context switch)라고 한다.
컨텍스트 스위치가 발생하면 커널은 PCB에 저장된 이전 프로세스의 컨텍스트를 저장하고 예약된 새 프로세스의 컨텍스트를 로드한다.

위의 그림은 와 프로세스 간의 컨텍스트 스위치를 보여준다.
컨텍스트 전환 시간은 하드웨어에 크게 의존한다.