운영체제 5.2 상호배제: 하드웨어 지원
상호 배제(Mutual exclusion)을 보장하기 위한 하드웨어적 접근 방법은?
-인터럽트 금지(Interrupt Disable)
shared resource를 쓰는 동안에는 Interrupt를 못하게 하는것이다.
상호 배제는 보장이 되지만 부하가 크다. 인터럽트가 허가되지 않는다면 그 사이에 발생하는 외부 이벤트에 대한 처리와 다른 프로세스에 대한 스케줄링 등 모든 기능이 중지되기 때문에 시스템의 수행 효율이 눈에 띄게 감소된다.
그리고 Memory를 공유하는 멀티프로세서 시스템에서는 올바르게 Mutual Exclusion을 보장할 수 없다는 것이다. 두개 이상의 프로세서를 가지는 컴퓨터 시스템에서는 인터럽트가 금지된 상황에서도 서로 다른 프로세스가 공유자원을 동시에 접근하는 경우가 가능하기 때문에.
상호 배제를 위해 구현된 명령어
1. compare &swap명령어
int compare_and swap( int *word, int testval, int newval)
{int oldval;
oldval = *word
if(oldval == testval) *word = newval;
return oldval;
}
이 명령어는 테스트하려는 값(testval)과, 메모리 위치에 저장된 값(*word)를 비교한다.
만약 두 값이 동일하다면, 메모리의 값은 newval로 변경된다. 동일하지 않으면 그 값은 그대로 유지된다.
이 atomic operation은 두 부분으로 구성된다. compare과 swap으로 구성된다.
이 명령어는 원자적으로 수행되기 때문에 중간에 중단되지 않는다.
bolt라는 공유변수를 이용해서 상호배제를 하는 경우
명령어가 있는데
while(compare_and_swap(bolt, 0,1) ==1)
if bolt==0 {
bolt =1;
}
이게 병렬적으로 n개가 진행된다.
하나의 프로세스가 임계지점에 들어오면 bolt값이 0으로 들어오기 때문에 다른 프로세스들이 들어오 지 못한다. 이렇게 상호 배제를 구현한다. 하지만 다른 병렬적인 요소가 while구문을 실행하며 기다리기 때문에 바쁜 대기를 사용한다. 그리고 기아와 교착상태에 빠질수 있다는 단점또한 있다.