CPU가 하나의 명령어를 처리하는 흐름인 명령어 사이클과 그 흐름을 방해하는 인터럽트에 대해 알아보자.
명령어 사이클
- 프로그램 속 각각의 명령어들은 일정한 주기가 반복되며 실행된다. 이 주기를 명령어 사이클이라고 한다.
- 메모리에 저장된 명령어 하나를 실행하기 위해선? 명령어를 메모리에서 CPU로 가져와야한다. 그 단계를 인출 사이클이라고 한다.
- CPU로 명령어를 인출했다면 이제 명령어를 실행해야한다. 그 단계를 실행 사이클이라고 한다.

- 하지만 명령어가 이렇게 간단히 실행되지는 않는다. 간접 주소 지정 방식과 같은 경우는 명령어를 인출하여 CPU로 가져왔다 하더라도 실행을 위해 메모리 접근을 한 번 더 해야하기 때문이다.

- 어떤 명령어는 인출과 실행 사이클만으로 실행되고, 어떤 명령어는 인출, 간접, 실행 사이클을 거쳐 실행된다.
- 하지만 명령어 사이클은 '인터럽트'를 고려해야한다.
인터럽트
- CPU의 작업을 방해하는 신호를 인터럽트라고 한다.

동기 인터럽트
- 동기 인터럽트는 CPU에 의해 발생하는 인터럽트이다.
- CPU가 실행하는 프로그래밍상의 오류와 같은 예외적인 상황에서 마주쳤을 때 발생하는 인터럽트가 동기 인터럽트인데, 예외라고 부른다.
비동기 인터럽트
-
주로 입출력장치에 의해 발생하는 인터럽트이다.
-
일반적으로 비동기 인터럽트를 인터럽트라고 칭한다.
-
또 다른 말로는 하드웨어 인터럽트라고 부른다.
하드웨어 인터럽트
- 알림과 같은 인터럽트이다.
- 입출력 장업 중에도 CPU로 하여금 효율적으로 명령어를 처리할 수 있게 한다.
- 하드웨어 인터럽트 처리 순서
- 입출력 장치는 CPU에 인터럽트 요청 신호를 보낸다.
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
- 인터럽트 서비스 루틴 실행이 끝나면 4에서 백업해둔 작업을 복구하여 실행을 재개한다.
- 인터럽트 요청신호란?
- 인터럽트는 CPU의 정상적인 실행 흐름을 끊는 것이기에 다른 누군가가 인터럽트하기 전에는 CPU에게 물어봐야한다. 그것을 인터럽트 요청신호라고 한다.
- 인터럽트 플래그란?
- 인터럽트 서비스 루틴이란?
- 인터럽트를 처리하기 위한 프로그램.
- 인터럽트 핸들러 라고도 부른다.
- '키보드가 어떤 인터럽트 요청을 보냈을 때는 어떻게 작동한다'와 같이 어떤 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램이다.
- 인터럽트 벡터란?
- 인터럽트 서비스 루틴을 식별하기 위한 정보이다.
- 인터럽트 벡터를 알면 인터럽트 서비스 루틴의 시작 주소를 알 수 있기 때문에 CPU는 인터럽트 벡터를 통해 특정 인터럽트 서비스루틴을 처음부터 실행할 수 있다.
- CPU는 하드웨어 인터럽트 요청을 보낸 대상으로부터 데이터 버스를 통해 인터럽트 벡터를 전달받는다.
- CPU가 인터럽트를 처리한다 = 인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다.

위 그림과 같은 과정을 반복해 나가며 프로그램을 실행한다.
폴트란?
- 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외
트랩이란?
- 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외.
- 주로 디버깅할 때 사용한다.
중단이란?
- CPU가 실행중인 프로그램을 강제로 중단시킬 수 밖에 없는 심각한 오류를 발견했을 때 발생하는 예외
소프트웨어 인터럽트란?