2024. 4. 24. 15:28ㆍCS/컴퓨터구조
명령어 사이클
프로그램 속 각각의 명령어들은 일정한 주기가 반복되며 실행되는데 이 주기를 명령어 사이클이라고 한다.
CPU가 메모리로부터 명령어를 읽어오는 주기를 인출 사이클이라고 하며, CPU 내부의 제어장치가 명령어 레지스터로부터 명령어를 읽고 제어신호를 발생시켜 명령어를 실행하는 사이클을 실행 사이클이라고 한다.
하지만 모든 명령어들이 인출 사이클과 실행 사이클만 반복하는 것은 아니다.
예를 들어 간접 주소 지정 방식은 메모리에 곧바로 접근하는 것이 아니라 유효 주소를 가지고 있는 메모리에 한번 더 접근이 이루어져야한다. 이렇게 메모리 접근이 더 필요한 경우를 간접 사이클 단계라고 한다.
인터럽트
인터럽트는 CPU의 정상적인 작업을 방해하는 신호이다.
인터럽트의 종류에는 동기 인터럽트와 비동기 인터럽트가 있다.
동기 인터럽트는 CPU에 의해 발생하는 인터럽트이다. CPU가 명령어를 처리하다가 예상치 못한 상황에 마주쳤을 때 발생한다. 따라서 동기 인터럽트를 예외라고 부른다.
비동기 인터럽트는 주로 입출력장치에 의해 발생하는 인터럽트이다. 하드웨어 인터럽트라고 생각하면 된다.
CPU가 프린터와 같은 입출력장치에 입출력 작업을 부탁하면 작업을 끝낸 입출력장치가 CPU에게 인터럽트를 보낸다.
하드웨어 인터럽트 (비동기 인터럽트)
일종의 알람 역할이다. 하드웨어 인터럽트를 사용하는 이유는 CPU가 입출력장치의 작업 도중에도 효율적으로 명령어를 처리하기 위함이다. CPU의 수행속도보다 입출력장치의 수행속도가 느리기 때문에 알람이 없다면 CPU는 일일히 입출력장치가 수행을 완료했는지 확인할 수 밖에 없다. 하지만 완료되었다고 알람을 보낸다면 일일히 확인할 필요가 없어지게 된다. 그 시간에 CPU는 자기의 일을 집중해서 끝낼 수 있는 것이다.
하드웨어 인터럽트는 다음의 순서를 거쳐 처리된다.
- 입출력장치는 CPU에게 인터럽트 요청 신호를 보낸다.
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
- 인터럽트 서비스 루틴 실행이 끝나면 4번에서 백업해 둔 작업을 복구하여 실행을 재개한다.
여기서 4가지 용어를 뽑아보자.
- 인터럽트 요청 신호
- 인터럽트 플래그
- 인터럽트 벡터
- 인터럽트 서비스 루틴
인터럽트는 CPU의 정상적인 실행 흐름을 끊은 것이기에 지금 인터럽트가 가능한지 요청 신호를 보내야한다.
이때 보내는 신호가 바로 인터럽트 요청 신호이다.
CPU가 인터럽트 요청 신호를 받으면 무작정 인터럽트를 받아들이는 것이 아니다. 플래그 레지스터의 인터럽트 플래그 값을 확인한다. 만약 가능하다고 설정되어있다면 하던 작업을 백업하고, 불가능하다면 무시한다. 하지만 인터럽트 플래그로 막지 못하는 인터럽트도 존재한다.
CPU가 인터럽트 요청을 받아들이기로 결정했다면 하던 작업을 백업하고 인터럽트 서비스 루틴을 실행한다. 인터럽트 서비스 루틴은 어떤 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램이다.
그림과 같이 현재 실행중인 프로그램에 인터럽트가 발생했을 때 인터럽트 서비스 루틴으로 점프를 뛴 다음에 인터럽트 서비스 루틴을 실행하고 다시 현재 실행중인 프로그램으로 돌아온다.
인터럽트를 처리하는 방법은 입출력장치마다 다르기 때문에 메모리에는 여러 개의 인터럽트 서비스 루틴이 저장되어 있다.
이렇게 각기 다른 인터럽트 서비스 루틴을 구분하기 위해서 인터럽트 벡터를 사용한다.
인터럽트 벡터를 알면 인터럽트 서비스 루틴의 시작주소를 알 수 있기 때문에 CPU는 인터럽트 벡터를 통해 특정 인터럽트 서비스 루틴을 처음부터 실행할 수 있다.
정리하자면 CPU가 인터럽트를 처리하는 것은 원래 하던 작업을 백업하고 인터럽트 서비스 루틴을 실행한 후 돌아오는 것이다.
이때 인터럽트 서비스 루틴의 시작주소는 인터럽트 벡터를 통해 알 수 있다.
그렇다면 백업은 어디에 할까? 백업은 메모리의 스택 영역에 해두고 서비스 루틴이 끝나면 스택에 저장된 값을 다시 불러온다.
인터럽트 사이클까지 추가한 명령어 사이클은 다음과 같다. CPU는 이 과정들을 반복하면서 프로그램을 실행하는 것이다.
'CS > 컴퓨터구조' 카테고리의 다른 글
메모리와 캐시 메모리 (0) | 2024.05.17 |
---|---|
CPU 성능 향상 기법 (0) | 2024.05.16 |
CPU의 작동원리2️⃣ - 레지스터 (0) | 2024.04.18 |
CPU의 작동원리1️⃣ - 사칙연산, ALU, 제어장치 (0) | 2024.04.17 |
소스 코드와 명령 (0) | 2024.04.11 |