검사와 지정
검사와 지정(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;를 수행한다.
위의 과정이 반복된다.
같이 보기
[편집]각주
[편집]- ↑ Silberschatz, Galvin and Gagne. 《Operating System Principles》.
이 글은 컴퓨터 과학에 관한 토막글입니다. 여러분의 지식으로 알차게 문서를 완성해 갑시다. |