명령어 사이클
프로그램은 수많은 명령어로 이루어져 있으며, CPU는 이 많은 명령어를 하나씩 처리합니다. 이때 프로그램 속 명령어들은 일정한 주기가 반복되며 실행되는데, 이 주기를 명령어 사이클이라고 합니다.
크게 인출 사이클과 실행 사이클로 구분합니다.
① 인출 사이클
메모리에 있는 명령어를 CPU로 가지고 오는 단계
② 실행 사이클
인출한 명령어를 실행하는 단계
인출한 명령어를 바로 실행이 가능한 경우가 있지만 메모리 접근이 더 필요한 경우 간접 사이클이 포함될 수 있습니다.
인터럽트
인터럽트란 CPU의 작업을 방해하는 신호입니다. 어떤 상황에서 인터럽트가 발생하느냐에 따라 동기 인터럽트와 비동기 인터럽트로 나뉩니다. 통상적으로 인터럽트는 비동기 인터럽트를 의미합니다.
1. 동기 인터럽트
CPU가 실행하는 프로그래밍상의 오류와 같은 예외적인 상황에 마주쳤을 때 발생하는 인터럽트입니다. '예외'라고도 부릅니다.
2. 비동기 인터럽트(하드웨어 인터럽트)
입출력 장치에 의해 발생하는 인터럽트입니다. CPU가 프린터와 같은 입출력 장치에 입출력 작업을 부탁하면 작업을 끝낸 입출력 장치가 CPU에 완료 알림(인터럽트)을 보내는 것입니다. 알림 역할을 하는 것이죠.
처리 순서는 다음과 같습니다.
① 입출력 장치는 CPU에 인터럽트 요청 신호를 보낸다.
키보드 딸깍, 마우스 딸깍 모두 인터럽트 요청 신호를 CPU에 보내는 것입니다.
② CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
③ CPU는 인터럽트 요청 신호를 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부 확인한다.
인터럽트 플래그는 말 그대로 인터럽트를 받아들일지 말지 결정하는 플래그입니다. CPU의 상황에 따라 '가능', '불가능'으로 설정되어 있습니다. 하지만 모든 인터럽트를 인터럽트 플래그를 통해 막을 수는 없습니다. 우선순위에 따라 무시할 수 없는 인터럽트 요청이 있을 수 있다는 것이죠.
그렇지만 대부분 막을 수 있습니다. 정전, 하드웨어 고장 등이 막을 수 없는 인터럽트에 해당하죠.
④ 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
⑤ CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
인터럽트 서비스 루틴은 인터럽트를 처리하기 위한 프로그램입니다.
"마우스 딸깍 시에는 ~~~로 처리한다", "키보드 딸깍 시에는 ~~~로 처리한다" 등 어떤 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램입니다.
인터럽트를 처리하는 방법은 입출력장치마다 다르기 때문에 각기 다른 인터럽트 서비스 루틴을 가지고 있으며, 이들은 메모리에 저장되어 있습니다.
그렇다면 CPU는 각기 다른 인터럽트 서비스 루틴을 어떻게 구분할까요? 바로 인터럽트 벡터를 이용합니다.
인터럽트 벡터는 인터럽트 서비스 루틴의 시작 주소를 알 수 있기 때문에 CPU는 이를 통해 특정 인터럽트 서비스 루틴을 처음부터 실행할 수 있습니다.
그렇다면 인터럽트가 발생하기 전까지 레지스터에 저장된 값들은 어떻게 할까?
인터럽트 요청을 받기 전까지 CPU가 수행하고 있었던 일은 인터럽트 서비스 루틴 종료 후 마저 수행해야 합니다. 그러므로 이전에 프로그램 재개를 위한 모든 내용을 스택에 백업합니다.
⑥ 인터럽트 서비스 루틴 실행이 끝나면 백업해 둔 작업을 복구하여 실행을 재개한다.
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
RAID (0) | 2023.03.27 |
---|---|
입출력 장치 (0) | 2023.03.26 |
CPU - 구성 요소와 기능 (0) | 2023.03.18 |
명령어와 주소 지정 방식 (0) | 2023.03.13 |
컴퓨터의 기본 구조 (0) | 2023.03.13 |