인터럽트 매커니즘은 컴퓨터를 설계하는가에 따라 상이할 수 있습니다. 일반적인 방법을 알아보겠습니다.
앞서 설명했듯 하드웨어는 '언제든지' 시스템 버스를 통해 신호를 보내 인터럽트를 발생시킬 수 있으므로, 인터럽트는 비동기 이벤트를 처리하는 방식입니다.
인터럽트는 장치 컨트롤러의 요청에 의해서도 발생할 수 있지만, 하드웨어 오류로 인해 프로그램을 중지시키기 위해서도 인터럽트가 발생될 수 있습니다. 이때, 인터럽트는 "시스템 오류로 인해 프로그램이 중지됨을 알리기 위해" interrupt service routine을 통합니다. interrupt service routine을 통하지 않으면 영문도 모른 채 프로그램이 종료되는 것처럼 보일 것입니다.
인터럽트 서비스 루틴(interrupt service routine,ISR)은 인터럽트 고유 핸들러(interrupt handler)와 같은 말입니다. (교재에는 단어가 혼용되어 기술돼 있습니다. 익숙해지기 위해 아래에서 저도 혼용해서 사용하고 있습니다.)

---
인터럽트 벡터, 인터럽트 체인
아무튼 인터럽트 요청에 대해 OS는 ISR를 찾아서 호출해 주어야 합니다. 인터럽트는 매우 빈번하게 일어나는 요청이므로, OS는 요청에 대해 어떤 interrupt servie routine를 이용해서 해당 인터럽트를 처리할 것인지 “빨리 결정” 해야 합니다. 그러기 위해서 interrupt servie routine들에 대한 포인터들로 이루어진 테이블을 미리 만들어두고 접근하면 빠릅니다. 이것을 인터럽트 벡터 방식 이라고 합니다.
인터럽트 벡터는 인터럽트 핸들러 리스트의 헤드 주소들을 모아놓은 배열이며(인덱스로 사용해서 점프), 하위 메모리에 약 100개 정도 저장되어 있습니다. 따라서 인터럽트 벡터는 HW적인 방식입니다.
즉, 인터럽트 벡터 방식을 이용하면 필요한 장치를 결정하기 위해 하나의 인터럽트 핸들러가 가능한 모든 인터럽트 소스를 검색할 필요를 줄일 수 있습니다. 인터럽트 벡터 방식을 사용하지 않는다면 OS는 인터럽트 요청에 대해서 해당 인터럽트의 정보를 조사하기 위한 루틴을 호출한 뒤에 인터럽트 소스를 모두 검사한 뒤, 인터럽트 고유 핸들러를 호출 하는 직선적인 방법을 사용해야 합니다.
인터럽트 벡터는 하위 메모리에 약 100개 정도 저장되어 있다고 언급했습니다. 그러나 실제 컴퓨터에는 인터럽트 벡터의 주소 개수보다 많은 장치가 있습니다. 이 문제를 해결하기 위해서 인터럽트가 일어날 수 있는 장치들을 한 개의 회선에 직접 직렬로 연결해 두는 방법이 있습니다. 이것을 인터럽트 체인(데이지 체인)이라고 합니다. 연결할 때 우선순위에 맞게 연결할 수 있습니다. 인터럽트가 발생하면 요청을 처리할 수 있는 핸들러를 발견할 때 까지 인터럽트 핸들러 리스트를 하나씩 호출합니다.
---
CPU관점에서 인터럽트
CPU는 명령을 처리하는 곳입니다. CPU는 하나의 명령어를 실행완료할 때마다 인터럽트 요청 라인(Interrupt request line)을 감지하는데, 컨트롤러로부터의 인터럽트요청이 있으면 즉시 하던일을 멈추고 인터럽트 포인터가 가리키는 위치로 실행을 옮깁니다. 그리고 interrupt service routine(interrupt handler)이 완료되면 CPU로 돌아가서 복귀 주소를 프로그램 카운터(PC)에 적재하고 인터럽트된 시점에서 연산을 재개합니다.
CPU가 인터럽트 이후에도 인터럽트 이전에 하던 작업을 이어서 계속 해야하기 때문에, 인터럽트 루틴에서 현재 상태를 저장해야하고 복귀하기 전에 상태를 복원하는 작업이 필요합니다. 이 작업은 인터럽트 처리기가 합니다.
인터럽트 처리기는 작업 중 변경상태 저장, 인터럽트 원인 확인, 필요한 처리 수행, 상태 복원, CPU의 인터럽트 전 상태로 점프 합니다.
또, 가장 긴급한 작업을 먼저 수행하기 위해 최신 컴퓨터는 인터럽트 우선순위 시스템을 사용합니다. 우선순위 레벨을 통해 CPU는 모든 인터럽트를 마스킹하지 않고도 우선순위가 낮은 인터럽트 처리를 연기할 수 있으며, 우선순위가 높은 인터럽트가 실행을 선점할 수 있습니다. 인터럽트는 maskable과 unmaskable로 나뉘는데, unmaskable 인터럽트는 즉시 실행되어야 하는 인터럽트로,벡터번호 0~31번상에 있습니다. maskable 인터럽트는 비교적 후 순위로 벡터번호 32~255번 입니다.
인터럽트를 마무리하면서, CPU의 관점에서 인터럽트의 전체적인 흐름을 살펴보겠습니다.
1. 장치 컨트롤러가 인터럽트 요청 라인에 신호를 선언해서 인터럽트 발생
2. CPU가 인터럽트 포착 및 인터럽트 핸들러로 디스패치(인터럽트 번호를 인터럽트 벡터의 인덱스로 사용해서 인터럽트 핸들러 루틴으로 점프)
3. 인터럽트 핸들러는 장치 서비스하고 인터럽트 지움
---
다음 글에서는 저장장치 구조, 입출력구조, 컴퓨터 시스템 구조에 대해서 알아보겠습니다.