본문 바로가기
프로그래밍/C++

바쁜 대기(Busy Waiting)에 대해서 알아보자

by bantomak 2026. 2. 1.
반응형

바쁜 대기(Busy Waiting)

바쁜 대기(Busy Waiting)란, 스레드가 특정 조건이 만족될 때까지 잠들지 않고, CPU를 계속 점유하며 무한 루프를 돌면서 조건을 체크하는 상태를 말한다. 쉽게 비유하자면, 택배가 오기를 기다릴 때 현관문 앞에 서서 1초마다 밖을 계속 확인하는 것과 같다.

바쁜 대기 작동 원리

// 공유 자원이 해제될 때까지 무한 반복하며 CPU를 소모함
while (is_locked) 
{
    // 아무것도 하지 않고 조건만 계속 체크 (Spinning)
}
// 조건이 만족(false)되면 루프를 탈출하여 다음 코드 실행

그렇다면 왜 쓰는 걸까?

CPU를 점유하고 있는데 왜 쓰는 거지?라고 생각할 수 있지만, 특수 환경에서는 오히려 효율적이다.

  • 컨텍스트 스위칭(Context Switching) 비용 절감: 스레드를 잠재우고(sleep) 나중에 다시 깨우는 과정은 운영체제 입장에서는 꽤나 무거운 작업이다. 만약 기다리는 시간이 짧다면, 잠들었다가 깨우는 것보다 그냥 잠깐 루프를 도는 게 더 빠를 수도 있다.
  • 즉각적인 응답: 조건이 만족되는 순간 지체 없이 감지하여 다음 로직을 실행할 수 있다.

문제점도 물론 있다

CPU 자원 무단 점유: 루프를 도는 동안 해당 CPU 코어는 100% 사용율을 보이며 다른 유익한 일을 하지 못한다. 이는 시스템 전체의 성능 저하와 전력 소모의 주범이 된다.

우선순위 역전: 낮은 우선순위의 스레드가 바쁜 대기를 하느라 CPU를 점유하면, 정작 높은 우선순위의 스레드가 CPU를 할당받지 못해 무한 대기에 빠질 위험이 있다.

바쁜 대기를 이용한 스핀락(Spinlock)

멀티스레딩에서 바쁜 대기 원리를 이용해 만든 잠금장치가 바로 스핀락(Spinlock)이다.

  • 일반 뮤텍스: 자리가 없으면 대기 명단에 이름을 적고 잠든다. (Sleep)
  • 스핀락: 자리가 날 때까지 문 앞에서 계속 서성인다. (Spin)

대안은 없는가?

일반적인 애플리케이션 개발에서는 바쁜 대기 대신 다음과 같은 효율적인 방법을 권장한다.

  • 조건 변수(std::condition_variable): 조건이 맞지 않으면 스레드를 휴면 상태로 전환하고, 조건이 만족될 때 신호를 보내 깨운다.
  • std::this_thread::yield(): 루프 안에서 나는 지금 할 일이 없으니 다른 스레드에게 CPU를 양보하겠다고 운영체제에게 알려준다.
  • 세마포어 / 뮤텍스: OS 레벨에서 스케줄링을 관리하게 하여 CPU 낭비를 막습니다.

정리하자면

  • 바쁜 대기는 장점보다는 단점이 크지만 아주 짧은 대기 상황에서는 컨텍스트 스위칭을 하지 않고 즉각적인 반응도 가능해서 나름의 이점이 있다. (스레드 전환 비용 > 대기 시간)
  • 현대 C++ 뮤텍스는 내부적으로 아주 짧은 시간만 스핀(바쁜 대기)을 해보고, 그래도 안되면 잠드는 하이브리드 방식으로 성능과 효율을 잡기도 한다.

'프로그래밍 > C++' 카테고리의 다른 글

상호배제란 무엇인가?  (0) 2026.02.01
thread_local 키워드에 대해서  (0) 2026.01.31
RAII에 대해서 알아보자  (0) 2026.01.26
C++ 임시 객체에 대해서  (0) 2026.01.25
unique_ptr vs shared_ptr 차이는 무엇인가?  (0) 2026.01.03

댓글