polling
폴링은 CPU가 디바이스가 일을 끝냈는지 알아내기 위해 주기적으로 status register를 계속 읽어보는 방식이다.
CPU가 디스크 등 I/O 디바이스에 작업을 요청하면
CPU는 그 장치가 끝났는지 계속 status register를 반복적으로 체크하고
디바이스가 완료 상태로 바뀌면 CPU가 다음 동작을 진행하게 된다.
구조는 단순하지만 CPU가 계속 일하고 있는 디스크를 계속 확인하고 기다리는 polling 중이므로 이 시간동안 다른 테스크가 CPU를 사용할 수 없기 때문에 CPU 시간이 낭비된다.
interrupt
인터럽트는 I/O 디바이스가 일을 스스로 완료한 후에 CPU에게 끝났음을 알리는 방식이다.
CPU가 디스크 등 I/O 디바이스에 작업을 요청하면
CPU는 요청 프로세스를 sleep 상태로 전환시키고 다른 프로세스로 context switch한다.
(=task1 대신 task2를 실행하는 것)
디스크 작업이 완료되는 순간 디바이스가 CPU에게 인터럽트 시그널을 보내고
CPU는 인터럽트에 대해 대처하는 인터럽트 핸들러 ISR을 실행하고
sleep 상태로 대기 중이던 프로세스를 깨우고
다시 원래 프로세스로 돌아가서 결과를 마저 처리하게 된다.
(=task1로 돌아오는 것)
CPU는 디스크의 작업 완료를 기다리지 않고 다른 일을 할 수 있기 때문에 CPU와 I/O 디바이스 모두 잘 활용할 수 있다는 장점이 있다.
너무 많은 인터럽트가 짧은 시간 안에 발생하게 되면 CPU가 인터럽트 처리만 하게 될 수 있다. 그래서 여러 I/O 완료를 한 번에 모아서 하나의 인터럽트로 처리하는 최적화 기술을 Coalescing interrupts 라고 한다.
interrupt vs polling
디바이스 작업이 아주 빠르게 끝난다면 CPU가 처음 한두 번 polling 하는 동안 이미 작업이 끝나기 때문에 인터럽트하면 오히려 더 비용이 많이 든다. 프로세스를 sleep 시키고 다른 프로세스로 context switch하고 인터럽트 핸들러를 실행해야하기 때문이다. = 속도가 빠른 디바이스라면 polling이 유리하다.
디바이스 작업이 느리게 끝난다면 CPU가 polling 하면 기다리는 동안 그 시간을 많이 낭비하게 된다. 반면 인터럽트는 기다리는 동안 CPU가 다른 작업을 수행할 수 있기 때문에 속도가 느린 디바이스라면 interrupt가 유리하다.
즉, 두 방식이 유리한지 판단할 때는 context switch 비용에 따라, polling으로 낭비되는 cycle의 양에 따라 결정된다.
'[ Laboratory ] > Advanced Operating System' 카테고리의 다른 글
| race condition (0) | 2025.11.29 |
|---|---|
| lock free vs wait free (0) | 2025.11.20 |
| io_uring (0) | 2025.11.20 |
| ABI stability (0) | 2025.11.17 |
| 리눅스 eBPF, kfunc (0) | 2025.11.17 |
| 리눅스 cgroup (0) | 2025.11.17 |
| 리눅스 페이지 캐시 정책 (1) | 2025.11.14 |