피터슨의 방법은 하드웨어 지원을 요구하지 않기 때문에 소프트웨어 기반 해결책이라고 함.
→ 임계구역 문제를 해결하기 위한 3가지 하드웨어 명령어가 제시됨.
다음과 같은 상황을 가정해보자.
x = 100의 연산과 flag = true의 연산은 서로 아무련 관련이 없다.
->만약 컴파일러가 flag = true를 먼저 실행한다면 예상과 다른 값이 나와버린다.
이러한 문제를 해결하기 위해 하드웨어 명령어를 제시한다.
1 ) 메모리 장벽 : memory barrier() 위로 선언된 모든 문장들이 실행 되어야 그 다음 문장이 실행됨.
while(!flag)
memory_barrier();
print x;
x = 100; // x가 적재 되는 것을 보장
memory_barrier();
flag = true;
2 ) test_and_set : 기계어 명령으로 atomy하게 실행됨.
boolean test_and_set (boolean *target)
{
boolean rv = *target;
*target = TRUE;
return rv;
}
단점 : 무한 대기 문제가 생길 수 있음. 여러 프로세스가 있을 때 흔히 발생.
→ 한계 대기로 바꿔 해결가능 (한 방향으로 체크하면서 실행하게 함)
3 ) compare_and_swap : 원래 있던 값이 expected값과 같으면 새로운 값을 대입 후 이전 값 리턴.
int compare_and_swap(int *value, int expected, int new_value)
{
int temp = *value;
if(*value == expected)
*value = new_value;
return temp;
}