Interrupt 및 예외 요약
인터럽트를 알기위한 간략한 명령어 사이클 설명
명령어를 처리하는 과정 Fetch cycle - Decode cycle - Indirect cycle - Excute cylce - interrupt cycle 으로 명령어 사이클이 돈다.
Indirect cycle 의 경우, 간접 주소 지정 방식등의 의해서 다시 메모리에서 읽는 단계를 말한다.
인터럽트란(interrupt) 란?
위와 같은 명령어 사이클이 반복되는 CPU 의 흐름을 끊는 것. 그렇다면 왜 끊을까? CPU 가 다른 급한 작업을 처리 할 수 있도록 흐름을 끊는 것이다. 인터럽트는 먼저 크게 두가지로 나눌 수 있다.
동기 인터럽트 (예외)
비동기 인터럽트 (하드웨어 인터럽트)
하드웨어 인터럽트란?
만약 외부 입출력장치인 스캐너를 사용한다고 가정하고, 해당 스캐너가 스캔한 내용을 화면에 띄우고자 할 때 해당 내용을 읽기 위해 스캔이 끝날때 까지 대기한다면 엄청난 비효율이 발생한다. 즉, CPU 가 스캔한 데이터를 읽을 수 있다는 알림을 주는 것이 이 하드웨어 인터럽트이다. 이렇게 되면 CPU는 그동안 다른 작업을 처리하다 인터럽트가 발생 할 때만 해당 작업을 처리하면 되는 것이다. (마우스나 키보드도 마찬가지이다.)
하드웨어 인터럽트의 처리 순서
입출령 장치는 인터럽트 신호를 CPU 에 보냄.
참고 : CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인함
인터럽트 요청이 있다면 인터럽트 플래그를 확인하여 처리 가능/불가능을 판단함
플래그레지스터 값이 1이라면 CPU는 지금까지 작업을 백업
인터럽트 백터를 참조하여 인터럽트 서비스 루틴을 실행
끝나면 백업해 둔 작업을 복구하여 재실행
여기서 인터럽트 플래그가 0이더라도 인터럽트 처리를 해야 하는 상황이 있다. 바로 정전이나 하드웨어 고장으로 인한 인터럽트이다.
인텁럽트 서비스 루틴(ISR 또는 인터럽트 핸들러)이란?
인터럽트 핸들러라고도 불리며, 인터럽트가 발생했을 때 어떻게 처리하고 작동할지에 대한 정보가 들어있는 프로그램 이다.
각 인터럽트마다 (예: 마우스, 키보드, 스캐너 등) 고유한 ISR 을 가지며, 각 ISR 의 시작 주소는 인터럽트 벡터에 저장된다.
(여기서 벡터는 자료구조 보다는 연속적인 배열의 의미로 쓰인다.)
(왜 시작주소만 저장하냐? -> ISR 도 결국 프로그램이기 때문에 메모리에 어딘가에 저장되어 있어 인터럽트 벡터에는 시작주소만 저장한다.)
또한, 현대의 ISR 은 부팅 시 운영체자가 메모리 상의 인터럽트 디스크립터 테이블(IDT)을 설정한다.
각 인터럽트(예: 마우스, 키보드, 스캐너 등)는 고유한 인터럽트 서비스 루틴(ISR) 을 가지고 있으며, 이를 구분하기 위해 인터럽트 벡터(Interrupt Vector) 를 사용한다.
ISR은 다른 프로그램과 마찬가지로 명령어와 데이터로 이루어져 있으며, PC등 여러 레지스터를 사용함.
이때 이전에 사용되던 프로그램의 값들은 스택에 백업해두고 인터럽트를 처리하고 나면 복원 후 재시작한다.
예외 (동기 인터럽트)
예외의 종류에는 4가지가 있다. trap, fault, abort, software interrupt
trap
시스템 콜, 디버깅 브레이크포인트 등이 발생 했을때
해당 예외는 일부러 발생시키는 예외를 발생시켜 인터럽트를 거는 경우를 말하며 당연히 어떠한 기능을 수행하기 위하여 인터럽트를 거는 것
그렇기 때문에 해당 예외가 발생한다면, 어떠한 다른 작업을 처리하고 바로 다음 명령어부터 시작함
falut
예상하지 못한 오류로 인한 인터럽트이며, 오류가 발생한 명령어부터 재개함
예시로는 페이지폴트 생각해보면 쉽다. 사용하려는 명령어나 데이터가 프레임에 없는 경우 발생한다. 이때 디스크에서 가져오는 페이지인 또는 페이지 스왑을 통해 해결함
당연히 그러면 예외가 발생한 명령어부터 시작해야겠지?
복구 못하는 falut 도 있다. 예로들어 Segmentation falut 의 경우, 잘못된 메모리 접근으로 인한 강제 종료이다. (특별히 시그널 핸들러(signal handler)를 등록하면 프로그램이 죽지 않고 예외처리처럼 대응 가능하다는데 뭔소릴까... 잘 모르겠다.)
abort
Abort는 assert 실패, abort() 호출, 메모리 손상 탐지 같은 의도된 강제 종료로 Segmentation Falut 와 다르다.
다시말해, 프로그램이 복구 불가능한 오류로 자발적으로 종료하는 것은 Segmentation Falut 와 같지만 종료 시키는 주체가 다르다.
프로그램이 스스로 종료하며, Seg Falut 는 OS가 비정상적인 접근으로 강제 종료이며, 종료 이유 또한 로직 오류 또는 명시적인 assert 실패, abort 호출 등이 있다.
Last updated