Interrupt란 CPU의 작업을 방해하는 신호로 CPU가 작업을 중단해야 할 정도의 중요한 문제 혹은 먼저 처리해야할 다른 작업이 발생했을 때 발생한다.
Interrupt는 아래 2종류가 있다.
비동기 인터럽트는 주로 입출력장치에 의해 발생한다.
주로 알림과 같이 동작하며 CPU는 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 이러한 기능을 사용한다.
만약 interrupt를 사용하지 않는다면, IO작업은 CPU의 작업에 비해 현저하게 느리기 때문에 만약 interrupt를 사용하지 않는다면 주기적으로 IO작업의 완료를 확인해야하며 그 결과 clock을 낭비하게 된다.
하지만 입출력장치에서 interrupt를 보낸다면 CPU가 직접 완료 여부를 확인할 필요없이 interrupt를 받을 때까지 다른 작업을 진행할 수 있다.
순서는 아래와 같이 진행된다.
1. CPU에 interrupt 요청 신호를 보낸다.
2. CPU는 매 사이클 별로 명령어를 인출하기 전 항상 interrupt 여부를 확인한다.
3. CPU가 interrupt 요청을 확인하고 interrupt flag를 통해 현재 interrupt를 받아들일 수 있는지 여부를 확인한다.
4. 가능하다면 CPU는 지금까지의 작업을 백업한다.
5. CPU는 interrupt vector를 참조해 interrupt service routine을 실행한다.
6. interrupt service routine이 끝나면 4에서 백업해둔 작업을 복구해 실행을 재개한다.
이때 CPU가 요청을 수용하기 위해서 flag register의 interrupt flag가 활성화되어 있어야 요청을 받아들여 interrupt로 처리한다.
다만, 모든 interrupt를 interrupt flag로 막을 수는 없는게, interrupt flag가 비활성화 되어 있어도 가장 우선순위가 높은, 정전이나 하드웨어 고장 등의 interrupt 등은 무시할 수 없다.
CPU가 interrupt를 받아들이기로 했다면 그 다음에는 ISR(interrupt service routine)을 실행한다.
ISR은 Interrupt handler라고도 부르며 어떤 interrupt가 발생했을 때 해당 interrupt를 어떻게 처리하고 작동해야할 지에 대한 정보로 이루어진 테이블이며 memory에 적재되어있다.
즉, IO 장치 별로 다른 ISR을 가지고 있으며 이를 실행하기 위한 여러 ISR을 가지고 있고 이를 구분하기 위해 Interrupt vector를 이용한다.
Interrupt vector를 알고 있으면 이를 통해 특정 ISR을 처음부터 실행할 수 있다.
exception 이라고도 부르며 exception이 발생하면 CPU는 하던 일을 중단하고 해당 exception을 처리한 뒤 CPU는 다시 본래 작업으로 되돌아와 실행을 재개한다.
여기서 예외가 발생한 명령어부터 실행할지, 예외가 발생한 명령어의 다음 명령어부터 실행하는지에 따라 fault와 trap으로 나뉜다.
fault는 예외처리 후 예외가 발생한 명령어부터 실행을 재개하는 예외이다.
예를 들어, CPU가 실행할 명령어가 memory가 아닌 disk 등에 있는 경우 필요한 데이터를 memory로 가져와 저장한다.
memory에 데이터를 가져오면 그 다음에는 CPU가 실행을 재개하면서 그 명령어를 실행해 memory에서 필요한 데이터를 사용하도록 하는 경우가 fault이다.
trap은 exception을 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 작업을 시작한다.
예를들면 debuging 등에서 사용하는데, 특정 코드가 실행되는 순간 프로그램의 실행을 멈추기 위해 trap을 발생시켜 그 순간의 상태를 확인하도록 한다.
그 뒤 debuging이 끝나면 다음 명령어부터 프로그램을 이어서 실행할 수 있도록 할 수 있다.
그 외에도 abort, software interrupt가 있는데, abort는 CPU가 실행 중인 프로그램을 강제로 중단시킬 수 밖에 없는 심각한 오류를 발견했을때 발생시키는 exception이다.
software interrupt는 system call에 의해 발생하는데 이는 후에 자세히 다루도록 한다.