Interrupt
마이크로프로세서에서 인터럽트(interrupt, {가로채기})란 마이크로프로세서(CPU)가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말한다. 폴링이 대상을 주기적으로 감시하여 상황이 발생하면 해당처리 루틴을 실행해 처리한다면, 인터럽트는 상대가 마이크로프로세서에게 일을 처리해 달라고 요청하는 수단이다. 따라서 폴링과 대비대는 개념이다.
마이크로프로세서의 다른일과 겹쳐 폴링이 고속의 하드웨어에서 데이터 손실될 여지가 있다면, 인터럽트는 해당 하드웨어가 CPU에게 요청하므로 빨리만 처리된다면 데이터 손실 위험이 작아진다. 폴링은 리얼타임에 문제의 소지가 있다면, 인터럽트는 필요할 때 처리되는 경향이 있어서 폴링보다 유리하다.
마이크로프로세서는 인터럽트를 감지하면 지금 실행중인 기계어 코드를 중단하고 해당 인터럽트를 위한 처리 프로그램으로 점프하여 해당 일을 수행 한다. 인터럽트 처리를 위한 루틴을 인터럽트 서비스 루틴(ISR, Interrupt Service Routine)이라고 한다. 인터럽트는 주로 하드웨어적으로 CPU 코어(CPU-core)에 입력되고, 현재 진행중인 기계어 코드가 종료되면 실행한다. 인터럽트가 접수 되었을 때, 인터럽트를 처리할 것인가는 CPU코어의 특수레지스터에 비트 마스크을 통해 선택적으로 수용한다.
인터럽트가 걸리면 해당 서비스 루틴이 실행되어야 하는데, 현재 진행중인 프로그램이 영향을 받으면 안되므로 우선 ISR에서 레지스터를 스택에 대피하고 해당일을 수행한다. 레지스터 대피는 ISR에서 행하도록 기계어 코드를 구성해야 한다. C로 작성할 경우 일반함수와 차이를 두어 컴파일마다 정의하는 방식이 제공된다.
CPU코어 외부에서 인터럽트를 거는 경우가 일반적이지만, CPU 내부에서 실행하면서 걸리는 경우도 있다. 예를들어 DIV 명령어를 실행할 때 0으로 나누어지거나, 주소 버스에서 할당되지 않는 주소공간을 액세스 한다든지 하는 경우를 예외(exception)라고 말하고 예외처리를 한다. 예외처리도 인터럽트의 한 종류이므로 처리방식도 인터럽트의 방식과 같다.
인터럽트를 소프트웨어적으로 실행하는 방법도 제공한다. 인터럽트 기계어 명령에 의해 실행된다. x86의 경우 INT 명령어가 소프트웨어 인터럽트 명령어 이다. 어떤 마이크로프로세서(모토로라 68000)의 경우 트랩이라는 용어를 사용하기도 한다.
컴퓨터 시스템에서 인터럽트를 거는 원천은 여러개가 존재하는 것이 일반적이다. 따라서 인터럽트의 종류를 구분하는 방법이 필요하다.
Interrupt descriptor table
Hardware-generated exceptions
All INT_NUM
between 0x0
and 0x1F
, inclusive, are reserved for exceptions; INT_NUM
bigger than 0x1F
are used for interrupt routines. (Note that the IBM PC did not always obey this rule, for instance using interrupt 5 to indicate the Print Screen key was pressed.)
INT_NUM | Short Description PM |
0x00 | Divide by 0 |
0x01 | Debugger |
0x02 | Non-maskable interrupt |
0x03 | Breakpoint |
0x04 | Overflow |
0x05 | Bounds |
0x06 | Invalid Opcode |
0x07 | Coprocessor not available |
0x08 | Double fault |
0x09 | Coprocessor Segment Overrun (386 or earlier only) |
0x0A | Invalid Task State Segment |
0x0B | Segment not present |
0x0C | Stack Fault |
0x0D | General protection fault |
0x0E | Page fault |
0x0F | reserved |
0x10 | Math Fault |
0x11 | Alignment Check |
0x12 | Machine Check |
0x13 | SIMD Floating-Point Exception |
인터럽트의 종류
외부 인터럽트
- 전원 이상 인터럽트(Power fail interrupt)
- 말그대로 정전, 파워 이상 등
- 기계 착오 인터럽트(Machine check interrupt)
- CPU의 기능적인 오류
- 외부 신호 인터럽트(External interrupt)
- 타이머에 의한 인터럽트 - Preemptive개념을 생각하면 된다. 자원이 할당된 시간이 다 끝난 경우
- 키보드로 인터럽트 키를 누른 경우 - 대표적으로 Control + Alt + Delete
- 외부장치로부터 인터럽트 요청이 있는 경우 - I/O 인터럽트 아님!! 다른 개념이다
- 입출력 인터럽트(I/O Interrupt)
- 입출력장치가 데이터 전송을 요구하거나 전송이 끝나 다음 동작이 수행되어야 할 경우
- 입출력 데이터에 이상이 있는 경우
내부 인터럽트
- 잘못된 명령이나 잘못된 데이터를 사용할때 발생하며 Trap이라 부른다.
- 프로그래 검사 인터럽트(Program check interrupt)
- Division by zero
- Overflow/Underflow
- 기타 Exception
소프트웨어 인터럽트(SVC : SuperVisor Call)
- 사용자가 프로그램을 실행시키거나 감시프로그램(Supervisor)을 호출하는 동작을 수행하는 경우
인터럽트 동작 순서
- 인터럽트 요청
- 프로그램 실행 중단 : 현재 실행중이던 Micro operation 까지 수행한다.
- 현재의 프로그램 상태 보존 : PCB(Process Control Block), PC(Program Counter) 등
- 인터럽트 처리루틴 실행 : 인터럽트를 요청한 장치를 식별한다.
- 인터럽트 서비스 루틴 실행 : 인터럽트 원인을 파악하고 실질적인 작업을 수행한다. 처리기 레지스터 상태를 보존한다. 서비스 루틴 수행 중 우선순위가 더 높은 인터럽트가 발생하면 또 재귀적으로 1~5를 수행한다.
- 상태복구 : 인터럽트 발생 시 저장해둔 PC(Program counter)를 다시 복구한다.
- 중단된 프로그램 실행 재개 : PC의 값을 이용하여 이전에 수행중이던 프로그램을 재개한다.
인터럽트 우선순위
여러 장치에서 인터럽트가 동시에 발생하거나 인터럽트 서비스 루틴 수행 중 인터럽트가 발생했을 경우 우선순위를 따져서 처리한다.
- 전원 이상(Power fail)
- 기계 착오(Machine Check)
- 외부 신호(External)
- 입출력(I/O)
- 명령어 잘못
- 프로그램 검사(Program Check)
- SVC(SuperVisor Call)
일반적으로 하드웨어 인터럽트가 소프트웨어 인터럽트보다 우선 순위가 높고 내부 인터럽트 보다 외부 인터럽트가 우선 순위가 높다.
인터럽트 우선순위 판별 방법
소프트웨어적인 방법 (Polling)
- 인터럽트 요청 플래그를 차례로 비교하여 우선순위가 가장 높은 인터럽트 자원을 찾고, 이에 해당하는 인터럽트 서비스 루틴을 수행한다.
- 속도가 따른 장치에 높은 등급을 부여한다.
- 우선순위 변경이 쉽다.
- 많은 인터럽트가 있을 경우 하드웨어 적인 방법에 비해서 우선순위 판단 속도가 느리다.
- 회로가 간단하고 융통성이 있으며, 별도의 하드웨어가 필요 없다.
하드웨어적인 방법 (Vectored Interrupt)
- 인터럽트를 요청할 수 있는 장치와 CPU사이에 장치번호를 식별할 수 있는 버스를 직렬/병렬로 연결한다.
- 인터럽트 벡터는 인터럽트를 발생한 장치가 분기할 곳에 대한 정보이다.
- 소프트웨어적인 방법에 비해 비경제적이다.
- 회로가 복잡하고 융통성이 없으나, 별도의 소프트웨어가 필요없이 하드웨어로 처리되므로 속도가 빠르다.
- 하드웨어적인 방법은 아래 2가지로 나뉜다.
- Daisy Chain
- 인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결한다.
- 우선순위가 높은 장치를 상위에 두고 우선순위 차례대로 배치한다.
- 병렬(Parallel) 우선순위 부여 방식
- 인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결한다.
- 각 장치별 우선순위를 판별하기 위한 Mask register에 bit를 설정한다.
- Mask register상 우선순위가 높은 서비스 루틴 수행중 우선순위가 낮은 bit들을 비활성화 시킬 수 있다.
- 반대로 우선순위가 높은 인터럽트는 낮은 인터럽트 수행 중에도 우선 처리된다.
인터럽트 서비스 루틴을 실행할 때 인터럽트 플래그(IF)를 1로 하면 인터럽트 발생을 방지할 수 있다.