Monitor 를 이용한 상호 배제의 문제를 생산자-소비자(한계 버퍼) 문제에 적용하여 baci툴을 이용하여 구현한 것.

목표 및 내용

수업 시간에 배웠던 Monitor를 이용 상호 배제가 되도록 구현을 하는것 입니다. Monitor는 세마포어를 이용한 정확한 프로그램의 작성이 어렵기 때문에 고안된 것입니다. 기능은 세마포어와 동일하나 세마포어보다 제어가 더 쉽습니다. baci툴에서는 Hoare 의 방법이 이용됩니다. Monitor 의 구성요소는 C 언어에서의 구조체와 비슷하고 객체 언어에서는 클래스의 개념과 유사합니다. 구성 순서는 지역변수와 하나이상의 procedure 그리고 초기화 하는 문장의 순서대로 작성이 됩니다.  

모니터는 한 번에 하나의 프로세스만 모니터 내에 존재하게 하고, 공유데이터 보호를 위해서 모니터 구조 내에다가 공용변수를 둠으로써 상호 배제를 보장합니다. 모니터는 조건 변수를 통해서 조건이 만족될때 까지 대기하고 조건이 만족하여 가용 상태가 되면 대기 프로세스가 일을 수행 할 수 있도록 재진입 하게 됩니다.

조건변수에 적용하는 변수 두개는 wait연산과 signal연산이 있는데 baci 툴에서는 waitc, signalc 로써 사용 합니다.

 

소스코드

const int N = 10; //버퍼 변수 갯수를 정하는 변수

const int TRUE = 1; //참값

const int FALSE = 0; //거짓 값

monitor monSemaphore{ // baci cmimi ppt 의 예문을 토대로 작성을 하였습니다.

int buffer[N]; //공용변수

int nextin; //변수를 쓰고난 다음 변수를 지정하는 변수

int nextout; //사용한 변수를 나타내는 변수 사용하고나면 다음쓸변수로 값이 증가.

int count; //버퍼의 갯수를 세어서 공용버퍼가 비었는지 가득 찼는지를 비교 할 때 사용 하는 변수.

condition notfull; //조건변수 가득 찼음을 알리는 변수

condition notempty; //조건변수 비었음을 알리는 변수

void monP(int x) //생산자

{

if(count == N) //버퍼를 사용한 갯수가 버퍼의 크기랑 같으면

{

waitc(notfull); //대기상태로 빠트림

cout<<"-- buffer is full --"<<endl;

}

else //버퍼가 가득차지 않으면 else를 수행

{

buffer[nextin] = x; //외부에서 인자 값으로 보낸 값을 변수에 넣음.

cout<<nextin<<" buffer input "<<x<<" item"<<endl; //출력문

nextin = (nextin+1)%N; //다음 변수로 증가 %연산자는 버퍼를 환형으로 사용하 //기 위함

count = count+1; //한칸 생생했으므로 카운트를 증가시킴

signalc(notempty); //혹시 버퍼가 비어서 잠들어있는 소비자가 있을경우 깨움.

}

}

void monV(int x) //소비자

{

if(count == 0) //버퍼가 비어 있다면 생산자가 버퍼에 값을 넣을때 까지 대기상태로 빠짐.

{

waitc(notempty);

cout<<"-- buffer is empty --"<<endl;

}

else //버퍼가 빈 상태가 아니면 소비를 진행함.

{

x = buffer[nextout]; // 버퍼에 있는 값을 x에 담음

cout<<nextout<<" buffer consume "<<x<<" item"<<endl; //출력문

nextout = (nextin+1)%N; //이 역시 환형 변수로 사용하기위해 %연산자를 이용.

count = count-1; //하나를 소비하였으므로 카운트 값을 하나 줄여줌.

signalc(notfull); //혹시 버퍼가 가득차서 대기중인 생산자가 있으면 깨워줌.

}

}

init //모니터 안의 변수 초기화 문.

{

nextin = 0;

nextout = 0;

count = 0;

}

}

void producer(void) //생산자 스fp드

{

int x = 0; // x의 값을 제품번호의 개념으로 인자 값으로 넘겨줌.

while(TRUE)

{

monP(x);

x = x+1;

}

}

void consumer(void) //소비자 스레드

{

int x;

while(TRUE)

{

monV(x);

}

}

void main()

{

cobegin //생산자와 소비자를 병행 수행

{

producer();

consumer();

}

}

결과화면

 

'Study > OS' 카테고리의 다른 글

Semaphore 구현하기  (2) 2012.05.04
Test-And-Set  (0) 2012.04.27
Bakery 알고리즘  (1) 2012.04.22
Peterson 알고리즘  (0) 2012.04.22
jBACI 사용법  (0) 2012.04.15

+ Recent posts