검사와 지정

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

검사와 지정(test-and-set) 명령어는 동시성을 제어하기 위한 동기화 명령어 중 하나로서, 하드웨어의 도움을 받아 수행된다. 이것을 활용하면 상호 배제 등을 편리하게 구현할 수 있다. 이 명령어는 원자성을 가져 명령어가 실행되는 도중에 인터럽트될 수 없으며, 명령어 내에서 수행되는 두 명령어 "boolean initial = lock" 과 "lock = true"는 동시에 실행되어 둘 다 실행되거나 둘 중 하나가 실행되지 않으면 나머지 하나도 실행되지 않는다.

function TestAndSet(boolean_ref lock) {
    boolean initial = lock
    lock = true
    return initial
}

검사와 지정을 활용하여 상호 배제를 구현하는 방법의 예제[1]

do {
    while(TestAndSet(&lock))
        ; // do nothing
        // critical section
    lock = false;
        // remainder section
} while(true);

코드 해설 :

lock 값이 true일 때는 initial 값이 항상 true이기 때문에 TestAndSet은 항상 true를 반환한다. 따라서 프로세스는 while(TestAndSet(&lock)); 루프를 빠져나가지 못한다. 이것은 다른 프로세스 하나가 임계구역(Critical Section)에 진입했음을 의미한다.

임계구역에 진입했던 프로세스는 임계구역을 빠져나오면서 lock = false; 를 수행한다.

그때 대기중이던 프로세스 중 가장 먼저 TestAndSet을 실행한 프로세스가 while(TestAndSet(&lock)); 루프에서 false를 반환받고 while문을 빠져나오며 임계구역에 진입한다.

이 과정에서 boolean initial = lock; 과 lock = true;는 동시에 실행되므로 다른 프로세스들은 계속 while(TestAndSet(&lock)); 루프를 빠져나오지 못하고 계속 대기한다.

임계구역에 진입했던 프로세스는 임계구역을 빠져나오면서 lock = false; 를 수행한다.

위의 과정이 반복된다.

같이 보기[편집]

  1. Silberschatz, Galvin and Gagne. 《Operating System Principles》.