Polling으로 인터럽트 우선순위를 판별하는 방식

Polling의 순차 검사 방식과 인터럽트 우선순위 결정 원리, 장단점, Interrupt-Driven I/O와의 차이 및 최적화 방법을 정리합니다.

2026-08-14 · 최초 발행 2026-01-02

CPU가 장치를 직접 확인하는 인터럽트 식별 방식

여러 장치가 인터럽트를 요청할 수 있는 환경에서는 어떤 요청을 먼저 처리할지 정해야 한다. Polling은 CPU가 각 장치의 상태를 순서대로 읽어 인터럽트 발생 여부를 찾는 소프트웨어 기반 방식이다.

이 순서는 단순한 탐색 절차가 아니라 우선순위 정책이기도 하다. 먼저 검사하는 장치가 먼저 서비스되므로, 별도의 복잡한 인터럽트 컨트롤러 없이도 우선순위를 구현할 수 있다. 대신 인터럽트가 없거나 낮은 우선순위 장치에 요청이 있을 때도 CPU가 검사 비용을 부담한다.

Polling은 다음 역할을 맡는다.

  • 여러 장치 가운데 인터럽트를 요청한 장치를 식별한다.
  • 장치 검사 순서로 처리 우선순위를 정한다.
  • 우선순위 정책을 소프트웨어에서 변경할 수 있다.
  • 복잡한 인터럽트 컨트롤러 없이 단순한 회로와 저비용 시스템을 구성할 수 있다.
인터럽트 있음?없음인터럽트 있음?없음인터럽트 있음?없음인터럽트발생CPU장치 1검사처리장치 2검사처리장치 3검사처리장치 N검사인터럽트서비스 루틴(ISR) 실행

인터럽트 요청을 찾은 뒤 ISR로 넘기는 흐름

CPU가 인터럽트 신호를 받으면 현재 작업을 일시 중지하고 폴링 루틴을 실행한다. 이 루틴은 높은 우선순위 장치부터 상태 레지스터와 인터럽트 플래그를 확인한다.

플래그가 설정된 장치를 찾으면 해당 장치의 ISR을 호출하고, 플래그를 클리어한 뒤 원래 작업으로 돌아간다. 요청이 발견되는 순간 검사를 멈추므로, 뒤쪽 장치는 앞선 장치에 요청이 있을 때 검사하지 않는다.

interrupt_handler() {
    // 우선순위 순서대로 장치 검사
    if (device_1.interrupt_flag == 1) {
        device_1_ISR();
        device_1.interrupt_flag = 0;
        return;
    }
    if (device_2.interrupt_flag == 1) {
        device_2_ISR();
        device_2.interrupt_flag = 0;
        return;
    }
    if (device_3.interrupt_flag == 1) {
        device_3_ISR();
        device_3.interrupt_flag = 0;
        return;
    }
    // ... 모든 장치 검사
}

예를 들어 타이머, 네트워크 카드, 디스크 컨트롤러, 키보드, 마우스 순으로 검사한다면 타이머가 최고 우선순위이고 마우스가 최저 우선순위가 된다. 코드의 검사 순서를 바꾸는 것만으로 우선순위 정책을 조정할 수 있다.

Polling 루틴장치 1(최고 우선순위)장치 2장치 3장치 N(최저 우선순위)인터럽트발견즉시 ISR실행검사 중단

단순한 하드웨어와 순차 검사의 비용

Polling의 장점은 하드웨어와 구현의 단순성이다. 복잡한 인터럽트 컨트롤러 없이 구현할 수 있고, 회로 설계와 시스템 비용을 낮출 수 있다. 우선순위를 소프트웨어로 처리하므로 동적 조정이나 조건부 우선순위 같은 정책도 적용할 수 있으며 디버깅도 비교적 간단하다.

반면 CPU는 장치들을 순차적으로 검사해야 한다. 인터럽트가 없어도 검사 시간이 들고, 인터럽트 수가 늘어날수록 검사 시간은 급증할 수 있다. 마지막 장치까지 확인해야 하는 경우 응답 시간을 예측하기 어렵고, 낮은 우선순위 장치는 기아 상태에 놓일 수 있다.

주기적인 검사는 전력 측면에서도 부담이다. CPU가 장치 상태 확인을 위해 깨어나므로 저전력 모드 진입이 어려워지고 배터리 수명이 감소할 수 있다. 이런 특성 때문에 실시간 시스템에는 적합하지 않을 수 있다.

Interrupt-Driven I/O와 선택 기준

Polling에서는 CPU가 능동적으로 장치 상태를 확인한다. 장치 수가 적고 인터럽트 빈도가 낮으며 비용 제약이 있는 환경에 적합하다.

Interrupt-Driven I/O에서는 장치가 인터럽트 신호를 발생시키고 CPU가 이에 응답한다. 하드웨어가 장치를 식별하므로 인터럽트 컨트롤러가 필요하지만, 장치 수가 많고 인터럽트가 빈번한 고성능 환경에서는 CPU 효율을 높일 수 있다.

항목 Polling Interrupt-Driven
장치 식별 CPU가 순차 검사 하드웨어가 자동 식별
CPU 부하 높음 (주기적 검사) 낮음 (이벤트 발생 시만)
하드웨어 단순 복잡 (인터럽트 컨트롤러)
응답 시간 예측 어려움 빠르고 예측 가능
비용 낮음 높음
확장성 낮음 (장치 증가 시 비효율) 높음

단순한 장치 환경과 하이브리드 구조에서의 활용

장치 수와 하드웨어 리소스가 제한된 마이크로컨트롤러에서는 Polling을 사용할 수 있다. 센서 데이터를 읽거나 버튼 입력을 확인하고 LED를 제어하는 경우가 여기에 해당한다.

인터럽트 컨트롤러가 없는 오래된 하드웨어에서도 기존 소프트웨어와의 호환성, 업그레이드 비용 때문에 Polling이 유지될 수 있다.

인터럽트와 Polling을 함께 쓰는 하이브리드 방식도 있다. 인터럽트로 이벤트를 감지한 다음 Polling으로 세부 장치를 식별하는 구조다. USB 컨트롤러에서 인터럽트 발생 후 장치를 확인하거나, 네트워크 카드에서 패킷 도착 인터럽트 후 Polling으로 패킷을 읽는 방식이 예시다.

저전력 환경에서는 긴 주기로 장치를 검사하고 대부분의 시간은 슬립 모드에 머무는 간헐적 Polling을 적용할 수 있다.

검사 비용을 줄이는 방법

인터럽트가 자주 발생하는 장치를 앞쪽에 두면 평균 검사 시간을 줄일 수 있다. 런타임에서 인터럽트 빈도를 측정해 검사 순서를 바꾸는 적응형 Polling도 가능하다.

장치별 상태를 1비트 플래그로 표현한 비트맵은 인터럽트가 없는 장치를 건너뛰는 데 쓸 수 있다.

bitmap = 0b00101000  // 장치 3, 5만 인터럽트
if (bitmap & 0b10000000) check_device_7();
if (bitmap & 0b01000000) check_device_6();
// ...

유사한 장치를 그룹으로 묶고 그룹별 대표 플래그를 두면, 먼저 그룹 플래그를 확인한 뒤 인터럽트가 있는 그룹만 세부 검사하는 2단계 Polling을 구성할 수 있다. 검사 횟수를 줄이는 방식이다.

검사 시간이 일정 시간을 넘으면 중단하는 타임아웃도 필요하다. 인터럽트 소스를 찾지 못하는 상태에서 무한 루프에 빠지는 일을 막고, 다른 작업이 실행될 수 있게 한다.

폴링인터럽트운영체제컴퓨터구조ISR