들어가기 앞서 해당 글은 '혼자 공부하는 컴퓨터구조 + 운영체제'를 참고로 작성되었습니다. 

 

 

 인터럽트는 명령어 사이클이 도는 와중 이를 중단 시키는 걸 가리킨다. 

 인터럽트는 다시 동기 인터럽트(synchronous interrupt)비동기 인터럽트 (asynchronous interrupt) 로 나뉜다.

 

 동기 인터럽트(synchronous interrupt)

 동기 인터럽트는 '예외'라고도 불리며 cpu에서 발생하는 인터럽트다. 예외가 발생 했을 때 cpu는 잠시 하던 작업을 멈추고 예외를 처리하게 된다. 

 동기 인터럽트의 종류는 다음과 같다.

 

 폴트(Flault) 

 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개한다.

 예를 들어 현재 어떤 명령어를 실행하는데 특정 데이터가 필요한 상황이다. 하지만 해당 데이터가 메모리가 아닌 보조기억장치에 있으면 해당 보조기억 장치에 요청을 해야한다. 데이터를 요청을 하고 데이터가 준비되었으면 인터럽트가 발생한 시점부터 작업을 진행하게 된다.

 

 트랩(Trap)

 폴트와 유사하다. 다만 인터럽트가 발생한 시점이 아닌 그 다음 명령어부터 실행을 한다는 것에서 차이가 있다. 간단하게 디버깅을 예로 들 수 있겠다.

 

 중단(Adort)

 대단히 심각한 오류다. 대표적으로 잘못된 메모리 값. 가령 배열 크기를 넘어선 값을 읽어 온다든지 하는 경우를 예로 들 수 있겠다.  

 

외에 소프트웨어 인터럽트가 있는데 이는 운영체제를 다룰 때 같이 다루겠다.

 

 비동기 인터럽트 (asynchronous interrupt)

 비동기 인터럽트는 입출력장치에 의해 발생하는 인터럽트다.

 cpu가 입출력장치에게 작업을 명령 후 입출력장치가 해당 작업을 완료했을 때 그 완료 신호로, 또는 키보드나 마우스 이벤트가 발생했을 때 그 이벤트 처리를 할 때 저마다 cpu에게 인트럽트를 요청하게 된다. 글을 쓰고 있는 지금도 cpu에게 입력알림 인터럽트를 보내고 있다. 

 

 그럼 인트럽트 발생시 cpu는 어떻게 처리하는지 알아보자

 

 1. cpu가 보낸 작업을 완료했을 시 또는 입출력장치의 입력 인트럽트 등의 발생 시, 입출력장치는 cpu에 인트럽트 요청신호를 보낸다. 즉, 인트럽트를 바로 발생시켜 cpu의 실행중인 작업을 바로 중단 시키지 않는다는 것이다.

 

 2. cpu는 실행 사이클이 끝나고 다시 명령어를 인출하기 전 인트럽트를 확인한다.

 

 3. cpu는 인트럽트 요청을 확인하고 플래그 레지스터에서 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 판단한다.

 참고로 인터럽트 우선순위가 높은 인터럽트(하드웨어 고장) 등은 인터럽트 플래그로 무시할 수 없다.

 

 4. 인터럽트를 받아들일 수 있다면 cpu는 현재 실행중인 작업을 백업한다. 백업은 메모리의 스택영역에 임시로 저장을 한다.

 

 5. cpu는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다. 

 인트럽트 서비스 루틴이란 인트럽트가 발생 했을 시 해당 인트럽트를 처리하는 프로그램이다. 쉽게말해 키보드의 입력 신호를 받았을 때 어떠한 식으로 처리하겠다 라는 메뉴얼인 셈이다.

  인터럽트 벡터는 인터럽트 서비스 루틴의 시작주소의 정보를 담고 있으며 시스템이 부팅될 때 인터럽트 벡터 테이블( Interrupt Vector Table )이라는 특정 메모리 영역에 저장된다.

 

 6. 인터럽트 서비스 루틴이 끝나면 백업했던 작업을 복구하여 작업을 재개한다. 

 

 

 

 인터럽트 요청 및 인터럽트 벡터 참조->실행 중인 프로그램 데이터 백업->참조한 주소로 점프하여 인터럽트 서비스 루틴 실행->작업이 끝나면 백업했던 작업을 복구하여 이어서 작업하는 순이다.

 

 사실 1번 과정 중간에 거치는 하드웨어가 있는데 이는 다음 글에서 다루겠다. 

 

+ Recent posts