본문 바로가기
Computer Architecture/Basic

인터럽트(Interrupt)

by FastBench 2023. 4. 5.

초안 :  2023.04.04

 

CPU 가 하나의 명령어를 처리하는 데에는 정해진 흐름이 있고, 이를 반복하며 명령어들을 처리해 나간다.

이러한 정형화된 흐름을 command cycle 이라고 한다.

 

이전 게시글에서 간단한 그림으로 CPU 가 메모리에서 명령어를 인출하고 실행하는 과정을 살펴봤다.

다시 정리해보면

1. 메모리에 있는 명령어를 CPU 로 가져오고 (Fetch)

2. 이를 디코딩 하여 명령어를 실행한다. 즉, 컨트롤러가 IR 에 담긴 명령어를 디코딩 하여 control signal 을 발생 시킨다. (Execution)

그런데 만약 명령어를 실행하는데, indirect addressing mode 로 되어있어 메모리 접근이 한번 더 필요한 경우에는 바로 execution cycle 에 돌입할 수 없다. 이렇게 메모리 접근을 한번 더 하는 단계를 indirect cycle 이라고 한다.

 

즉 command cycle 을 정리하면 아래와 같다.

Command Cycle

 

그런데 이러한 정해진 흐름이 깨지는 상황이 발생하는데, 이를 interrupt 라고 한다.

예를 들어 리눅스에서 프로그램을 실행하다가 Ctrl+Z 를 누르거나 Kill signal 을 날리는 경우에 해당한다.

 

 CPU는 interrupt 를 받으면 수행중인 작업을 (잠시) 중단한다. 아래에 인터럽트의 종류를 살펴보자.

 

1. Synchronous interrupts

CPU 에 의해 발생하는 인터럽트이다. CPU 가 명령어들을 수행하다가 프로그래밍 상의 오류와 같이 예상치 못한 상황에 마주치면 synchronous interrupt (동기 인터럽트) 를 발생한다. 프로그래밍을 할때 예외 처리(exception) 를 하게 되는데, 같은 말이다. synchronous interrupt 는 exception 라고 부른다.

 

2. Asynchronous interrupts

주로 입출력장치에 의해 발생하는 인터럽트이다.

만약 cpu 가 입출력장치에 어떠한 입출력 작업을 부탁 할 경우(ex. 프린터 작업), 입출력 작업을 끝낸 입출력장치는 CPU 에 작업이 끝난걸 알려야 하는데 이때 asynchronous interrupt 를 보내게 된다.

만약 이런 과정이 없다면 CPU 는 수시로 입출력장치의 상태를 확인하면서 작업이 끝났는지 아닌지를 검사해야 한다. ( 리소스 낭비 )

 다른 예시로, 우리가 지금 하고 있는 마우스 클릭, 키보드 입력 또한 모두 asynchronous interrupt 이다. 

synchronous interrupt 를 exception(예외) 라고 부르듯 asynchronous interrupt 는 hardware interrupt 라고 부른다.

 

즉, 하드웨어 인터럽트는 입출력 작업 중에도 cpu 가 다른 일을 할 수 있게 하여 효율적으로 명령어를 처리할 수 있게 한다.

 

CPU 는 하드웨어 인터럽트를 어떻게 처리할까? 제조사마다 cpu 작동방식이 다르더라도 기본적인 틀은 똑같다.

1. 입출력장치가 CPU 에 하드웨어 인터럽트 (인터럽트 요청 신호)를 보낸다.
2. CPU는 execution cycle 이 끝나고 명령어를 fetch 하기 전에 항상 인터럽트 여부를 확인한다.
3. CPU 가 인터럽트 요청을 확인하면 인터럽트 플래그를 통해 인터럽트를 받아들일 수 있는지 여부를 확인한다.
4. 인터럽트를 받아들일 수 있다면 CPU 는 지금까지의 작업을 백업한다.
5. CPU는 인터럽트 벡터를 참고하여 인터럽트 서비스 루틴을 실행한다.
6. 인터럽트 서비스 루틴이 끝나면 4에서 백업한 작업을 복구하여 실행한다.

 

flag register 에는 interrupt flag 도 포함되어 있다.하드웨어 인터럽트를 받아들일지 말지를 결정하는 flag 로, 만약 CPU 가 너무 중요한 작업을 진행중이라 방해를 받으면 안될 때 해당 flag 를 disable 로 처리한다. (1일지 0일지는 제조사 마다 다름). 즉 위 과정에서 3번에 해당 하는 과정이 이에 해당한다.

flag register 의 예시

인터럽트를 받아들이기로 결정했다면, CPU는 인터럽트 서비스 루틴 ( ISR,  인터럽트를 처리하기 위한 프로그램, 예를들어 키보드 입력이 발생했을 때 실행해야 하는 프로그램, interrupt handler 라고도 한다.) 을 실행하기 전에  백업을 진행한다. 인터럽트 서비스 루틴이 끝나고 다시 돌와와서 하던 일을 끝내야 하기 때문이다. 즉, PC 와 기타 레지스터 값과 같은 필요한 모든 내용을 스택에 백업하고 ISR 프로그램의 시작 주소가 위치한 곳으로 PC 값을 갱신하고 ISR 을 실행한다.

 

 

마우스, 키보드, 프린터와 같이 인터럽트를 처리하는 방식은 각 입출력장치마다 다른데, 이는 각기 다른 ISR 을 가지고 있음을 의미한다. 즉, 메모리에는 여러개의 ISR 들이 저장되어 있다. 따라서 CPU 는 하드웨어 인터럽트를 처리할때 어떤 ISR 을 실행할지 식별하기 위해 Interrupt vector (인터럽트 벡터) 를 참고한다. 인터럽트 벡터에는 ISR 의 시작 주소가 들어있으므로 CPU 는 이를 통해 특정 장치의 특정 ISR 을 처음부터 실행 할 수 있다.

 

ISR 이 끝난 후에는 스택에 백업한 내용들을 다시 CPU 내부로 불러와서 이전까지 수행하던 작업을 재개한다.

 

따라서, CPU 의 command cycle 은 아래와 같다.

 

 

Reference

  • 혼자 공부하는 컴퓨터 구조 + 운영체제, 한빛미디어, 강민철

댓글