인터럽트라는 단어를 간간히 들었지만, 모른채 지나갔다. 그래서 이렇게 블로그를 정리하면서 공부해보려고 한다.
인터럽트란? 하나의 예시를 들어보면 CPU라는 선생님이 수업도중(작업) 갑자기 어느 학생이 질문이 있다고 한다. 바로 이 학생이 한 행동을 인터럽트(interrupt)라고 한다. 즉, CPU의 정상적인 프로그램 실행 을 방해했다는 의미다. 이때 선생님은 학생의 질문을 먼저 처리하고, 다시 원래 했던 수업으로 돌아가 다시 진행한다.
인터럽트는 크게 내부 인터럽트와 외부 인터럽트 두 가지 종류가 있다. 어떤 경우에는 하드웨어 인터럽트와 소프트웨어 인터럽트 두 가지 경우로 나누는 경우도 있다.
1.하드웨어 고장(Hardware Interrupt)
외부 인터럽트는 주로 입출력장치에 의해 발생된다.
1. 타이머 인터럽트 : 타이머가 일정한 시간 간격으로 중앙처리장치에게 인터럽트를 요청
2. 입출력 인터럽트 : 속도가 느린 입출력장치가 입출력 준비가 완료되었음을 알리기 위해 인터럽트를 요청
하드웨어가 발생시키는 인터럽트로, CPU가 아닌 다른 하드웨어 장치가 cpu에 어떤 사실을 알려주거나 cpu 서비스를 요청해야 할 경우 발생시킨다.
소프트웨어가 발생시키는 인터럽트이다. 소프트웨어(사용자 프로그램)가 스스로 인터럽트 라인을 세팅한다.
종류: 예외 상황, system call
인터럽트를 발생시키기 위해 하드웨어/소프트웨어는 cpu내에 있는 인터럽트 라인을 세팅하여 인터럽트를 발생시킨다.
cpu는 매번 명령을 수행하기 전에 인터럽트라인이 세팅되어있는지를 검사한다.
인터럽트 처리과정에서 가장 핵심적인 내용은 인터럽트 서비스 루틴이다. 즉, 어떤 소스(source)가 인터럽트 요청을 하면 반복적으로 수행하는 일이 있다는 뜻이다. 다른 말로 인터럽트 핸들러(interrupt handler)라고도 한다.
소스(source)마다 처리해달라고 하는 일은 서로 다르다. 그래서 기억장치 어딘가에 서로 다른 일을 처리할 수 있도록 루틴들을 (기억장치에) 저장해두었다. 인터럽스 서비스 루틴 역시 기억장치 내에 저장되어 있는 프로그램(program)이라는 점이다.
아키텍처 구조에 따라 인터럽트 벡터를 서로 다르게 지정한다. 위 표는 AVR ATmega128 마이크로컨트롤러가 정의하는 인터럽트 벡터의 일부다. 위에서 언급했던 내부 / 외부 인터럽트에 대해 상황처리를 서로 다른 주소에서 처리하는 것을 알 수 있다.
인터럽트 번호는 예외상황 인터럽트를 제외하고 운영체제가 결정한다. 리눅스에서 인터럽트 번호는 아래와 같다.
0 ~ 31 : 예외상황 인터럽트
32 ~ 47 : 하드웨어 인터럽트
128 : 시스템 콜