폴링 방식은 CPU의 효율이 떨어지는 것과 동시에 여러 작업이 진행될 때 하나의 작업이 실행이 지연되거나 실행할 수 없는 단점이 있다고 했다. 이러한 문제점을 해결할 수 있는 방식 중 하나가 인터럽트 방식이다.
main문을 실행하고 있는 도중에 입출력 장치에서 필요할 때 마다 즉각적으로 CPU에게 인터럽트 신호를 전송하게 된다. 해당 인터럽트가 요청한 작업을 실행하기 위해 하고있는 동작을 멈추고 ISR(인터럽트 처리 루틴)으로 이동한다. ISR이 완료되면 CPU는 수행을 멈춘 곳으로 되돌아가 중지된 작업을 계속한다.
인터럽트 처리 과정
평소에는 노란색 LED와 파란색 LED를 번갈아가며 1초마다 깜빡이다가 스위치를 누르면 1초간 빨간색 LED를 켜고 다시 노란색, 파란색 LED를 계속 깜빡이게 개발한다고 생각해보자. 이 상황에서 노란색 LED와 파란색 LED가 깜빡이는 것은 순차적이고 반복적인 작업이지만 스위치가 눌러지는 예외 상황이 발생하면 빨간색 LED를 즉시 켜야 한다.
이처럼 반복적이고 순차적인 작업이 아닌 예외 적으로 즉시 처리되기를 원하는 명령이나 동작을 인터럽트 또는 예외 처리라고 부른다.
인터럽트가 발생하게 되면 일단,
1. 실행중인 작업을 중단하고 현재 태스크의 Context(레지스터 값)을 스택에 저장한다.
현재 프로그램 상태(PC, SR)를 저장하는 이유는 인터럽트 처리를 끝내고 작업을 원상 복구하기 위해서다.
예를 들어, 노란색 LED를 켜고 나서 인터럽트가 발생하여 빨간색 LED를 켰다. 인터럽트가 발생했을 때, 그다음 켜야 할 색이 파란색이란 것을 저장했었어야 빨간색 LED 다음에(인터럽트를 처리하고) 파란색 LED를 켜야 한다는 것을 알 수 있을 것이다.
이렇게 인터럽트 요청에 의해 기존의 프로세스의 상태를 저장하고 CPU가 우선순위의 프로세스를 수행하도록 새로운 프로세서의 상태, 레지스터값을 교체하는 것을 Context Switching이라고 한다.
2. 인터럽트를 처리하기 위해서 인터럽트 벡터 테이블을 참조하여 ISR 주소 값을 얻는다.
인터럽트 벡터 테이블이란 인터럽트 핸들러(ISR) 주소를 저장하고 있는 테이블을 말하고, 인터럽트 핸들러(Interrupt Service Routine)는 인터럽트를 처리하기 위한 코드이고, 함수의 형태를 가지고 있다.
3. 인터럽트 핸들러를 실행한다.
4. 원래 작업으로 돌아오기위해 아까 스택에 저장해두었던 Context를 복원한다.
5. PC값을 이용해 인터럽트 발생 전 수행하던 작업을 계속 진행한다.
장점
1. 요청이 들어올 때만 처리하기 때문에 CPU효율이 떨어지지 않는다.
2. 입출력 장치에서의 요청(인터럽트)가 발생하는 정확한 타이밍을 알 수 있기 때문에 즉각 반응할 수 있다.
단점
1. 우선순위 등 생각해야 할 게 많아서 폴링에 비해 구현이 복잡하다.
2. 인터럽트를 실행하기위해 Context Switching 등이 일어나면서 많은 비용이 소모될 수 있다.
인터럽트가 동시에 일어났을 때는 어떻해야 할까?
현재 인터럽트가 끝나고 바로 처리해주는 순차 처리가 있고, 만약 우선 순위가 더 높다면 현재 처리중인 인터럽트를 잠시 멈추고 우선순위가 더 높은 인터럽트를 먼저 처리할 수도 있다.
인터럽트 종류
인터럽트의 종류는 크게 외부인터럽트, 내부 인터럽트, SW인터럽트 3가지가 있다.
1. 외부 인터럽트는 전원 이상, 입출력 인터럽트(키보드, 프린터기 등), 타이머 인터럽트 등이 있다.
2. 내부 인터럽트는 잘못된 명령이나 데이터 사용으로 일어난다.
3. SW인터럽트는 프로그램 처리 중에 명령의 요청을 발생하는데, 예를 들어 SVC 인터럽트가 있다.
'MCU 제어 > 개념' 카테고리의 다른 글
DMA 방식 (0) | 2020.02.15 |
---|---|
폴링(Polling) 방식 (0) | 2020.02.07 |
UART 통신 이론 (0) | 2020.02.02 |