Programmed I/O

프로그래밍 I/O 비용

폴링 방식은 장치가 준비됐는지 CPU가 직접 확인한다. 구현은 단순하지만 기다리는 동안 CPU 시간을 계속 소비하므로 인터럽트와 DMA의 필요성이 드러난다.

01

상태 레지스터를 읽는다

CPU는 장치가 ready인지 확인하기 위해 같은 주소를 반복적으로 읽는다.

02

준비되면 데이터를 옮긴다

장치 data register와 메모리 사이를 CPU 명령으로 직접 복사한다.

03

대기 비용을 평가한다

장치가 느릴수록 CPU는 실제 계산보다 상태 확인에 시간을 낭비한다.

Polling
제어가 단순 언제 상태를 확인할지 CPU 코드가 직접 결정한다.
작은 임베디드 상황에는 맞을 수 있다.
Busy waiting
CPU 낭비 장치가 준비되지 않아도 CPU가 루프를 돌며 시간을 쓴다.
멀티태스킹 시스템에는 부담이다.
Interrupt I/O
비동기 알림 장치가 완료를 알릴 때까지 CPU는 다른 일을 할 수 있다.
handler overhead가 있다.
DMA
대량 전송 CPU가 byte마다 옮기지 않고 controller가 메모리 전송을 맡는다.
cache coherence를 고려한다.

준비 확인 · 낭비 · 대안 점검

준비 확인 CPU가 어떤 상태 bit를 기다리는지 설명할 수 있는가.
낭비 폴링 루프가 CPU 시간을 어떻게 소모하는가.
대안 인터럽트와 DMA가 각각 어떤 비용을 줄이는지 구분하는가.

폴링

while ((status & READY) == 0) { /* busy wait */ }
*buffer = data_register;