<본 카테고리는 "혼자 공부하는 컴퓨터구조 + 운영체제" 책과 강의를 기반으로 작성하였습니다>
명령어 사이클과 인터럽트
명령어 사이클
명령어 사이클(Instruction cycle)은 기본적으로 CPU가 프로그램을 실행하는 기본 단위다. 각 사이클은 명령어를 가져오거나, 해독하거나, 실행, 그리고 메모리에 결과를 저장하는 과정을 포함하고 있다. 다음 과정은 CPU의 기본 작업 흐름을 설명하는 것으로, 각 CPU와 명령어 집합마다 다소 차이가 있을 수 있지만, 큰 뼈대는 같다고 봐도 무방하다.
- 인출 사이클(Fetch cycle): CPU가 프로그램 카운터가 가리키는 메모리 주소에서 명령어를 가져온다. 프로그램 카운터는 그다음에 실행될 명령어의 메모리 주소를 저장한다.
- 디코딩 사이클(Decoding cycle): 인출된 명령어를 이해하고 실행할 수 있도록 해독한다.이 단계에서 CPU는 명령어가 무엇인지 파악하고, 필요한 연산자를 준비한다.
- 실행 사이클(Execute cycle): 해독된 명령어가 실제로 실행된다.
- 저장 사이클(Store cycle): 실행 결과가 필요에 따라 메모리에 저장된다.
일부 명령어는 간접 사이클을 포함할 수 있다. 간접 사이클(Indirect cycle)은 주소를 포함하는 명령어가 메모리에서 해당 주소를 찾아 그 값을 다시 참조해야 하는 상황이다. 예를 들어, 어떤 명령어가 메모리 주소 A에 저장된 값을 읽어야 하는데, 메모리 주소 B에 저장된 값이 실제로 우리가 필요로 하는 데이터가 저장된 메모리 주소 A를 가리킨다면, 먼저 주소 B를 참조하여 실제 값이 저장된 주소 A를 얻어와야 한다. 이러한 추가적인 메모리 접근 단계가 간접 사이클이다.
인터럽트
인터럽트(Interrupt)는 CPU의 작업을 일시 중단시키는 신호로, 주로 예외 상황이 발생했을 때 혹은 특정 작업을 처리하려 할 때 사용된다. 즉, 인터럽트는 CPU에게 우선적으로 처리해야 할 작업을 알리는 메커니즘이며, 이를 통해 CPU는 중요한 작업을 먼저 처리하거나 예외적인 상황에 대응할 수 있다. 이러한 인터럽트는 크게 두 가지로 분류할 수 있다.
- 이 책의 저자는 인터럽트의 종류를 구분하는 기준을 인텔의 공식 문서를 참조하였다고 한다.
먼저 동기 인터럽트(Synchronous interrupts)는 CPU가 실행 중인 명령어와 관련된 문제로 인해 발생하는 인터럽트를 의미한다. 이러한 인터럽트는 일반적으로 예외적인 상황에서 발생하는데, 이는 예상치 못한 문제를 CPU가 만났을 때를 가리킨다. 예를 들어, 연산 중에 오버플로우가 발생하거나, CPU가 정의하지 않은 명령어를 인식할 때와 같은 경우에 발생한다. 이런 유형의 인터럽트를 흔히 소프트웨어 인터럽트라고도 부른다.
비동기 인터럽트(Asynchronous interrupts)는 현재 CPU가 실행 중인 명령어와는 독립적으로 발생하는 인터럽트를 지칭한다. 이는 주로 외부 하드웨어 장치들의 이벤트나 타이머 만료 등에 의해 발생한다. 이러한 인터럽트들은 일반적으로 하드웨어 인터럽트라고 불리며, 입출력 작업의 효율성을 높이는데 중요한 역할을 한다.
예를 들어, CPU가 프린터로 출력 명령을 전달했다고 가정해보자. CPU의 처리 속도에 비해 입출력 장치인 프린터의 속도는 상대적으로 느리기 때문에, CPU는 입출력 작업의 결과를 즉시 받아볼 수 없다. 하드웨어 인터럽트가 없다면, CPU는 주기적으로 프린터의 작업 완료 상태를 확인해야 하고, 이는 CPU의 처리 사이클의 낭비를 야기한다. 그러나 비동기 인터럽트를 사용함으로써 프린터 작업이 완료되면 CPU에 알림을 보내고, CPU는 그 사이에 다른 작업을 계속 처리할 수 있어 CPU의 효율성을 크게 향상할 수 있다.
하드웨어 인터럽트 처리 순서
이번엔 하드웨어 인터럽트의 처리 순서에 대해 알아보자. CPU가 인터럽트를 처리하는 방식은 종류를 막론하고 대동소이하다.
처음에 하드웨어 장치는 CPU에 인터럽트 요청을 보내 작업을 중단하고 인터럽트 처리를 진행하도록 인터럽트 요청 신호를 보낸다. 이는 CPU의 정상적인 작업 흐름을 일시적으로 중단시키는 요청이므로, CPU는 플래그 레지서트의 인터럽트 플래그를 검사하여 현재 인터럽트를 수용 가능한 상태인지 확인한다. 인터럽트 플래그가 비활성화 상태라면, CPU는 인터럽트 요청이 오더라도 이를 무시한다.
- 다만 모든 하드웨어 인터럽트를 인터럽트 플래그로 막을 수 있는 것은 아니다. 인터럽트 플래그가 불가능으로 설정되어 있더라도, 하드웨어 고장이나 정전과 같은 인터럽트는 반드시 실행된다.
CPU가 인터럽트 요청을 받아들이기로 결정했다면 CPU는 현재 프로그램을 재개하기 위해 필요한 모든 내용을 스택에 백업한다. 그리고 인터럽트 서비스 루틴이라는 프로그램을 실행한다. 여기서 인터럽트 서비스 루틴(Interrupt service routine, ISR)은 인터럽트를 처리하기 위한 메모리에 있는 프로그램이다. 인터럽트 서비스 루틴을 식별하기 위한 고유한 시작 주소인 인터럽트 벡터(Interrupt vector)를 참조한다. 이렇게 서비스 루틴이 끝나면 스택에 저장해둔 값을 다시 불러온 뒤 이전까지 수행하던 작업을 재개한다.
요약
명령어 사이클
1. 정의: 프로그램 속 각각의 명령어들을 처리하는 일정한 주기
2. 단계
- 인출 <-> 실행 + 간접/인터럽트
인터럽트
1. 정의: CPU의 작업을 방해하는 신호
2. 종류
a. 동기 인터럽트: 소프트웨어 인터럽트로서, CPU에 의해 발생되는 인터럽트
b. 비동기 인터럽트: 하드웨어 인터럽트로서, 주로 입출력장치에 의헤 발생하는 인터럽트
- 요청 신호 → 플래그 확인 → 백업 → 벡터 참조 → 서비스 루틴 → 재개
'CS > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] CPU 설계 기법 (2) (0) | 2023.06.13 |
---|---|
[컴퓨터구조] CPU 설계 기법 (1) (0) | 2023.06.12 |
[컴퓨터구조] CPU의 작동 원리 (1) (0) | 2023.06.09 |
[컴퓨터구조] 명령어의 이해 (0) | 2023.06.03 |
[컴퓨터구조] 데이터의 이해 (2) (0) | 2023.06.02 |