원래 해당 내용이 더 먼저 쓰였는데, 누락되서 이제야 올립니다.

Busy Waiting (바쁜 대기)

while (!flag) {
// do nothing: 계속 검사만 함 (CPU 낭비)
}

busy waiting(바쁜 대기)는 CPU를 낭비하며 특정 조건이 만족될 때까지 반복적으로 루프를 도는 방식입니다. 즉, flag를 예시로 들면, CPU가 시그널이나 I/O 입력등의 조건이 될때까지 flag 상태만 체크하는 문제입니다.

→ 해당 문제를 해결하기 위해 sleep과 wait 매커니즘을 사용합니다.

해결 방법들

1. Sleep + Interrupt / Signal 사용

프로세스를 sleep 상태로 두고, 외부 요청(I/O, 다른 쓰레드의 시그널 등)이 나오면 깨움.
→ pause로 대기를 걸고, 요청이 들어오면 signal handler가 실행되면서 일어남

2. Condition Variable (조건 변수) 사용

쓰레드는 조건이 충족될 때까지 wait() 이고 다른 쓰레드가 조건을 만족시키면 notify() 알림을 통해 깨운다.

→ CPU를 쓰지 않고 대기 가능하며 이벤트 기반으로 깨운다.

3. I/O 대기 시스템 호출 사용 (select, poll, epoll)

네트워크나 파일 디스크립터에서 요청을 기다릴 시, 요청이 오면 깨어나서 처리합니다.
→ Busy waiting 대신 sleep 방식

근데 이러한 방식이 성능이 안좋기 때문에 세마포어와 Mutex, monitor 방식을 사용한다.

profile
모든걸 기록하며 성장하고 싶은 개발자입니다. 현재 크래프톤 정글 8기를 수료하고 구직활동 중입니다.

0개의 댓글