CPU가 하나의 명령어를 처리하는 과정에는 어떤 정해진 흐름이 있고, CPU는 그 흐름을 반복하며 명령어들을 처리해 나간다. 이렇게 하나의 명령어를 처리하는 정형화된 흐름을 명령어 사이클이라고 한다. CPU는 정해진 흐름에 따라 명령어를 처리해 나가지만, 간혹 이 흐름이 끊어지는 상황이 발생하는데 이를 인터럽트라고 한다.
우리들이 실행하는 프로그램은 수많은 명령어로 이루어져 있고, CPU는 이 명령어들을 하나씩 실행한다. 이때 프로그램 속 각각의 명령어들은 일정한 주기가 반복되며 실행되는데, 이 주기를 명령어 사이클(Instrunction cycle)이라고 한다. 즉, 프로그램 속 각각의 명령어들은 명령어 사이클이 반복되며 실행된다.
거창한 이름이 붙긴 했지만 알고보면 매우 단순한 개념이다. 메모리에 저장된 명령어 하나를 실행한다고 가정해보자. 가장 먼저 무엇을 해야될까? 명령어를 메모리에서 CPU로 가져와야 한다. 이게 명령어 사이클의 첫 번째 과정이다. 메모리에 있는 명령어를 CPU로 가지고 오는 단계를 **인출 사이클(Fetch cycle)**이라고 한다.
CPU로 명령어를 인출했다면 이제 명령어를 실행한다. 이것이 명령어 사이클의 두 번째 과정이다. CPU로 가져온 명령어를 실행하는 단계를 **실행 사이클(Execution cycle)**이라고 한다. 제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생시키는 단계가 실행 사이클이다.
프로그램을 이루는 수많은 명령어는 일반적으로 인출과 실행 사이클을 반복하며 실행된다. 즉, CPU는 프로그램 속 명령어를 가져오고 실행하고, 또 가져오고 실행하고를 반복하는 것이다. 이를 도식화면 다음과 같다.
하지만 모든 명령어가 이렇게 간단히 실행되는 것은 아니다. 명령어를 인출하여 CPU로 가져왔다 하더라도 곧바로 실행할 수 없는 경우도 있기 때문이다. 예를들어 간접주소 지정방식을 생각해보자. 간접주소 지정방식은 오퍼랜드 필드에 유효 주소의 주소를 명시한다고 했다. 이 경우 명령어를 인출하여 CPU로 가져왔다 하더라도 바로 실행 사이클에 돌입할 수 없다. 명령어를 실행하기 위해서는 메모리 접근을 한 번 더 해야하기 때문이다. 이 단계를 **간접 사이클(Indirect cycle)**이라고 한다. 간접 사이클까지 추가한 명령어 사이클 도식은 아래와 같다.
하자민 명령어 사이클은 이게 끝이 아니다. 아직 고려해야 할 것이 하나 더 남아 있는데, 바로 인터럽트이다. 인터럽트란 무엇일까?
프로그램을 개발하다 보면 인터럽트라는 단어를 쉽게 접할 수 있다. 인터럽트란 무엇일까? 인터럽트는 영어로 interrput이며 ‘방해하다’, ‘중단시키다’를 의미한다. 즉, CPU가 수행 중인 작업은 방해를 받아 잠시 중단될 수 있는데, 이렇게 CPU의 작업을 방해하는 신호를 인터럽트라고 한다.
CPU가 작업을 잠시 중단해야 할 정도라면 인터럽트는 ‘CPU가 꼭 주목해야 할 때’ 혹은 ‘CPU가 얼른 처리해야 할 다른 작업이 생겼을 떄’ 발생할 것이다. 구체적으로 어떤 상황에서 인터럽트가 발생하는지를 인터럽트의 종류를 통해 알아보도록 하자.
인터럽트의 종류에는 크게 동기 인터럽트와 비동기 인터럽트가 있다.
**동기 인터럽트(Synchronous interrupts)**는 CPU에 의해 발생하는 인터럽트이다. CPU가 명령어들을 수행하다가 예상치 못한 상황에 마주쳤을 때, 가령 CPU가 실행하는 프로그래밍상의 오류와 같은 예외적인 상황에 마주쳤을 때 발생하는 인터럽트가 동기 인터럽트이다. 이런 점에서 동기 인터럽트는 예외(Exception)라고 부른다.