-
728x90
임계구역의 해결 방법은 간단하다. 한 번에 실행할 수 있는 프로세스의 개수만큼 임계구역을 사용하도록 하고 기다리는 프로세스를 잘 관리해주면 된다.
1. 잠금(lock)
프로세스 P1은 임계구역에 들어가면서 잠금을 건다. 다른 프로세스 P2는 잠금이 걸려 있는 것을 보고 바쁜 대기한다. 임계구역 사용을 마친 P1은 잠금을 푼다. 잠금이 풀린 것을 확인한 P2는 임계구역에 들어간다.
간단한 시나리오지만 부족한 점이 많다. 두 프로세스가 동시에 접근했을 때 같이 임계구역에 들어갈 수도, 둘 다 못 들어갈 수도 있다. 이를 해결하기 위해 피터슨, 데커 알고리즘이 등장했지만 현재는 잘 사용되지 않는다.
2. 세마포어
Semaphore(n)
을 통해 전역 변수RS
를 n으로 초기화한다. RS는 현재 사용 가능한 자원의 개수이다. RS에 따라 2가지 시나리오가 가능하다.- RS > 0
사용 가능한 자원이 있는 경우다.P()
함수를 실행해 RS의 값을 1 감소시키고 프로세스는 임계구역에 진입한다. - RS == 0
사용 가능한 자원이 없는 경우다. 프로세스는 세마포어 큐에서 임계구역에 진입할 때까지 대기한다.
프로세스의 임계구역 사용이 끝나면
V()
함수를 실행해 세마포어는 RS의 값을 1 증가시키고 다음 프로세스에게 임계구역을 사용하라는 동기화 신호를 보낸다. 그렇기 때문에 대기하는 프로세스는 바쁜 대기를 할 필요가 없다.3. 모니터
세마포어만 해도 괜찮아 보이지만 문제점이 있다. 세마포어를 사용하지 않거나
P()
함수만 2번 사용하는 등 프로세스가 세마포어의 의도대로 코드를 실행하지 않는다면 문제가 발생할 수 있다. 이를 해결한 것이 모니터다.모니터는 임계구역에 접근하는 인터페이스를 강제해 프로세스가 임의로 다른 일을 못하도록 만든 것이다. 일종의 프로세스와 임계구역의 중재자 역할을 하는 것이다.
- 프로세스는 임계구역에 진입하기 위해 모니터에 작업 요청을 한다.
- 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고 결과만 프로세스에게 알려준다.
마치 사용자 프로세스와 커널 프로세스의 관계와 같다. 모니터는 임계구역 보호와 동기화를 위해 내부적으로
상태 변수
를 사용한다.- wait() : 모니터 큐에서 자신의 차례가 올 때까지 기다린다. 세마포어의 P()와 같다.
- signal() : 모니터 큐에서 기다리는 다음 프로세스에 순서를 넘겨준다. 세마포어의 V()와 같다.
728x90'운영체제' 카테고리의 다른 글
19. 다중 자원과 교착상태 검출 (0) 2021.09.22 18. 교착 상태 (0) 2021.09.22 16. 공유 자원과 임계구역 (0) 2021.09.22 15. 프로세스 간 통신 (0) 2021.09.22 14. 인터럽트 처리 (0) 2021.09.22 댓글
- RS > 0