Skip to main content

인터럽트

인터럽트란?

인터럽트란 CPU가 프로그램을 실행하고 있을 때, 입출력 장치등에 예외상황이 발생하여 처리가 필요한 경우에 CPU에 알려 처리할 수 있도록 하는 것을 말한다. 다른 이벤트 처리 방법으로 폴링이 있는데, 폴링은 대상을 주기적으로 감시하여 상황이 발생하면 해당처리 루틴을 실행해 처리한다.

인터럽트가 필요한 이유?

이벤트가 발생했을 때만 CPU에 알려주고 처리하므로, CPU가 이벤트 발생 여부를 감시하고 있을 필요가 없어지게 된다. 그때, 다른 연산을 수행할 수 있게되므로 효율이 증가하게 된다.

인터럽트의 종류

인터럽트는 외부 인터럽트, 내부 인터럽트, 소프트웨어 인터럽트로 분류할 수 있다.

  • 외부 인터럽트
    • 전원 이상 인터럽트: 정전, 파워 이상 등
    • 기계 착오 인터럽트: CPU의 기능적인 오류
    • 외부 인터럽트
      • 자원이 할당된 시간이 다 끝난 경우
      • 키보드로 인터럽트 키를 누른 경우 (예를 들어, Ctrl + Alt + Delete)
      • 외부장치로부터 인터럽트 요청이 있는 경우
    • 입출력 인터럽트
      • 입출력장치가 데이터 전송을 요구하거나 전송이 끝나 다음 동작이 수행되어야 할 경우
      • 입출력 데이터에 이상이 있는 경우
  • 내부 인터럽트
    • 잘못된 명령이나 잘못된 데이터를 사용할때 발생하며 Trap이라고도 한다.
    • 프로그램 검사 인터럽트
      • 0으로 나누는 경우 (Division By Zero)
      • Overflow / Underflow
      • 기타 프로그램 Exception
  • 소프트웨어 인터럽트
    • 프로그램 처리 중 명령의 요청에 의해서 발생하며, 대표적인 형태는 프로그램에서 감시 프로그램 (SVC) 호출이 있다.
    • SVC (SuperVisor Call)
      • 사용자가 프로그램을 실행시키거나 감시프로그램을 호출하는 동작을 수행하는 경우
      • 복잡한 입출력 처리를 하는 경우

위에서 간략하게 인터럽트의 종류에 대해 언급했고, 보다 자세한 정보는 양햄찌님 블로그 에 자세히 설명되어 있으니 읽어보는 것을 추천한다.

인터럽트 처리 과정

아래 그림과 같이 CPU가 어떤 프로그램을 순차적으로 수행하는 도중에 외부로부터 인터럽트 요구가 들어오면, CPU는 기존 프로그램 수행을 중단하고, 요구된 인터럽트를 처리해주기 위한 프로그램을 먼저 수행하며, 이런 프로그램을 인터럽트 서비스 루틴(Interrupt Service Routine: ISR)이라고 한다. 그 후, 인터럽트에 대한 처리가 끝나면, CPU는 기존 프로그램으로 복귀하여 수행을 계속한다.

CPU는 인터럽트가 들어오면 그것을 인식할 수 있어야 하며, 이를 위하여 CPU는 각 명령어의 실행 사이클을 종료하고 다음 명령어를 위한 인출 사이클을 시작하기 전에, 인터럽트 요구 신호가 들어와서 대기 중인지 검사해야 한다. 만약, 인터럽트가 들어왔다면 다음 동작을 수행한다.

  1. 다음에 실행할 명령어의 주소를 가리키는 PC 내용을 스택에 저장
  2. 인터럽트 서비스 루틴을 호출하기 위해 루틴의 시작 주소를 PC에 적재

위와 같은 과정은 인터럽트 사이클 (Interrupt Cycle) 이라고 한다.

위 그림은 인터럽트 사이클이 추가된 명령어 사이클의 모습이다. 그림에서 주목해야할 점은, 중요한 프로그램이 실행 중이여서 CPU가 인터럽트를 받지 못하도록 되어있으면, 인터럽트 사이클이 수행되지 않는다는 점이다. 그런 상황이 아니라면 CPU는 항상 인터럽트 사이클을 수행한다.

인터럽트 우선순위

동시에 인터럽트가 발생하거나 인터럽트 서비스 루틴 수행 중 인터럽트가 발생할 수 있다. 이런 경우에는 다음과 같은 우선순위에 기반하여 처리한다.

전원 이상 인터럽트 > 기계 착오 인터럽트 > 외부 인터럽트> 입출력 인터럽트 > 잘못된 명령어 > 프로그램 검사 인터럽트 > 감시 프로그램 호출 (SVC)

나올 수 있는 면접 질문

  • 인터럽트의 정의와 사용하는 이유
  • 인터럽트가 들어온다면 어떻게 처리되는지?

참고

기여자


Junho Moon

📦