단일 처리기인 경우에는 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 |