본문 바로가기
책/혼공 컴퓨터구조+운영체제

컴퓨터 구조 - 명렁어 사이클,인터럽트, 예외,하드웨어 인터럽트, 인터럽트 서비스 루틴

by 코딩하는 돼징 2023. 11. 22.
반응형

CPU가 하나의 명령어를 처리하는 과정에는 정해진 흐름이 있고 그 흐름을 반복하며 명령어들을 처리해 나간다. 하나의 명령어를 처리하는 정형화된 흐름을 명령어 사이클이라고 한다.

CPU는 정해진 흐름에 따라 명령어를 처리해 나가지만 간혹 이 흐름이 끊어지는 상황이 발생한다. 이를 인터럽트라고 한다.

 

명령어 사이클

프로그램은 수많은 명령어로 이루어져 있고 CPU는 이 명령어들을 하나씩 실행한다. 이때 프로그램 속 각각의 명령어들은 일정한 주기가 반복되며 실행되는데 이 주기를 명령어 사이클(instruction cycle)이라고 한다. 즉 프로그램 속 각각의 명령어들은 명령어 사이클이 반복되며 실행한다.


01 인출 사이클(fetch cycle)

메모리에 있는 명령어를 CPU로 가져오기


02 실행 사이클(execution cycle)

CPU로 가져온 명령어를 실행, 제어장치가 명령어 레지스터에 담긴 값을 해석하고 제어 신호를 발생시키는 단

 

이렇게 프로그램을 이루는 수 많은 명령어는 인출과 실행 사이클을 반복하면 실행된다.

 


03 간접 사이클(indirect cycle)

명령어를 인출하여 CPU로 가져왔다 하더라도 곧바로 실행할 수 없는 경우도 있다.

간접 주소 지정방식을 떠올려보자, 오퍼랜드 필드에 유효 주소의 주소를 명시한다고 했다. 이 경우 명령어를 인출하여 CPU로 가져왔다 하더라도 바로 실행 사이클에 돌입할 수 있다. 명령어를 실행하기 위해서는 메모리 접근을 한번 더 해야하기 때문이다.

 


인터럽트

CPU의 정상적인 작업을 방해하는 신호

 

01 동기 인터럽트(synchronous interrupts), 예외

CPU가 명령어들을 수행하다가 예상치 못한 상황에 마주쳤을 떄 예를 들어 프로그래밍상의 오류와 같은 예외 적인 상황이 마주쳤을 때 발생하는 인터럽트이다. 

 


02 비동기 인터럽트(asynchronous interrutps), 하드웨어 인터럽트

입출력 장치에 의한 비동기 인터럽트는 세탁기 완료 알림과 같은 알림 역할을 한다. 그렇게 된다면 입출력 작업동안 CPU는 다른일을 할 수 있다.

예를 들어 CPU가 프린터와 같은 입출력 장치에 입출력 작업을 부탁하면 작업을 끝낸 입출력 장치가 CPU에 완료 알림(인터럽트)를 보낸다.


하드웨어 인터럽트의 처리 순서

1) 입출력 장치는 CPU에 인터럽트 요청 신호를 보낸다.

2) CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.

3) CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.

4) 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.

5) CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.

6) 인터럽트 서비스 루틴 실행이 끝나면 4에서 백업해둔 작업을 복구하여 실행을 재개한다.


인터럽트 용어

01 인터럽트 요청 신호

CPU의 정상적인 실행 흐름을 끊는 것이기에 다른 누군가가 이너럽트하기 전에는 끼어들어도 되는지 CPU한테 물어봐야 한다.


02 인터럽트 플래그(interrupt flag)

하드웨어 인터럽트를 받아들이지 무시할지 결정하는 플래그이다. 방해를 받고 싶지 않다면 0(불가능)으로 설정되면서 인터럽트 요청을 무시한다.

하지만 모든 하드웨어 인터럽트를 인터럽트 플래그로 막을 수 있는 것은 아니다. 막을 수 있는 인터럽트(maskable Interrupt)와 막을 수 없는 인터럽트(non maskable Interrupt)가 있다. 가장 먼저 처리해야 하는 인터럽트를 말한다. 예를 들어 하드웨어 고장이나 정전이 있다.


 

03 인터럽트 서비스 루틴(ISR, Interrupt Service Routine), 인터럽트 핸들러(Interrupt Handler)

CPU가 인터럽트를 받아들이기로 했다면 CPU는 인터럽트 서비스 루틴이라는 프로그램을 실행한다. 이는 어떤 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램이다.

예를 들어) 마우스가 어떤 인터럽트 요청을 보냈을떄 어떻게 작동을 한다.


04 인터럽트 벡터

CPU는 수 많은 서비스 루틴을 구분하기 위해 벡터를 사용한다. 인터럽트 벡터를 알면 인터럽트 서비스 루틴의 시작 주소를 알 수 있기 때문에 CPU는 인터럽트 벡터를 통해 특정 인터럽트 서비스 루틴의 시작주소터 실행 할 수 있다.


인터럽트 서비스 루틴은 여느 프로그램과 마찬가지로 명령어와 데이터로 이루저여씨다. 프로그램 카운터를 비롯한 레지스터들을 사용하며 실행된다.

인터럽트가 발생하기 전까지 레지스터에 저장되어 있었던 값들은 어떻게 해야할까?

인터럽트 요청을 받기 전까지 CPU가 수행하고 있었던 일은 인터럽트 서비스 루틴이 끝나면 되돌아와서 마저 수행을 해야하기 때문에 지금까지의 작업 내역들은 어딘가에 백업을 해둬야 한다. 그렇기 때문에 CPU는 인터럽트 서비스 루틴을 실행하기 전에 프로그램 카운터 값 등 현재 프로그램을 재개하기 위해 필요한 모든 내용을 스택에 백업한다. 그리고 나서 인터럽트 서비스 루틴의 시작주소가 위치한 곳으로 프로그램 카운터 값을 갱신하고 인터럽트 서비스 루틴을 실행한다.


최종 명령어 사이클

 

 

 

 

참고 :  본 내용은개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제강의를 수강하여 작성하였습니다. https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

반응형

댓글