아래 코드는 중요한 섹션 문제를 해결하기 위해 작성되었습니다. 중요 섹션에서 공통 데이터 구조를 수정하는 N 개의 프로세스가 있다는 것을 감안할 때. 여기waiting [i] = false를 건너 뛰면 어떻게됩니까? 다음 코드 조각에서?
boolean waiting[n];
boolean lock;
하드웨어 지원에 의한 실행에 원자 추정되는 검사와 지정() 함수이다 :
이 사용 된 데이터 구조이다.boolean TestAndSet(boolean *target)
{
boolean rv = *target;
*target = TRUE;
return rv;
}
// 다음 코드는 상호 배제를 보장
do {
waiting[i] = TRUE;
key = TRUE;
while (waiting[i] && key)
key = TestAndSet(&lock);
waiting[i] = FALSE; //what if I skip this??
// critical section
j = (i + 1) % n ;
while((j != i) && ! waiting[j])
{
j = (j + 1) % n ;
}
if (j == i)
lock = FALSE;
else
waiting[j] = FALSE;
//remainder section
}while (TRUE);
또한 여기에 메모리 장벽이있을 수있는 곳은'TestAndSet'의 구현이 사용되는 범위 내이므로 엄격한 캐시보다 적은 다중 프로세서 다중 캐시 시스템에서 많은 재미를 보일 수 있습니다 coherency constraints ... 특히'waiting [J] = FALSE'는 (비교적) 다른 CPU가 알아 차릴 수있는 꽤 많은 시간을 필요로합니다 ... 아니면 적어도 캐시 라인 바운싱과 관련된 성능 열화를 일으킬 것입니다 ... – twalberg
@Nerf 우리가 2 개의 프로세스 A와 B를 가지고 있다고 가정합시다. A 잠금을 획득하고 임계 영역을 완료 한 다음 대기 [A]를 거짓으로 설정하지 않았습니다. 이제 B를 실행합니다. 잠금 해제 됨이 표시되면 잠금을 획득하고 핵심 섹션으로 실행됩니다. 이제 critical 섹션 이후의 코드는 프로세스 B에서 실행됩니다. 인덱스가 A에 도달하면 중지됩니다. 이제 Waiting [A] = false로 설정됩니다. 2 가능성이 존재합니다 1) A가 while 루프에서 잠금 대기 중입니다. 이 경우에 대기는 A.에 대한 대기가됩니다. 2) 또는 A가 나머지 섹션을 실행 중입니다.이 경우 대기 [A]를 거짓으로 설정하면 영향이 없습니다. –
가능성 1)은 괜찮지 만 2)에 영향을 미칩니다. 첫 번째로 합법적으로 대기중인 프로세스 C가있는 경우 프로세스 C가 건너 뛸 수 있습니다. C가 없더라도 A는 Waiting [A] = true로 설정하지 않고 while 루프로 돌아갈 수 없습니다. lock이 false로 설정되지 않았으므로 이제 A는 TestAndSet 루프에서 영원히 기다립니다. 다른 모든 사람들에게도 마찬가지입니다. –