May 20, 2020
참고도서: Operating System Concepts (10/E) Abraham Silberschatz, Peter B. Galvin, Greg Gagne
마치 세마포어가 임계구역 문제를 해결하는 만능열쇠처럼 보였지만 실상은 그렇지 않다. 다음 예시를 한번 보자.
P0
wait(S);
wait(Q);
.
.
.
signal(S);
signal(Q);P1
wait(Q);
wait(S);
.
.
.
signal(Q);
signal(S);프로세스 P1 과 P2가 임계구역 진입을 시도하려고 하는 것을 생각해보자. 그리고 세마포어는 1로 초기화 되어 있다고 가정하자. 위와 같은 상황에서 아래와 같은 상황이 발생한다. 편의상 P1과 P2 번갈아가며 실행한다고 생각해보자.
위 예시처럼 두 프로세스가 서로의 자원을 필요로 하게 되면, 서로 대기큐에 들어가 무한정하게 기다리는 상태가 되고 이런 문제를 우리는 deadlock 이라고 부른다.
교착 상태에 대한 더 자세한 이야기는 책을 더 정리하면서 추가하도록 하자.
교착상태와 비슷한 문제가 하나 더 있다. 세마포어의 대기 큐에서 대기하던 프로세스는 signal() 연산을 통해 대기 큐에서 제거되면 상태가 ready 상태로 바뀌고, 준비 큐로 들어가 디스패쳐의 스케줄링을 기다리게 된다. 이때 선입선출로 스케줄링 되는 것이 아니라 우선순위에 의해 스케줄링 되는 방식이라면(Priority Scheduling), 해당 프로세스가 우선순위가 낮을 경우 준비 큐에서 디스패처의 선택을 받지 못하고 계속 대기중인 상태가 될 여지가 있다. 이렇게 우선순위에서 계속 밀려서 스케줄링되지 못하고 계속 준비 큐에 남아있는 프로세스를 기아상태에 있다고 한다.
일반적으로 스케줄링 알고리즘을 수정해서 Round Robin 알고리즘을 Priority Scheduling 과 함께 사용하거나, aging 을 적용해서 대기시간에 따라 프로세스의 우선순위를 단계적으로 높이는 기법이 사용된다.
우선순위역전 문제는 기아상태 문제와 비슷한 맥락이다. 이 문제는 스케줄링이 가능한 프로세스가 3개 이상 존재할 때 발생한다. 다음과 같은 상황을 상상해보자.
우선순위는 존재하지만 세마포어 때문에 우선순위가 의미가 없어지는 역설적인 상황이다. 여기서 만약 기아상태 문제까지 발생해서 Plow 의 실행이 점점 더 늦춰진다면, Phigh의 우선순위는 정말로 의미가 없진다.
우선순위 역전 문제의 해결을 위해서 우선순위 상속 프로토콜(Priority-Inheritance Protocol) 을 사용할 수 있다. 우선순위 상속은 만약 어떤 프로세스가 자기자신보다 높은 우선순위를 가진 프로세스로 부터 자원을 요청받는다면, 해당 자원을 넘겨줄 때까지 프로세스의 우선순위를 상속받아 높이는 것이다. 이 방법을 사용하면 위 예시에서도 Plow가 Phigh의 요청을 받는 순간 우선순위를 최고순위로 높이면서 중간 우선순위 프로세스를 제치고 먼저 실행될 수 있도록 할 수 있다.