[OS] 프로세스 상태(Ready, Running, Blocked)와 선점형/비선점형 스케줄러
1. 프로세스 상태
초기 컴퓨터에서 한정된 컴퓨팅 자원으로 여러 프로그래밍을 동시에 실행하(는 것처럼 보이)고 싶어 CPU가 여러 프로세스를 바꿔치기하면서 그때그때 적당한 프로세스를 실행하게 했고 그걸 가능하게 한 것이 스케줄러다. 간단한 키보드 입력 같은 경우에는 바로 실행이 끝나지만, 프로세스 도중에 파일을 읽고 출력을 해야 하는 프로그램이 있다면, 저장매체에서 파일을 읽어와서 다시 돌아오는 도중에는 프로세스가 wait 상태로 실행하지 않는 상태다. 미리 CPU가 파악을 하고 있어야 프로세스가 멈춘 상태일 때 대기 중인 상태의 다른 프로세스를 먼저 실행시킬지 판단할 수 있다. 프로세스 상태에 대해 좀 더 알아보자.
1. 프로세스 생성(new) - 생성중인 프로세스
2. 실행 가능(ready) - CPU에서 실행 가능 상태, 실행 대기 상태
3. 실행중(running) - 현재 CPU에서 실행 중인 상태
4. 대기(blocking) - 특정 이벤트 발생 대기 상태, waiting 상태, 예: 저장매체 파일 읽기 중
5. 종료(exit) - 프로세스 종료 상태. 짧은 시점이다.
위의 5가지 중에 실행 가능, 실행중, 대기 상태가 핵심이다. 이전 글에서 알아본 스케줄링 알고리즘과 이다음에 정리할 선점형/비선점형 스케줄러까지 종합하여, 프로세스 스케줄링 예시를 한 번 만들어볼 것이다.
2. 선점형/비선점형 스케줄러
스케줄러는 초당 몇백 번을 CPU에게 프로세스 전환을 요청해야 하기 때문에 시간을 단축하기 위해 어셈블리어를 사용해서 운영체제 내에 코드를 짠다. 그만큼 구현하기도 어렵기 때문에 선점형, 비선점형 스케줄러의 차이점만 명확히 알고 있으면 된다.
선점형 스케줄러(preemptive scheduling)은 하나의 프로세스가 다른 프로세스 대신에 CPU를 차지할 수 있도록 하는 스케줄러다. 프로세스 a가 running 상태로 선점하고 있던 CPU를 강제로 프로세스 b가 실행되도록 바꿔줄 수 있는 것이다. 비선점형 스케줄러(non-preemptive scheduling)는 하나의 프로세스가 완전히 끝나야만 다른 프로세스가 CPU를 사용할 수 있게 되는 스케줄러다. 프로세스가 자발적으로 block 상태 또는 end 상태가 되어야 다음 태스크를 수행할 수 있다. 초기 컴퓨터가 등장했을 때는 비선점형 스케줄링이 주류였는데 지금은 사용자가 원하는 대로 CPU 사용을 그때그때 바꿀 수 있는 선점형 스케줄링이 주류다.
이전까지 알아본 기본적인 스케줄러 알고리즘을 둘로 구분하면 다음과 같다.
모든 방식을 조합해서 스케줄링을 다음과 같이 해볼 수 있다.
시분할 2초 단위, 프로세스 상태 고려, 정적 우선순위 기반, 선점형 방식을 조합하니 그럴듯한 프로세스 스케줄링이 가능했다. 현실의 프로세스 스케줄링은 이것보다 훨씬 복잡하다.