Busy Waiting이란?

  • 원하는 자원을 얻기 위해 기다리는 것이 아니라 권한을 얻을 때까지 확인하는 것을 의미합니다.

Busy Waiting은 어떤 상황일때 사용하는게 좋을까?

  • 자원의 권한을 얻는데 많은 시간이 소요되지 않는 상황인 경우.

  • Context Switching 비용보다 성능적으로 더 우수한 상황인 경우.

Busy Waiting의 단점은 없을까?

  • 권한 획득을 위해 많은 CPU를 낭비한다는 단점이 있습니다.

Busy Waiting말고 다른 방법은 없을까?

  • 지속적으로 확인하는 Busy Waiting이 아닌 Sleeping이라는 방법을 사용할 수 있습니다.

Sleeping이란?

  • 권한을 얻기 위해 기다리는 시간을 wait queue에 실행 중인 Thread 정보를 담고 다른 Thread에게 CPU를 양보하는 것을 의미합니다.

  • 커널은 권한 이벤트가 발생하면 wait queue에 담긴 Thread를 깨워 CPU를 부여합니다.

Sleeping은 어떤 상황일때 사용하는게 좋을까?

  • 기다리는 시간이 예측이 불가능한 상황인 경우.

Sleeping의 단점은 없을까?

  • wait queue에 넣는 비용 + Context Switching 비용이 드는 단점이 있습니다.

 

출처 : nesoy.github.io/articles/2019-06/OS-Busy-Waiting

 

 


 

critical section내에서 일정 조건이 충족되었는지 확인해야 하는 상황이라면,

자원 낭비가 심한 busy watining 방법보다는 condition variable을 사용하는 것이 좋다.

 

condition variable을 통해 wait와 signal 역할을 수행할 수 있는데,

  • wait의 역할?
    • 조건이 충족되길 기다리고 있는 thread를 잠들게 하는 것이다.
    • 즉, thread를 condition variable에 넣되, 이 thread가 가지고 있는 mutex는 unlock한다.
  • signal의 역할?
    • 특정 조건이 만족되면 잠들어있는 thread를 깨우는 역할을 수행한다.
    • 이 때 일어나게된 thread는 mutex를 다시 얻으려는 시도를 한다. mutex를 얻었다면 wait 함수로부터 리턴된다.

condition variable은 어떤 변수의 실제값을 통해 thread를 동기화할 수 있다.동기화하는데 사용되는 함수로는 pthread_cond_wait와 pthread_cond_signal이 있다.

 

 

+ Recent posts