세마퍼라는 이름은 실제로 교차로에서 차들이 길을 가로지르지 못하도록 하는 차단기(arms)와 관련된 오래된 철도 용어이다. 또 간단한 세마퍼 집합이라고도 말하여 진다. 세마퍼가 켜져 있으면 (차단기가 올라가 있으면), 자원은 사용될 수 있다. (차들은 길을 건널 수 있다.) 그렇지만, 세마퍼가 꺼져 있다면 (차단기가 내려와 있다면), 자원은 사용할 수 없다. (차들은 기다려야만 한다.)
이런 간단한 예가 개념을 소개한다고 할 수도 있지만, 단순한 실체보다는 집합으로서 세마퍼가 실제적으로 구현되어지는 것을 이해하는 것이 중요하다. 물론, 주어진 세마퍼 집합이 우리의 기찻길 예처럼 한개의 세마퍼를 가지고 있을 수도 있다.
아마도 세마퍼에 대한 또 다른 접근은 그것들을 자원 카운터(resource counter)로 생각하는 것이다. 이 개념을 또 다른 실세계의 시나리오에 적용시켜보자. 각각의 프린터가 다중의 인쇄 요청을 다룰 수 있는 여러개의 프린터를 다룰 수 있는 능력을 가진 프린터 스풀러를 생각해 보자. 가상의 프린터 스풀 관리자가 각각의 프린터의 접근을 감시하기 위해 세마퍼 집합을 활용할 것이다.
공동의 5개의 프린터가 온라인으로 연결된 인쇄방(print room)을 가정해보자. 프린트 스풀 관리자는 시스템 상에 있는 각각의 프린터에 1개씩, 5개의 세마퍼를 가진 세마퍼 집합을 배치한다. 각각의 프린터는 물리적으로 한번에 한개의 작업을 인쇄할 능력을 가지고 있으므로, 집합안에 있는 다섯개 각각의 세마퍼는 모두 온라인 상태이며, 요청을 받을 수 있음을 의미하는 값인 '1'로 초기화 되어질 수 있다.
John이 스풀러에 인쇄 요청을 보낸다. 프린터 관리자는 세마퍼 집합을 보고 '1'값을 가진 첫번째 세마퍼를 발견한다. John의 요청을 물리적 장치로 보내기 전에 프린터 관리자는 프린터가 '-1'에 상응하는 값을 갖도록 세마퍼를 감소시킨다. 지금, 세마퍼의 값은 0이다. 시스템 V 세마퍼의 세계에서는 '0'값은 세마퍼 상에서의 100% 자원 활용을 의미한다. 우리의 예제에서는 더 이상 '0'과 같지 않을 때까지 그 프린터에 어떠한 요청도 보내지 않는다.
John의 인쇄작업이 끝났을 때, 프린터 관리자는 프린터에 대응되는 세마퍼의 값을 증가시킨다. 다시 사용가능함을 의미하는 값인 '1'로 복구된다. 자연히 5개의 세마퍼가 모두 '0'값을 갖는다면, 모두가 인쇄 요청으로 바쁨으로 사용할 수 있는 프린터는 없다.
이것이 간단한 예제라 할지라도, 집합안에 있는 각 세마퍼에 할당된 값인 '1'이라는 초기값에 혼동하지 말아라. 세마퍼를 자원 카운터처럼 생각할 때, '0' 또는 '1'로 국한되지 않는 양의 정수값으로 초기화될런지 모른다. 우리의 프린터가 한번에 10개의 인쇄작업을 할 수 있다면, 우리는 세마퍼들을 각각 10으로 초기화하고 모든 새 작업에 대해 '1'씩 감소시키고 인쇄작업이 끝날때마다 '1'씩 증가시킬 수 있다. 다음 장에서 보겠지만, 세마퍼는 같은 메모리 세그먼트에 다중의 쓰기를 방지하기 위해 감시인(watchdog)의 역할을 하는 공유 메모리 세그먼트를 사용하여 닫혀진 작업 관계를 갖는다.
연관된 시스템 호출을 탐구하기 전에, 세마퍼 동작을 수행하는 동안에 활용되는 다양한 내부 자료 구조를 통한 간단한 여행을 해 보자.
Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved
Email To:Webmaster ,
Another address
LAST UPDATE Nov 21,1997
Created Nov 21,1997