폴링 (컴퓨터 과학)

폴링(polling)은 컴퓨터 과학에서 하나의 프로세스나 장치(하드웨어 또는 소프트웨어)가 다른 장치나 프로세스의 특정 상태를 주기적으로 확인하여 작업 완료 여부, 데이터 준비 여부, 이벤트 발생 여부 등을 파악하는 방식이다. 이는 시스템이 특정 조건이 충족될 때까지 능동적으로 대기하는 방법 중 하나이다.


개요

폴링은 소프트웨어 또는 하드웨어 수준에서 구현될 수 있으며, 주로 입출력(I/O) 장치 관리, 동기화, 상태 감지 등에 사용된다. 시스템의 중앙 처리 장치(CPU)나 컨트롤러가 특정 레지스터나 메모리 위치를 반복적으로 읽어 원하는 상태 변화를 감지한다. 이는 마치 누군가 어떤 작업이 끝났는지 알기 위해 계속해서 확인하는 것에 비유할 수 있다.

동작 방식

폴링의 기본적인 동작 원리는 다음과 같다:

  1. 상태 확인: CPU 또는 특정 컨트롤러가 주기적으로 대상 장치나 프로세스의 상태 플래그(status flag)나 레지스터 값을 확인한다.
  2. 조건 검사: 확인된 상태가 원하는 조건(예: 데이터 준비 완료, 버퍼 비어 있음)과 일치하는지 검사한다.
  3. 반복 또는 진행:
    • 조건이 충족되지 않으면, 일정 시간 대기 후 다시 상태를 확인하는 과정을 반복한다.
    • 조건이 충족되면, 해당 작업을 수행하거나 다음 단계로 진행한다.

이 과정은 원하는 이벤트가 발생할 때까지 계속해서 반복된다.

장점

  • 구현 용이성: 구현이 상대적으로 간단하고 예측 가능하여, 간단한 시스템이나 자원 제약이 있는 환경에서 선호된다.
  • 하드웨어 단순화: 복잡한 인터럽트 메커니즘과 같은 특별한 하드웨어 지원이 필요하지 않다.
  • 완전한 제어: 시스템의 모든 부분을 제어하므로 특정 오류 상황을 쉽게 처리할 수 있다.

단점

  • 자원 비효율성: CPU 자원을 비효율적으로 사용한다. 원하는 이벤트가 발생하지 않는 동안에도 계속 상태를 확인하므로 불필요한 연산 주기(idle cycles)를 낭비한다.
  • 응답 지연: 폴링 주기가 너무 길면 이벤트 감지가 늦어져 응답 지연 시간(latency)이 발생할 수 있다. 반대로 폴링 주기가 너무 짧으면 CPU 낭비가 심해진다.
  • 확장성 문제: 여러 장치를 폴링해야 하는 경우, 각 장치마다 CPU 시간을 할당해야 하므로 전체 시스템 성능에 부정적인 영향을 미칠 수 있다.

활용 분야

  • 저수준 하드웨어 제어: 마이크로컨트롤러 환경에서 간단한 입출력 장치(버튼, 센서 등)의 상태를 확인하는 데 주로 사용된다.
  • 운영체제 커널: 특정 장치의 준비 상태를 기다리거나 간단한 동기화를 구현할 때 제한적으로 사용될 수 있다.
  • 임베디드 시스템: 자원 제약이 심하여 인터럽트 처리 메커니즘 구현이 어려운 환경에서 인터럽트 대신 사용되기도 한다.
  • 네트워크 통신: 서버가 클라이언트로부터의 메시지를 주기적으로 확인하는 등의 방식에서 사용될 수 있으나, 일반적으로는 이벤트 기반의 비동기 방식이 더 선호된다.

관련 개념 및 대안

  • 인터럽트(Interrupt): 폴링의 주요 대안이다. 장치나 프로세스에서 특정 이벤트가 발생하면 CPU에게 직접 신호를 보내 현재 작업을 중단하고 해당 이벤트를 처리하도록 요청하는 방식이다. 폴링보다 CPU 자원 사용이 훨씬 효율적이다.
  • 이벤트 구동 프로그래밍(Event-driven programming): 특정 이벤트(사용자 입력, 메시지 수신 등)가 발생할 때만 코드가 실행되도록 하는 프로그래밍 패러다임이다. 폴링과는 달리 능동적인 확인보다는 이벤트 발생 시의 반응에 초점을 맞춘다.
  • 콜백(Callback): 특정 이벤트가 완료되면 호출될 함수를 미리 등록해 두는 방식이다. 이벤트 구동 프로그래밍에서 흔히 사용된다.
  • 비동기 입출력(Asynchronous I/O): 입출력 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속 수행하다가, 입출력 작업이 완료되면 시스템으로부터 알림을 받는 방식이다.

참고 문서

  • 인터럽트
  • 이벤트 구동 프로그래밍
  • 비동기 입출력
둘러보기

더 찾아볼 만한 주제