단일 처리기인 경우에는 Critical Section인 경우에 interrupt를 disable 시키면 되지만, 다중 처리기 환경에서는 비효율적이다. 왜냐하면 interrupt를 보내지 말라는 메세지를 모든 처리기에 전달해야 되고 Critical Section에 들어가기전에 메세지를 일일이 다 확인해야 하기 때문이다.

따라서 많은 하드웨어들이 동기화 문제를 해결하기 위한 Synchronization hardware를 가지고있는데 이중, testandset과 swap을 살펴보자.

 

testandset();

 

boolean TestAndSet(boolean *target){ 

boolean rv = *target;

*target = TRUE;

return rv;

}

testandset함수는 들어온 값을 TRUE로 바꿔주고 원래있던 값을 반환하는 함수이다.

 

do{

while(TestAndSet(&lock));    //lock을검사하고 TRUE면, 루프를 FALSE면 CriticalSection진입.

 

// Critical Section

 

lock = FALSE;                    //CriticalSection을통과하고다른프로세스의 진입을 허용한다는 의미로 lock을 FALSE로 바꿔준다.

 

//remainder section

}while(TRUE);

 

lock은 맨처음 FALSE로 초기화가 되어 있다. 맨처음에 들어온 프로세스가 testandset을 거치고 나면 lock은 TRUE로 바뀌고 맨처음에 들어온 프로세스는 Critical section에 들어오게 된다. Context-switch가 일어나도 lock은 FALSE이기 때문에 다른 프로세스들은 while루프를 돌게됨.

하지만 임의의순서대로 Critical Section에 들어가기 때문에 어느 한 프로세스는 계속 기다리는 경우의 수가 발생할 수도 있다. 따라서 Bounded waiting을 만족하지못한다.

 

swap();

 

void Swap(boolean *a,boolean *b){

boolean temp = *a;

*a = *b;

*b=temp;

}

 

 

do{

key = TRUE;

while(key == TRUE)            //맨처음 프로세스가 통과할때 lock은 FALSE이므로while루프를

swap(&lock,&key);            //한번실행하고 나가지만 다른프로세스가 들어오면 lock,key 모두 TRUE이므로 계속해서 while을 돌게 된다.

 

//Critical Section

 

lock = FALSE;                //Critical section을 사용하고 난 후에는 lock = FALSE;로 바꿔주어서 다른 프로세스의 진입을 허용함.

 

//remainder section

}while(TRUE);

 

하지만 swap();도 Bounded waiting을 만족하지 못함.

 

 

최종적인 코드 (Bounded waiting 만족)

 

do{

waiting[i]=TURE;

key = TRUE;

while(waiting[i] && key)        //맨처음프로세스만 lock=FALSE이므로 통과하고 나머지는

key=TestAndSet(&lock);  //계속 루프를 돌게 된다.

waiting[i]=FALSE;                //크리티컬섹션의 진입허용권을 얻게되었으므로 표시를해줌.

  //Process와Bounded waiting 을 만족하게끔.

//Critical section

 

j=(i + 1) % n;                    //최대갯수 n개로 나눠준다. 원형 Queue를 생각하면 편할듯.

while((j != i) && !waiting[j])

j=(j+1)%n;

 

if(j==i)                            //if 문 조건에 해당하면 나말고 다른 프로세스가 없다는 뜻.

lock =FALSE;

else                            //다른 프로세스의 진입허용.

waiting[j] = FALSE;

 

//remainder section

 

}while(TRUE);

'O.S' 카테고리의 다른 글

Mutex  (0) 2012.05.16
Classic Problems of Synchronization / Monitor  (0) 2012.04.27
Semaphore  (0) 2012.04.27
파일 디스크립터(File descriptor)  (0) 2012.04.24
공유메모리 함수 - shmget , shmat , shmdt  (2) 2012.04.23

+ Recent posts