문맥교환: 프로세스를 다른 프로세스로 CPU 할당을 넘기는 것
교환 과정
문맥교환이 일어나는 경우와 아닌 경우
문맥교환에 소모되는 시간은 시스템에게 유용한 작업이 아니므로 오버헤드라고 볼 수 있다. 만약 타이머에 CPU 할당 시간을 아주 작게 설정하게 되면 문맥교환이 빈번하게 발생하기 때문에 오버헤드도 커지게 된다. 반대로 크게 설정하게 되면 시분할 시스템의 의미가 없어지기 때문에 적절한 CPU 할당 시간으로 설정하는 것이 중요하다.
Ready queue: ready state에 있는 프로세스를 줄 세우기 위해 레디 큐를 두고 레디 큐 맨 앞에 있는 프로세스를 먼저 CPU 할당 시킨다.
레디 큐 이외에도 특정 하드웨어 자원을 기다리는 프로세스들을 줄 세우기 위해 자원별로 device queue를 두고 있다.
공유 영역의 데이터의 일관성 유지를 위해 큐를 사용한다. 공유 데이터에 동시에 여러 프로세스들이 접근하려 할 경우 데이터를 기다리는 큐에 넣어 현재 데이터를 사용하고 있는 프로세스가 데이터를 반납하기 전까지 접근을 못하도록 막는다. 반납하고 나서는 큐에 삽입된 순서대로 프로세스에게 데이터의 접근 권한을 부여한다.
job queue: 시스템 내의 모든 프로세스를 관리하기 위한 큐, 모든 프로세스가 작업 큐에 포함되어 있다.
앞서 설명한 큐들은 링크드 리스트(노드가 PCB)로 구현되어 있다.
스케줄러: 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널 코드
스케줄러의 종류: 장기 스케줄러, 단기 스케줄러
장기 스케줄러는 작업 스케줄러, 시작 상태의 프로세스를 레디 큐에 삽입할지 결정하는 역할, 프로세스에게 메모리를 할당하는 부분에 관여한다.
장기 스케줄러는 메모리에 올라가 있는 프로세스의 수(degree of multiprogramming)를 조절하는 역할을 한다.
시분할 시스템을 사용하는 현대의 컴퓨터 시스템에선 장기 스케줄러를 두지 않는다고 한다. 프로세스가 시작 상태가 되자마자 메모리를 할당받아 준비 큐에 삽입된다.
따라서 장기 스케줄러를 두지않고 중기 스케줄러를 두는 경우가 많다.
중기 스케줄러는 너무 많은 프로세스에게 메모리를 할당해 시스템의 성능이 저하되는 경우 이 문제를 해결하기 위해 메모리에 적재된 프로세스의 수를 동적으로 조절하기 위해 추가된 스케줄러이다.
만약 너무 많은 프로세스가 메모리에 적재되어 남은 메모리 용량이 거의 없어질 경우 CPU 수행에 필요한 프로세스의 주소 공간조차도 메모리에 올려놓기 어려운 상황이 발생할 수 있다. 이 경우 메모리에 올라와 있는 프로세스 중 봉쇄 상태인 프로세스를 골라 메모리를 빼앗아 그 내용을 디스크의 스왑 영역에 저장해둔다(swap out). 봉쇄 상태인 프로세스를 고른 이유는 어차피 당장 CPU 할당받을 가능성이 없어서 메모리도 보유할 필요가 없기 때문이다.
스왑 아웃 시켰는데도 메모리가 모자랄 경우, 중기 스케줄러는 타이머 인터럽트가 발생해 준비큐로 이동하는 프로세스를 추가적으로 스왑아웃시킨다.
즉, 중기 스케줄러는 프로세스당 보유 메모리양이 지나치게 적어진 경우 완화시키기 위해 일부 프로세스를 메모리에서 디스크로 스왑 아웃시키는 역할을 맡는다.
중기 스케줄러의 등장으로 프로세스 상태에 중지 상태(suspended, stopped)가 추가되었다.
중지 상태에 있는 프로세스는 외부에서 재개시키지 않는 이상 다시 활성화될 수 없으므로 메모리 자원이 당장 필요하지 않다. 따라서 이 프로세스들은 메모리를 빼앗기고 디스크로 스왑 아웃된다.
CPU 스케줄러, 준비 상태의 프로세스 중, 어느 프로세스를 다음 번에 실행 상태로 바꿀 것인지 결정한다. 타이머 인터럽트가 발생하면 단기 스케줄러가 호출된다.