[운영체제] 인터럽트(Interrupt)

xoey·2024년 10월 25일

운영체제

목록 보기
4/15
post-thumbnail

서문

컴퓨터 시스템에서 하드웨어와 소프트웨어의 다양한 장치들이 원활하게 상호작용하기 위해서는 서로의 상태를 적절히 파악하고, 필요한 작업을 즉시 처리할 수 있는 메커니즘이 필요하다. 이때, 가장 중요한 역할을 하는 것이 인터럽트(Interrupt)이다.

이 글에서는 인터럽트의 정의와 종류, 그리고 구체적인 동작 방식에 대해 설명하며, 더불어 폴링과의 차이점도 함께 다루어볼 것이다. 이를 통해 시스템 내에서 인터럽트가 어떤 방식으로 작동하며, 왜 중요한지를 명확히 이해해보자.

1. 인터럽트(Interrupt)란?

OS는 서로 다른 일을 하는 수많은 하드웨어를 사용한다.

이런 장치들은 동기적으로 구동되는데, 이는 각각 동작이 완료될 때까지 기다려야 하므로 “아무것도 하지 않으면서 바쁜 상태”로 많은 시간을 소비하게 된다.

이때, 인터럽트를 사용하여 한 번에 하나의 명령만 수행할 수 있는 CPU의 한계를 보완할 수 있다.

  • 사전적 의미: 방해하다, 중단시키다
  • OS적 의미: CPU의 정상적인 프로그램 실행을 방해했다는 뜻
  • 프로그램을 실행하는 도중에 예기치 않은 상황이 발생했을 경우, 현재 실행 중인 작업을 중단하고 발생된 상황을 처리한 후, 다시 실행 중인 작업으로 복귀하는 것

2. 종류

2.1. 하드웨어 인터럽트

2.1.1. 외부 인터럽트

CPU 코어 외부에서 발생한 이벤트를 전기적 신호로 CPU에 알리는 인터럽트

  • 정전·전원 이상 인터럽트: 정전 또는 전원 공급의 이상으로 인한 인터럽트
  • 기계고장 인터럽트: CPU 및 기타 하드웨어의 오류로 인한 인터럽트
  • 외부 인터럽트: Timer나 Operator로 인한 인터럽트
  • 입출력 인터럽트: 입출력의 종료나 입출력의 오류로 인한 인터럽트

2.1.2. 내부 인터럽트

CPU 내부에서 발생하는 하드웨어적 예외 상황이나 오류로 인해 발생하는 인터럽트

  • 프로그램 검사 인터럽트: Divide by Zero, Overflow/underflow 등의 오류로 발생하는 하드웨어적 예외

2.2. 소프트웨어 인터럽트

프로그램 실행 중 특정 동작이나 시스템 호출에 의해 발생하는 인터럽트

  • SVC(SuperVisor Call): 시스템 호출(System Call)을 위한 소프트웨어 인터럽트로, 시스템 자원 요청이나 파일 입출력 등 OS의 기능을 사용할 때 발생
  • Trap: Divide by Zero와 같은 프로그램 오류가 발생했을 때 예외 처리를 위해 소프트웨어가 의도적으로 발생시키는 인터럽트

💡 우선순위

정전·전원 이상 인터럽트 > 기계고장 인터럽트 > 외부 인터럽트 > 입출력 인터럽트 > 프로그램 검사 인터럽트 > SVC(SuperVisor Call)

3. 동작

3.1. 처리 과정

요청 → 중단 → 보관 → 처리 → 재개

  1. 인터럽트 요청
    • 하드웨어 또는 소프트웨어에서 인터럽트가 발생
  2. 프로그램 실행 중단 및 상태 보관
    • 현재 실행 중인 명령어까지 수행 완료
    • 현재 PC(Program Counter) 값을 저장하여, 나중에 복원할 수 있도록 함.
      이를 통해 인터럽트 처리가 끝난 후 원래 실행 위치로 돌아갈 수 있게 된다.
    • 레지스터 및 현재 상태 저장
  3. 인터럽트 서비스 루틴(ISR)으로 점프
    • 인터럽트 벡터 테이블을 참조하여 해당 인터럽트에 맞는 ISR의 주소를 확인하고, ISR로 이동
  4. 인터럽트 서비스 루틴 처리
    • 인터럽트 원인을 파악하고 필요한 작업을 처리.
    • 더 높은 우선순위의 인터럽트가 발생할 경우, 새로운 인터럽트 처리를 우선 수행
  5. 상태 복구 및 프로그램 재개
    • 저장된 레지스터 값과 PC 값 복원
    • RETI(Return from Interrupt) 명령어로 인터럽트를 종료하고, 복원된 PC 값을 통해 원래 프로그램의 중단된 위치에서 작업을 이어간다.

3.2. 인터럽트 핸들러(Interrupt Handler)

CPU에서 인터럽트가 발생했을 때 그 인터럽트를 처리하는 코드
실행 중이던 레지스터와 PC를 보관함으로써 CPU의 상태를 보존한다.
인터럽트가 핸들링이 완료되면 이전의 상태로 복귀된다.

3.3. 인터럽트 벡터(Interrupt Vector)

인터럽트 요청이 발생했을 때, CPU는 인터럽트 소스가 무엇이며, 해당 인터럽트 ISR이 어디에 적재되어 있는지 확인해야 한다. 이때, CPU는 인터럽트 벡터를 활용한다.

  • 여러 종류의 인터럽트에 대한 ISR의 시작 주소
  • 인터럽트 벡터 테이블: 주기억 장치의 특정 영역에 여러 개의 인터럽트에 대한 인터럽트 벡터를 모아놓은 영역

🤔 인터럽트 vs 폴링

폴링(Polling)

CPU가 주기적으로 주변 장치나 시스템의 상태를 검사하여 이벤트 발생 여부를 확인하는 방법
cf) 인터럽트는 CPU에 이벤트를 알리는 신호

비교 요약

  • 인터럽트와 폴링 모두 외부 장치와 CPU 간의 상호작용을 통해 이벤트를 감지하고 처리하는 메커니즘으로, CPU 자원을 사용하여 장치의 상태를 확인하고 이에 대응하는 작업을 수행한다.
  • 인터럽트는 이벤트가 발생했을 때 CPU가 즉시 처리하도록 하는 방식으로, 실시간성이 뛰어나고 자원 효율이 높으나, 복잡한 구현과 오버헤드가 있을 수 있다.
  • 폴링은 CPU가 주기적으로 상태를 검사하여 이벤트를 처리하는 방식으로, 구현이 간단하고 제어가 용이하지만, 비효율적인 자원 사용과 실시간성이 부족하다.

마치며

컴퓨터 시스템에서 인터럽트는 보이지 않지만 굉장히 중요한 역할을 담당한다. 다양한 작업이 동시에 이루어지는 현대의 컴퓨팅 환경에서는, 예기치 않은 사건이나 중요한 요청이 발생할 때 시스템이 즉각적으로 대응할 수 있어야 한다. 이때, 인터럽트는 프로그램의 흐름을 중단시키고 필요한 작업을 우선 처리함으로써 시스템의 유연성과 효율성을 보장해준다.

오늘 배운 인터럽트 처리 메커니즘을 통해 컴퓨터가 복잡한 작업들을 어떻게 유연하게 관리하는지 다시금 깨달았다. 앞으로 개발을 할 때 이런 개념을 염두에 두고 시스템의 효율성과 반응성을 높이는 방법을 고민해봐야겠다는 생각이 들었다.


Reference

profile
[Roman 8:18] consider that our present sufferings are not worth comparing with the glory that will be revealed in us.

0개의 댓글