어떤 프로세스 A가 선행 프로세스가 일을 끝마치기 전까지는 일을 하지 못한다고 할 때,
A가 마냥 기다리면서 CPU를 점유하는 것은 자원 낭비이다.
그래서 선행 프로세스가 일을 끝내기 전에 sleep 상태로 접어들게 되는데
이를 대기 이벤트 (wait event)라고 하며, 이 상태는 SGA 또는 파일에 기록된다.
프로세스 A는 CPU를 OS에 반납하고 sleep 상태로 빠지고,
해당 프로세스가 wait queue로 옮겨진다.
이렇게 되면 OS는 이 프로세스를 스케줄링 대상에서 제외한다.
선행 프로세스는 일을 마친 뒤 OS에게 이를 보고하고,
OS는 A를 runnable queue로 옮긴다.
이후 A는 이전과 같이 스케줄링 되어 일을 할 수 있다.
Response Time = Service Time + Wait Time = CPU Time + Queue Time
Service Time(= CPU Time): 프로세스가 정상적으로 동작하며 일을 수행한 시간
Wait Time(= Queue Time): 프로세스가 잠시 멈춰 대기한 시간
아래는 대기 이벤트가 발생하는 경우의 예시이다.
필요한 리소스를 다른 프로세스가 사용 중일 때
버퍼 캐시에서 어쩌다 쓰고 싶은 블록이 겹쳤다거나 (경합)
다른 프로세스가 선행 작업을 완료하길 기다릴 때
오라클에선 버퍼를 디스크에 적용하기 전에 redo 로그에 변경사항을 먼저 적어야 한다. (write ahead logging)
DBWR이 버퍼를 디스크에 옮기려면, 먼저 LGWR이 로그 버퍼의 내용을 로그로 옮겨야 한다.
클라이언트가 바빠서 다음 작업을 안 주고 있다거나,
병렬 쿼리의 경우 일부 프로세스가 아직 작업을 안 끝낸 경우에 해당한다.