CPU의 입출력 방식: 폴링, 인터럽트, DMA
무릇 프로그램들은, CPU가 입출력 장치와 통신하는 것으로 수행된다. 파일이든 뭐든 입력을 받고, 입력을 기반으로 로직을 수행하고, 결과물을 출력한다.
CPU가 입출력과 연동하는 방식은 몇가지가 존재하는데. 이에 대해 간략히 정리해보겠다.
폴링(polling)
폴링은 CPU가 주기적으로 직접, 입력장치에 접근해서 뭐 있는지 뭐가 달라졌는지 확인하는 방식이다.
이 확인에는 당연히 CPU 인스트럭션을 사용하기 때문에 성능 낭비가 심하고, 느리다.
거의 사장된 방식인것 같다.
인터럽트(interrupt)
입출력 장치가 일 있으면 CPU에게 이벤트를 날리고, CPU가 수동적으로 그걸 받아서 처리하는 방식이다.
볼일이 있을 때만 CPU가 호출돼서 인스트럭션을 수행하므로, 효율성이 아주 뛰어나다.
쓸데없이 계속 확인용 인스트럭션을 안 보내도 되니까 말이다.
DMA(Direct Memory Access)
근데 인터럽트 방식도 사실 성능적 결함이 존재한다. 데이터 하나를 통째로 보내는 게 아니라, 한 워드(word)를 보낼 때마다 인터럽트를 날려야 하기 때문이다.
그럼 당연히 보낼 데이터가 커질수록 인터럽트 처리도 길어지니 CPU가 가지는 부담도 커진다.
그리고 이건 당연히 성능의 저하로 이어진다.
이를 해결하기 위해 일종의 버퍼를 두는 것이 바로 DMA 방식이다. DMA는 CPU를 대신해서 입출력장치의 데이터를 전부 받고, 다 받으면 한번에 CPU에게 전달해준다.
인터럽트 처리 부담까지 N에서 1로 줄어드니, 최고다.