인터럽트에 대해 설명해보세요.
인터럽트(interrupt)
컴퓨터 작동 중에 예기치 않은 문제가 발생한 경우라도 업무 처리가 계속될 수 있도록 하는 컴퓨터 운영체계의 한 기능. 작동 중인 컴퓨터에 예기치 않은 문제가 발생한 경우 CPU(중앙처리장치:central processing unit) 자체가 하드웨어적으로 상태를 체크하여 변화에 대응하는 것을 말한다.
인터럽트가 발생하면 그 순간 운영체계 내의 제어프로그램에 있는 인터럽트 처리 루틴(routine)이 작동하여 응급사태를 해결하고 인터럽트가 생기기 이전의 상태로 복귀시킨다.
인터럽트가 발생하는 원인으로는 프로그램을 실행하는 도중 갑작스런 정전이나 컴퓨터 자체 내에서 기계적인 문제가 발생한 경우(기계검사 인터럽트), 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우(외부 인터럽트), 입출력의 종료나 입출력의 오류에 의해 CPU의 기능이 요청되는 경우(입출력 인터럽트), 프로그램 실행 중 보호된 기억 공간 내에 접근하거나 불법적인 명령 수행과 같은 프로그램의 문제가 발생한 경우(프로그램검사 인터럽트) 등이 있다.
프로그래밍 방식에는 인터럽트 방식과 폴링(polling) 방식이 있는데 인터럽트 방식을 사용하면 두 가지 이상의 프로세서를 동시에 수행할 수 있고, 이상(異常) 현상을 쉽게 파악할 수 있어 훨씬 효율적이다.
▲ 인터럽트
인터럽트 종류
인터럽트에는 3가지 종류가 있다. 예외상황 인터럽트, 하드웨어 인터럽트, 그리고 시스템 콜이 그것이다. 예외상황 인터럽트와 하드웨어 인터럽트는 다시 여러 가지 종류로 나뉜다.
- 예외상황 인터럽트는 시스템에 심각한 에러가 생겼을 때 발생된다. 어떤 수를 0으로 나누라는 명령어가 실행되었다든지, 페이지 폴트가 일어났다든지 하는 것이 그것이다. 인텔 0x86 프로세서에서는 20가지의 예외상황을 정의해놓고 있다.
- 하드웨어 인터럽트는 주변장치에 사건이 일어났을 때 발생된다. 키보드를 건드린다든지, 네트워크 카드에 패킷이 도착했다든지 하는 사건이 그것이다. 인텔 프로세서는 16개 내외의 하드웨어 인터럽트를 정의하고 있다.
- 마지막으로 시스템 콜은 프로그래머가 int 명령으로 발생시킨다. 앞에서 설명한 예외상황과 하드웨어 인터럽트는 프로그래머가 int 명령으로 직접 발생시키는 것이 아니고 시스템에 예외적인 혹인 하드웨어적인 사건이 일어났을 때 시스템이 자동으로 발생시킨다. 하지만 시스템 콜은 프로그래머가 운영체제의 서비스를 요청하기 위해 프로그램 내에서 int 명령을 통해 발생시킨다.
시스템 콜의 사용규칙은 운영체제가 정하며 리눅스는 0x80 번 (10진수로 128번) 인터럽트를 시스템 콜로 정의하고 있다. 운영체제가 제공하는 시스템 콜 서비스는 리눅스의 경우 250 여개가 넘기 때문에 프로그래머는 eax 레지스터에 시스템 콜 번호를 전달함으로써 요청 서비스를 명시해야 한다.
[인터럽트 번호]
각 인터럽트마다 인터럽트 번호가 붙는다. 인터럽트 번호 자체는 예외상황 인터럽트를 제외하고는 운영체제가 결정한다. 리눅스에서 인터럽트 번호는 아래와 같다.
- 0 ~ 31 : 예외상황 인터럽트 (20~31 은 아직 정의되지 않음)
- 32 ~ 47 : 하드웨어 인터럽트 (주변장치의 개수에 따라 증감이 가능)
- 128 : 시스템 콜
바이오스도 실제 운영체제가 로드될 때까지 시스템을 제어해야 하므로 인터럽트 번호를 설정한다. 바이오스가 설정하는 인터럽트 번호는 아래와 같다.
- 0 ~ 7 : 예외상황 인터럽트
- 8 ~ 19 : 하드웨어 인터럽트
- 10, 13 : 시스템 콜
바이오스가 설정한 인터럽트 번호와 리눅스가 설정한 인터럽트 번호는 상충한다. 따라서 리눅스는 로딩이 되면 제일 먼저 바이오스가 설정한 인터럽트 번호 영역을 제거하고 자신의 인터럽트 번호를 설정한다.
[인터럽트 발생]
- 예외상황 인터럽트는 프로그램 실행 도중 심각한 에러 상황이 나타나면 발생된다.
- 하드웨어 인터럽트는 각종 주변장치에 사건이 일어났을 때 발생한다.
- 시스템 콜은 프로그램에서 INT 0x80 명령이 수행되었을 때 발생한다.
▲ 예외상황 인터럽트의 종류
▲ 하드웨어 인터럽트의 종류
하드웨어 인터럽트의 발생을 cpu에 알리는 것은 8259A 칩이다. 8259A 칩에는 8개의 입력단자가 있으며 이들은 8개의 주변장치에 연결되어있다. 0번 단자는 타이머, 1번 단자는 키보드 등이다.
주변 장치가 많은 경우는 또 하나의 8259A칩이 사용되며, 이 두 번째 8259A를 slave, 첫 번째 8259A를 master라고 부른다. slave 8259A 역시 8개의 입력단자를 통해 추가로 8개의 주변장치의 인터럽트를 처리할 수 있다. slave는 master에게 인터럽트 발생을 알려야 하기 때문에 master의 2번 입력단자는 slave에 연결되어 있다.
입력단자에 연결된 주변장치에 인터럽트가 발생하면 8259A는 해당 입력단자의 번호 (irq번호 : interrupt request 번호) 에 자신의 내부메모리에 기록된 base 값을 더하여 그 값을 방금 발생한 인터럽트의 번호로 cpu에게 신고한다. 이 base값을 세팅함으로서 운영체제는 8259A가 cpu에게 전달하는 인터럽트 번호를 제어할 수 있다.
리눅스는 master 8259A의 base값은 32로, slave 8259A의 base 값은 40으로 초기화한다. 따라서 예를 들어 키보드가 눌리면 irq1에 연결된 키보드 컨트롤러가 인터럽트 시그널을 보내고 master 8259A는 33 (base 32 + irq 번호 1 = 33) 이라는 번호를 cpu에게 전달하고 cpu는 INT 33 이 발생했다고 판단하게 된다.
커뮤니티 Q&A
위 이론과 관련된 게시글이에요.
이해가 안 되거나 궁금한 점이 있다면 커뮤니티에 질문해 보세요!
게시글 작성하기