-
동기화 하드웨어운영체제/프로세스 동기화 2018. 2. 4. 00:25
많은 현대 기기들은 인터럽트 되지 않는 하드웨어 명령어를 제공한다.
TestAndSet 명령어를 사용한 상호 배제 구현
do {
while(TestAndSet(&lock))
//아무 일도 안함.
// 임계 구역
lock = FALSE;
// 나머지 구역
} while(TRUE)
제일 처음에는 lock은 FALSE값으로 초기화되어 있다.
따라서, 처음으로 실행한 프로세스는 첫 while문을 통과한다.
그리고, TestAndSet에의해서 lock은 TRUE가 되었으므로,
다른 프로세스가 임계 영역을 실행하려고 해도, while문에서 걸려서 실행할 수 없다.
상호 배제 조건을 만족하는 셈이다.
그리고 임계 영역을 다 끝낸 프로세스는 lock값을 다시 FALSE로 되돌려서
다른 프로세스도 임계 영역을 실행할 수 있도록 한다.
따라서, 진행 조건도 만족하는 셈이다.
다만, 한정 대기 조건을 만족한다고 볼 수는 없다.
TestAndSet() 명령어
boolean TestAndSet(boolean* target) {
boolean rv = *target;
*target = TRUE;
return rv;
}
이 명령들은 원자적으로 실행된다.
Swap 명령어를 이용한 상호 배제 구현
do {
While (compareAndSwap(&lock,0,1) != 0)
//아무 일도 안함
//임계 구역
Lock = 0;
//나머지 구역
} while (true);
제일 처음에는 전역 변수 lock이 0으로 초기화 된다.
compareAndSwap 을 호출한 첫 번째 프로세스는 lock을 1로 지정하고
Lock의 원래 값이 expected의 값과 같으므로 프로세스는 임계구역으로 들어간다.
이후의 호출은 lock의 값이 기대 값 0과 같지 않기 때문에 진입에 성공하지 못한다.
이를 통하여 상호 배제가 지켜 짐을 알 수 있다.
그리고 임계 구역에 진입한 프로세스가 나올 때 lock을 0으로 변경하기 때문에
진행 조건도 만족한다.
하지만 한정 대기 조건을 만족시키지는 못한다.
compareAndSwap명령어
Void compareAndSwap(int *value, int expected, int newValue) {
Int temp = *value;
//피연산자 value는 (value == expected) 가 참일 때에만 newValue로 지정된다.
If (value == expected)
*value = newValue;
return temp;
}
이 명령들은 원자적으로 실행된다.
위 알고리즘들은 상호 배제 , 진행 조건은 만족하지만 한정 대기 조건을 만족시키지는 못한다.
댓글