반응형
이 코드를 실행한 다음에 실패했을때 어떤 행동을 취하는 것이 락을 구현할때 어떤 방법을 사용할지를 결정하게 된다.
int expected = 0;
int desire = 1;
int original = Interlocked.CompareExchange(ref _locked, desire, expected);
if (original == 0)
break;
실패 한다음에 바로 루프를 시작하면서 재차 시도를 하면 스핀락이 되는 것이고 기다렸다가 다시 오면 Backoff가 된다.
Backoff
while (true)
{
int expected = 0;
int desire = 1;
int original = Interlocked.CompareExchange(ref _locked, desire, expected);
if (original == 0)
break;
// Back off
Thread.Sleep(1); // 무조건 휴식
Thread.Sleep(0); // 조건부 양부
Thread.Yield(); // 관대한 양보
}
Backoff는 쓰레드가 다시 락을 시도하기 전에 일시적으로 대기하도록 한다.
01 대기시간 설정
지정한 시간동안 대기
public static void Sleep (int millisecondsTimeout);
02 조건부 양보
현재 쓰레드보다 우선순위가 같거나 높은 쓰레드가 없는 경우 양보하지 않는다.
단점
기아 현상이 발생할 수도 있다. 우선순위가 낮은 쓰레드는 계속해서 실행을 양보받지 못하는 상황이 나타날 수 있다.
Thread.Sleep(0);
03 관대한 양보
현재 쓰레드가 실행 중인 동안 관대하게 다른 쓰레드에게 실행 기회를 준다.
단점
실행 가능한 쓰레드가 없다면 시간이 소진될 수 있다.
public static bool Yield ();
반응형
'cs공부 > 운영체제' 카테고리의 다른 글
운영체제 - 캐시메모리, 캐시 컨트롤러,레지스터, RAM의 상호 작용(캐시 미스(Cache Miss),캐시 히트(Cache Hit) ) (0) | 2023.05.26 |
---|---|
운영체제 - 커널(Kernel), 커널모드, 사용자모드 (0) | 2023.05.26 |
운영체제 - Semaphore(세마포어), Mutex(뮤텍스) (0) | 2023.05.23 |
운영체제 - SpinLock(스핀락) - Test-and-Set, Compare-and-Swap (0) | 2023.05.22 |
운영체제 - C# Lock구현 연습 (0) | 2023.05.22 |
댓글