프로그램 속 명령어들은 일정한 주기가 반복되며 실행 된다. 이 주기를 명령어 사이클이라고 하며, 이 주기를 끊어내는 것을 인터럽트라고 한다.
명령어나 프로그램을 CPU가 처리하기 위해서는 가장 먼저 메모리에 있는 명령어를 가져와야 한다.
- 인출 사이클 : 가장 먼저 CPU로 가져온다.
이렇게 가져온 명령어를 실행한다.
- 실행 사이클 : 가져온 명령어를 실행한다.
일반적으로 CPU는 위 2가지 사이클이 계속해서 반복되며 동작한다. 인출-실행-인출-실행-......
그런데 CPU로 명령어를 가지고 왔지만 바로 실행이 불가능한 경우도 있다.
아래 그림과 같이 인출을 하더라도 추가적으로 메모리에 접근해야 하는 경우가 있다. ex) 간접 주소 지정 방식
이런 경우 간접사이클이 추가된다.
인터럽트
CPU가 꼭 주목해야 할 때, CPU가 우선적으로 처리해야 하는 작업이 생겼을 때 발생한다.
인터럽트의 종류
- 동기 인터럽트 (예외) : CPU가 예기치 못한 상황을 접했을 때 발생
- 비동기 인터럽트 (하드웨어 인터럽트) : 주로 입출력장치에 의해 발생한다. ex) 알림(세탁기 완료 알림, 전자레인지 조리 알림)과 같은 역할
왜 존재할까?
CPU가 입출력 작업 도중에서도 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트를 사용한다.
입출력장치는 CPU에 비해 느리다. 그렇기 때문에 인터럽트가 없다면 CPU는 프린트 완료 여부를 확인하기 위해 주기적으로 확인을 해야한다.
하지만 인터럽트가 있다면 CPU는 계속해서 자기 일을 할 수 있다.
하드웨어 인터럽트 처리 순서
처리 순서 중
- 인터럽트 요청 신호
- 인터럽트 플래그
- 인터럽트 벡터
- 인터럽트 서비스 루틴
에 대해 알아보자.
- 인터럽트 요청 신호 : 말 그대로 CPU의 정상적인 흐름을 끊는 것이기 때문에 요청 신호를 보내게 된다.
CPU가 인터럽트 요청을 받아들이려면 ??
인터럽트 플래그를 확인한다. 현재 인터럽트를 받아들일 수 있는지 없는지 확인이 가능하다.
- 인터럽트 플래그 : 현재 인터럽트를 받아들일 수 있는 상태인지 아닌지 관리
다만 모든 인터럽트를 인터럽트 플래그로 막을 수 있는건 아니다.
이후 CPU가 인터럽트를 받아들이기로 했다면 인터럽트 서비스 루틴(=프로그램)을 실행한다.
- 인터럽트 서비스 루틴 : 인터럽트가 발생했을 때, 해당 인터럽트를 어떻게 처리하기 위한 프로그램
인터럽트 서비스 루틴도 프로그램이기 때문에 메모리에 저장되어 있다. 메모리에 시작주소를 가지고 있다.
- 인터럽트 벡처 : 각각의 인터럽트를 구분하기 위한 정보. CPU가 해당 인터럽스 서비스의 시작주소를 알기 위해
"CPU가 인터럽트를 처리한다" == "인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다."
(+인터럽트의 시작 주소는 인터럽트 벡터를 통해 알 수 있다.)
근데 문제가 있다.
아래 그림과 같이 이미 CPU 레지스터 안에는 여러 정보가 저장되어 있을것이다. 이런 것들은 버리고 인터럽트를 먼저 실행해야 할까?
인터럽트를 끝내고 나면 되돌아와 이전에 수행하던 작업을 이어서 실행해야 하기 때문에 인터럽트를 실행하기 전 백업을 해둬야 한다.
이러한 백업을 메모리 스택에 저장해두게 된다.
인터럽트의 처리 순서 정리
'컴퓨터구조와 운영체제' 카테고리의 다른 글
명령어 병렬 처리 기법(CPU) (3) | 2024.07.01 |
---|---|
빠른 CPU를 위한 설계 기법 (0) | 2024.06.28 |
레지스터 (0) | 2024.06.26 |
ALU와 제어장치 (0) | 2024.06.25 |
소스 코드와 명령어 (0) | 2024.06.24 |