기본 콘텐츠로 건너뛰기

6월, 2018의 게시물 표시

인터럽트와 예외 - 1

개요 인터럽트는 프로세서가 실행하는 명령어의 순서를 바꾸는 사건으로 정의한다. 이런 사건은 CPU의 내·외부에서 하드웨어적인 회로가 발생하는 전기적인 신호에 해당하다. 흔히 동기적 인터럽트와 비동기적 인터럽트로 나눈다. 동기적인 인터럽트는 CPU의 제어 유닛이 명령어를 실행하는 과정에서 발생하는데, 제어 유닛은 명령어 실행을 마친 후에만 이를 발생시키기 때문에 동기적이라고 한다. 비동기적 인터럽트는 다른 하드웨어 장치가 CPU 클럭의 신호와 관계없이 아무 때나 발생한다. 인텔 마이크로프로세서 매뉴얼에서는 동기적인 인터럽트를 예외(Exception), 비동기적인 인터럽트를 인터럽트라고 명한다. 인터럽트는 간격 타이머와 입출력장치에 의해 발생한다. 입출력장치인 키보드의 키를 누르면 인터럽트가 발생한다. 반면, 예외는 프로그래밍 에러나 커널이 처리해야 하는 비정상적인 상황에 의해 발생한다. 프로그래밍 에러인 경우 커널은 현재 프로세스에게 신호를 보내 예외를 처리한다. 비정상적인 상황인 경우에는 페이지 폴트(Page Fault)나 커널 서비스 요청(int 또는 systenter) 같은 비정상적인 상황을 복구하는데 필요한 모든 단계를 수행한다. 인터럽트 신호와 역할 인터럽트 신호는 프로세서가 정상적인 제어 흐름 밖의 코드로 방향을 바꾸는 방법을 제공한다. 인터럽트 신호가 도착하면 CPU는 EIP와 CS 레지스터를 커널 모드 스택에 저장하고, 발생한 인터럽트 종류와 연계된 주소를 프로그램 카운터에 넣어 수행한다. 이 전환 과정은 프로세스 전환 과정의 컨텍스트 전환과 큰 차이가 있다. 인터럽트·예외 핸들러가 실행하는 코드는 프로세스가 아니다. 인터럽트가 발생한 시점에 CPU를 점유하고 있던 프로세스가 수행되던 과정에서 실행되는 커널 제어 경로라고 할 수 있다. 인터럽트 핸들러는 커널 제어 경로 이므로 프로세스보다 가볍다. 인터럽트는 다음의 조건을 만족해야 한다. 가능한 빨리 인터럽트에서 벗어나고 되도록 ...