본문 바로가기
cs공부/운영체제

운영체제 - Backoff(Thread.Sleep(0), Thread.Yield())

by 코딩하는 돼징 2023. 5. 26.
반응형

이 코드를 실행한 다음에 실패했을때  어떤 행동을 취하는 것이 락을 구현할때 어떤 방법을 사용할지를 결정하게 된다.

int expected = 0;
int desire = 1;
int original = Interlocked.CompareExchange(ref _locked, desire, expected);
if (original == 0)
    break;

실패 한다음에 바로 루프를 시작하면서 재차 시도를 하면 스핀락이 되는 것이고 기다렸다가 다시 오면 Backoff가 된다.


SpinLock 알아보러 가기

 

운영체제 - SpinLock(스핀락) - Test-and-Set, Compare-and-Swap

SpinLock(스핀락) 동기화 기법 중 하나로 여러 쓰레드가 공유자원에 접근한느 것을 제어하기 위해 사용된다. race condition을 해결하고 mutal exclusion을 구현하기 위해 이용된다. 스핀락 구현 class SpinLock

code-piggy.tistory.com


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 ();

 

반응형

댓글