명령어 사이클
CPU가 명령어를 처리하는 정형화된 흐름을 명령어 사이클이라고 합니다.
CPU는 명령어를 실행하기 위해 명령어를 메모리에서 가져와야 합니다. 이 단계를 인출 사이클이라 합니다.
명령어를 인출하고나면 명령어를 실행해야합니다. 이것이 실행 사이클입니다. 실행 사이클에서 제어장치가
명령어 레지스터에 담긴 데이터 값을 해석하고 제어신호를 발생시키게 됩니다.
프로그램을 이루는 모든 명령어는 일반적으로 인출과 실행사이클을 위 그림과 같이 반복하며 실행됩니다.
하지만 모든 사이클이 다음과 같이 이루어지는것은 아닙니다. 추가적인 메모리 접근이 더 필요한 경우가 있기 때문입니다.
이떄 필요한 작업들을 간접 사이클이라고 부릅니다.
그렇다면 인출, 실행, 간접 사이클이 명령어 사이클의 끝일까요? 이 밖에도 고려해야 될 부분이 하나 있습니다
그게 바로 인터럽트입니다.
인터럽트
Interrupt는 영단어로 방해하다, 중단시키다를 뜻합니다.
CPU는 수행중인 작업이 방해를 받아 잠시 중단될 수 있습니다. 이때 CPU 작업을 방해하는 신호를 인터럽트라고 합니다.
인터럽트의 종류는 동기 인터럽트와 비동기 인터럽트로 나뉩니다.
1. 동기 인터럽트
CPU에 의해 발생하는 인터럽트를 뜻합니다. CPU가 명령을 수행하다가 예상치 못한 상황에 마주쳤을 때
동기 인터럽트가 일어납니다. 동기 인터럽트는 예외라고 부르기도 합니다.
2. 비동기 인터럽트
일반적으로 인터럽트는 비동기 인터럽트를 의미합니다. 비동기 인터럽트는 입출력 장치에 의해 발생합니다.
프린트 작업을 예로 들어 봅시다.
입출력 장치의 속도는 CPU보다 느립니다. 비동기 인터럽트를 사용하지 않는다면, CPU는 주기적으로 프린트 작업이
끝났는지 여부를 확인해야 합니다. 이렇게 되면 CPU는 프린트 작업을 하느라 다른 효율적인 일들을 하지 못하게 됩니다.
이 때 비동기 인터럽트를 사용하게 된다면, 프린트 작업 완료 여부를 기다릴 필요가 없어집니다. CPU가 입출력 장치에
입출력 작업을 부탁하면, 입출력 장치가 작업을 끝낸 후 CPU에 작업 완료 알림을 보내기 때문입니다.
이 때 보내는 작업 완료 알림을 (비동기) 인터럽트로 이해하시면 됩니다.
그렇다면 인터럽트의 처리 순서는 어떻게 될까요? 순서는 다음과 같습니다.
< 인터럽트 처리 순서 >
1. 입출력 장치는 CPU에 인터럽트 요청 신호를 보냅니다.
2. CPU는 실행 사이클이 끝난 후 명령어를 인출 하기전 항상 인터럽트 여부를 확인합니다.
3. 인터럽트 요청을 확인하면, 인터럽트 플래그를 통해 현재 인터럽트를 받아들 수 있는지 여부를 확인합니다.
4. 인터럽트를 받아들일 수 있다면, CPU는 지금까지 작업을 백업합니다.
5. CPU는 인터럽트 백터를 통해 인터럽트 서비스 루틴을 실행합니다.
6. 인터럽트 서비스 루틴 실행이 끝나면 4번에 백업해 놓았던 작업을 복구하여 실행을 재개합니다.
여기서 조금 어려운 용어가 인터럽트 서비스 루틴과 인터럽트 백터일 것입니다.
CPU가 인터럽트 요청을 받아들이기로 하면 CPU는 인터럽트 서비스 루틴이라는 프로그램을 실행합니다.
이를 인터럽트 핸들러 라고도 부르기도 합니다. 인터럽트 서비스 루틴은 말 그대로 인터럽트 요청을 보냈을 때
입출력 장치별로 어떻게 행동해야 되는지에 대한 정보로 이루어진 프로그램이라 보시면 됩니다.
그렇다면 인터럽트 백터는 무엇일까요?
인터럽트 서비스 루틴은 각각의 입출력 장치마다 존재합니다. 즉 다양한 인터럽트 서비스 루틴이 있다는 말이죠.
이것을 구분하기 위해 인터럽트 백터를 사용합니다.
다시 말해 인터럽트 백터는 인터럽트 서비스 루틴을 식별하기 위한 정보입니다.
인터럽트 백터는 해당 인터럽트 서비스 루틴이 어느 지점에서 시작하는지를 알려줍니다.
인터럽트 서비스 루틴도 여느 프로그램과 마찬가지로 명령어와 데이터로 이루어져있습니다.
따라서 프로그램 카운터를 비롯한 레지스터를 사용하며 실행되게 됩니다.
인터럽트가 발생하기전에 정상적인 흐름으로 실행되던 프로그램에 있는 프로그램 카운터의 값은
인터럽트가 발생하고 나면 어떻게 될까요? 만약 이를 백업하지 않고 인터럽트 실행을 위한 프로그램 카운터로
덮어버린다면, 입출력 작업이 완료된 후 기존에 실행했던 프로그램을 다시 실행하지 못하게 되는 문제가 발생합니다.
이를 방지하기 위해서 인터럽트 요청을 받으면 그전까지 수행하고 있던 내역들은 메모리의 스택영역에 백업해둡니다.
그리고 인터럽트 처리가 끝나면 다시 스택에서 요소들을 받아와 실행하게 됩니다.
전체적인 CPU의 명령어 사이클은 지금까지 살펴본 인터럽트르 포함하여 밑의 그림과 같이 동작합니다.
이상으로 명령어 사이클과 인터럽트의 개념에 대해 살펴보았습니다.
부족하거나 잘못된 부분이 있으면 댓글로 알려주시면 감사하겠습니다!
긴글 읽어주셔서 감사합니다!!
참고 도서
<혼자 공부하는 컴퓨터구조 + 운영체제 / 강민철 지음 / 한빛미디어 출판사>
'CS > 컴퓨터구조' 카테고리의 다른 글
RAID란? (0) | 2023.04.26 |
---|---|
플래시 메모리란? (0) | 2023.04.19 |
보조기억장치(하드디스크) 에 대하여 (0) | 2023.04.12 |
캐시 메모리 (0) | 2023.03.03 |
CPU 구성 요소에 대하여 (0) | 2023.02.15 |