인터럽트와 폴링(Polling)의 차이점은 무엇인가요?

김상욱·2024년 12월 3일
0

인터럽트와 폴링(Polling)의 차이점은 무엇인가요?

인터럽트(Interrupt)와 폴링(Poling)은 시스템에서 외부 장치와의 상호작용 또는 이벤트 처리를 처리하는 방식.

인터럽트(Interrupt)
외부 장치나 이벤트가 발생했을 때, 해당 장치가 CPU에 신호를 보내 작업을 요청하는 방식. CPU는 평소 작업을 수행하다가 인터럽트 신호가 들어오면 현재 작업을 멈추고 요청된 작업을 처리. 이벤트 기반(Event-driven) 방식

이벤트 발생->장치가 인터럽트 신호 전송-> CPU는 현재 작업 중단(Save Context) -> 인터럽트 처리 루틴(Interrupt Service Routine, ISR) 실행. -> ISR 종료 후 원래 작업 재개

이벤트 시에만 반응하여 CPU 자원을 효율적으로 사용하고 이벤트 발생 시 즉시 반응 가능하여 실시간 처리가 가능하다.

but, 인터럽트 처리 우선순위 및 동시 처리 문제 해결 필요하다. 또한 과도한 인터럽트 발생 시 CPU 오버헤드가 증가(Interrupt Storm)

ex - 키보드 입력, 마우스 클릭 등 사용자 인터페이스 처리 / 실시간 시스템(임베디드 시스템, 하드웨어 제어) / 네트워크 패킷 수신, 데이터 전송 완료 처리

폴링(Poling)
CPU가 주기적으로 특정 장치나 상태를 확인하여 이벤트가 발생했는지 직접 체크하는 방식. 장치 상태를 확인하는 루프를 실행하며 이벤트가 발생했을 때 작업을 처리. 반복 검사 기반 방식(Loop-based)

CPU가 주기적으로 장치 상태 확인(장치가 준비 상태인지 체크) -> 장치가 작업 준비 완료 상태면 CPU가 작업을 처리 / 이벤트가 발생하지 않은 경우는 CPU는 계속 상태 확인을 반복

구현이 간단하고 인터럽트 없이 작동 가능. 특정 조건에서 인터럽트보다 안정적으로 작동(ex - 짧고 일정한 간격으로 장치를 확인해야 할때)

but, 이벤트가 자주 발생하지 않으면 불필요하게 루프를 실행하므로 CPU 자원이 낭비되고 주기가 있으므로 이벤트 감지에 지연이 발생할 수 있다.

ex) 간단한 상태 확인 작업 / 일정 주기 내에 처리되는 작업 / 하드웨어가 인터럽트를 지원하지 않을 때


신입 Java Spring 백엔드 개발자 입장에서 인터럽트와 폴링과 관련된 실습을 통해 개념을 이해하고 응용력을 키울 수 있습니다. 이 두 개념은 주로 시스템 프로그래밍에서 자주 다뤄지지만, 백엔드 개발 환경에서도 이를 간접적으로 체험하거나 유사한 상황을 구현할 수 있습니다. 아래는 관련 실습 아이디어입니다.


1. Event-Driven 방식의 처리 이해 (인터럽트 개념 응용)

Spring은 이벤트 기반(Event-Driven) 아키텍처를 쉽게 구현할 수 있는 기능을 제공합니다. 이를 통해 인터럽트 개념을 학습하고 응용할 수 있습니다.

실습: Application Event 사용하기

  • Spring의 ApplicationEventApplicationListener를 활용해 특정 이벤트가 발생했을 때 비동기적으로 처리하는 로직을 구현합니다.

  • 예제:

    1. 이벤트 클래스 생성

      public class OrderCreatedEvent extends ApplicationEvent {
          private String orderId;
      
          public OrderCreatedEvent(Object source, String orderId) {
              super(source);
              this.orderId = orderId;
          }
      
          public String getOrderId() {
              return orderId;
          }
      }
    2. 이벤트 발행 및 처리

      @Component
      public class OrderEventListener {
      
          @EventListener
          public void handleOrderCreated(OrderCreatedEvent event) {
              System.out.println("Processing order: " + event.getOrderId());
          }
      }
      
      @Service
      public class OrderService {
          private final ApplicationEventPublisher eventPublisher;
      
          public OrderService(ApplicationEventPublisher eventPublisher) {
              this.eventPublisher = eventPublisher;
          }
      
          public void createOrder(String orderId) {
              System.out.println("Creating order: " + orderId);
              eventPublisher.publishEvent(new OrderCreatedEvent(this, orderId));
          }
      }
    3. 테스트

      • REST API나 main 메서드를 통해 createOrder를 호출하면 이벤트가 발행되고 비동기적으로 처리됩니다.
    • 이를 통해 이벤트 발생 시 처리되는 인터럽트 구조를 체험할 수 있습니다.

2. Polling 방식의 구현

백엔드 개발에서도 Polling은 주로 상태 확인이나 외부 서비스 상태 체크에 사용됩니다.

실습: 주기적으로 외부 API 상태 확인

  • Spring의 @Scheduled를 활용해 Polling 방식으로 데이터를 주기적으로 가져오는 구조를 구현합니다.

  • 예제:

    1. 스케줄러 클래스 작성

      @Component
      public class PollingService {
      
          @Scheduled(fixedRate = 5000) // 5초마다 실행
          public void pollExternalService() {
              System.out.println("Checking external service...");
              // 외부 서비스 상태 확인 로직 추가
          }
      }
    2. Application 설정

      • @EnableScheduling 추가로 스케줄링 활성화.
      @SpringBootApplication
      @EnableScheduling
      public class PollingApplication {
          public static void main(String[] args) {
              SpringApplication.run(PollingApplication.class, args);
          }
      }
    3. 실습 내용

      • 특정 API 상태를 확인하거나 DB 상태를 주기적으로 체크하도록 로직을 확장.
      • 예를 들어, 파일 업로드 상태를 감시하거나 데이터 처리를 위한 큐를 확인.

3. 인터럽트와 폴링 비교 실습

위 두 방식을 응용하여 실제 API 요청에서 두 가지 방식을 비교해볼 수 있습니다.

실습: 주문 상태 처리

  1. Polling 방식: 주문 상태를 주기적으로 확인하여 "배송 중"으로 변경.

    • @Scheduled 사용.
    • 상태 업데이트 전까지 무한 대기.
  2. Event-Driven 방식: 주문이 생성되거나 상태가 변경될 때 이벤트를 발행해 자동 처리.

    • ApplicationEventPublisher를 사용.
  3. 비교 결과 분석

    • Polling 방식의 CPU 및 네트워크 사용률.
    • Event-Driven 방식의 효율성.

4. 추가 실습 아이디어

RabbitMQ 또는 Kafka로 메시지 큐 활용 (Event-Driven 연습)

  • 메시지 큐는 이벤트 기반 시스템을 학습하는 데 매우 유용합니다.
  • 주문 생성 시 메시지를 발행(Publish)하고, 배송 시작 시 메시지를 소비(Consume)하도록 구현합니다.
  • 도구: RabbitMQ, Kafka, ActiveMQ 등.

5. 실습을 통해 배울 수 있는 것

  • 인터럽트와 이벤트 기반 처리의 효율성 이해.
  • Polling이 비효율적인 상황에서 Event-Driven 구조로 전환하는 방법.
  • Spring의 비동기 처리 및 스케줄링 기능 사용법.
  • 실제 백엔드 개발에서의 활용 방안.

이런 실습을 통해 인터럽트와 폴링 개념을 시스템 프로그래밍이 아닌 백엔드 개발에 맞게 체감하며 학습할 수 있습니다.

0개의 댓글