명령어 Cycle과 Interrupt(인터럽트)
핵심
명령어는 일반적으로 인출과 실행이 반복된다.
그 중간에 메모리 접근이 더 필요한 경우에는 간접 사이클이 실행되는데
이렇게 반복되는 흐름을 끊어버리고 명령어를 실행할 수 있도록
인터럽트라는 개념이 있다.
CPU가 일반적인 사이클로 돌고있다가 먼저 빠르게 처리해야할 다른 작업이 생겼을때 인터럽트가 발생한다.
명령어 사이클
- 프로그램 속 명령어들이 일정한 주기가 반복되며 실행되는것을 말한다.
- CPU는 메모리에 있는 값을 CPU의 레지스터 혹은 내부로 인출해온 뒤 실행을 한다.
(즉 인출 - 실행 - 인출 - 실행의 반복)
- 하지만 주소지정방식이 메모리 접근이 더 필요한 경우에는 명령어를 한번 더 접근해야 하므로
간접 사이클이 실행되는것이다.
인터럽트
1. 종류
1) 동기 인터럽트 (Exception) >> 추후 운영체제에서 좀 더 자세히 다룰 예정이라고 한다.
- CPU가 예기치 못한 상황을 접했을때 발생한다.
- 종류에는 폴트 / 트랩 / 중단 / 소프트웨어 인터럽트가 있다.
2) 비동기 인터럽트(하드웨어 인터럽트)
- 주로 입출력장치에 의해 발생한다.
- 문제는 아니며 알림과 같은 역할을 한다. 이름에서 알 수 있다시피 '비동기' 인터럽트이기 때문에 실행을 중단하지 않는다.
- 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용한다.
(입출력 장치는 CPU에 비해 느리므로, 인터럽트가 없다면 CPU는 입출력장치 행동의 완료여부를 확인하기위해 주기적으로 낭비될 것이다.)
2. 인터럽트의 처리 순서
1) 입출력장치는 CPU에 인터럽트 요청신호를 보낸다.
2) CPU는 실행 사이클이 끝난뒤 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
3) CPU는 인터럽트 요청을 확인 후 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는 여부를 확인한다.
4) 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
(기존 레지스터에 들어있는 값들을 전부 스택에 백업해 두는 순서)
5) CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행
6) 인터럽트 서비스 루틴 실행이 끝나면 백업해둔 작업을 복구하여 실행을 재개한다.
=> CPU가 인터럽트를 처리한다 == 인터럽트 벡터를 통해 인터럽트 서비스루틴의 시작점을 확인하여 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다.
** 용어 설명
1) 인터럽트 요청신호
- 입출력 장치들이 CPU에게 요청을 보내는 신호
2) 인터럽트 플래그
- 레지스터중에 인터럽트 플래그가 있다. 이 값을 통해 받아들일수 있는지 없는지를 판별
- 하지만 모든 인터럽트를 막을 수 있는것은 아니다. (이런 인터럽트를 non maskable interrupt)라고 한다.
3) 인터럽트 서비스 루틴
- 인터럽트가 발생했을때 해당 인터럽트를 어떻게 처리할것인지에 대한 프로그램
- 메모리에 저장되어있으며 예시로 "키보드가 인터럽트 요청을 보내면 이렇게 행동해야 한다."라는 메뉴얼이 적혀져있다고 생각하면 된다.
4) 인터럽트 벡터
- 각각의 인터럽트를 구분하기 위한 정보이다. 즉, 인터럽트의 서비스루틴의 시작점이라고 생각하면 될것같다.