상호 배제를 하기 위해 하드웨어의 지원을 받는 경우
while (true){
/* 인터럽트 금지하는 기계어 명령어 */
/* 임계영역 */
/* 인터럽트 허용하는 기계어 명령어 */
/* 임계영역 이후 코드 */
}
/* 하나의 기계 명령어로 지원됨 -> 원자적 수행 */
int compare_and_swap (int *word, int testval, int newval)
{
int oldval;
/* word의 값을 대입복사 */
oldval = *word
/* newval 값을 word의 위치에 set */
if (oldval == testval) *word = newval;
return oldval;
}
/* 상호 배제 예제 프로그램 */
const int n = /* 프로세스 개수 */
/* 공유하는 전역변수 -> 0으로 초기화 */
/* 전역변수가 0일 경우 임계 영역으로 진입 가능 */
int bolt;
void P(int i)
{
while (true) (
/* compare_and_swap -> 원자적 수행. bolt가 0이라면 1로 설정 */
/* bolt가 1일 동안 수행 -> CPU를 계속 점유(busy waiting, spin waiting) */
while(compare_and_swap(bolt,0,1) == 1)
/* 대기 */
/* 임계영역 */
/* 임계영역에서 빠져나올 경우 반드시 전역변수를 0으로 돌려놔야 함 */
bolt = 0
/* 임계영역 이후 코드 */
)
}
void main()
{
bolt = 0;
/* n개의 프로세스를 병렬적으로 수행시킴 */
parbegin(P(1),P(2), ... , P(n))
}
compare_and_swap
원자적으로 수행하는 명령어 지원testval
)*word
)newval
)void exchange (int *register, int *memory)
{
int temp;
temp = *memory;
*memory = *register;
*register = temp;
}
/* 상호 배제 예제 프로그램 */
int const n = /* 프로세스 개수 */
int bolt;
void P(int i)
{
while (true) {
/* 중간에 다른 스레드가 들어와 exchange를 실행해도 keyi와 바꾸어도 전역변수 bolt는 1인 상태이므로 변화가 없음 => bolt가 0이 될 때까지 무한루프 돌면서 임계영역 진입 대기*/
int keyi = 1;
/* 임계영역 진입 전 setting */
/* keyi의 값은 0이 되고 bolt가 1이 됨 */
do exchange (&keyi, &bolt)
while (keyi != 0);
/* 임계영역 */
/* 임계영역을 벗어나는 setting */
bolt = 0;
/* 임계영역 이후 코드 */
}
}
void main()
{
/* bolt의 초기값 */
bolt = 0;
/* n개의 프로세스 병렬 실행 */
parbegin(P(1), P(2), ... , P(n))
}
compare&swap
이나 exchange
)를 수행한 후 임계영역 진입