명령어 사이클과 인터럽트

최건우·2023년 4월 15일
0

1. 명령어 사이클(Instruction cycle)

CPU가 하나의 명령어를 처리하는 정형화된 흐름을 의미한다.
CPU는 명령어 사이클을 반복하며 명령어들을 처리해 나간다.

1-1. 인출 사이클(fetch cycle)

명령어를 메모리에서 CPU로 가져오는 단계.

1-2. 실행 사이클(execution cycle)

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

1-3. 간접 사이클(Indirect cycle)

  • 프로그램을 이루는 수많은 명령어는 인출실행 사이클을 반복하며 실행한다. 하지만, 모든 명령어가 이렇게 간단한 흐름으로 실행되지는 않는다. 명령어를 인출하여 CPU로 가져왔더라도, 곧바로 실행할 수 없는 경우가 있다.
    • (ex) 간접 주소 지정 방식: 오퍼랜드 필드에 유효 주소의 주소를 명시하기 때문에, 명령어를 실행하기 위해 메모리 접근을 한 번 더 해야 실행 사이클에 들어갈 수 있음.
  • 간접사이클: 인출한 명령어를 실행하기 위해, 실행 단계 이전에 다시 한 번 메모리에 접근하는 단계

2. 인터럽트(Interrupt)

CPU가 명령어 사이클을 따라 명령어들을 처리해나가는 도중에 흐름이 끊어지는 경우가 있다.
즉, CPU의 작업을 방해하는 신호인터럽트이다.

2-1. 동기 인터럽트(synchronous interrupts)

  • CPU에 의해 발생하는 인터럽트로서, 명령어들을 수행하는 도중 프로그래밍 오류와 같은 예상치 못한 상황에 마주쳤을 때.
  • 예외(Exception)라고도 부름.

2-2. 비동기 인터럽트(asynchronous interrupts)

  • 입출력장치에 의해 발생하는 인터럽트로서, 입출력장치가 CPU에 보내는 알림을 의미한다.
    • (ex 1) CPU가 프린터에 할당한 입출력 작업이 끝나면, 프린터는 CPU에 완료 알림을 보낸다.
    • (ex 2) 키보드, 마우스 등의 입출력장치는 외부로부터 받아들인 입력을 처리하기 위해 CPU에 입력 알림을 보낸다.
  • 하드웨어 인터럽트(Hardware interrupt)라고도 부름.
    • CPU는 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트를 사용한다.
      • 만약 입출력 장치가 하드웨어 인터럽트를 먼저 보내주지 않는다면, CPU는 주기적으로 작업 완료 여부를 확인해야 하므로 CPU 사이클이 낭비된다.
    • 막을 수 있는 인터럽트(maskable interrupt)
    • 막을 수 없는 인터럽트(non maskable interrupt)

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

하드웨어 인터럽트는 아래와 같은 순서로 처리된다.

  1. 입출력장치가 CPU에 인터럽트 요청 신호를 보낸다.
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
  3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
  5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
  6. 인터럽트 서비스 루틴 실행이 끝나면, 4에서 백업해 둔 작업을 복구하여 실행을 재개한다.

이 중 밑줄 친 네 가지의 개념을 조금 더 알아보도록 하자.

인터럽트 요청 신호

인터럽트를 보내도 되는지 CPU에 확인하는 신호. 즉, 지금 CPU의 정상적인 실행 흐름을 끊어도 되는 상황인지 확인하는 신호.

인터럽트 플래그(Interrupt flag)

플래그 레지스터에 위치한 플래그로서, 하드웨어 인터럽트 요청을 수용할지 무시할지를 결정하는 플래그.

  • 막을 수 있는 인터럽트
    • CPU가 중요한 작업을 처리해야 하거나 방해를 받지 않아야 할 때: 플래그를 '불가능'으로 설정하고, CPU는 모든 요청을 무시한다.
    • CPU가 인터럽트 요청 신호를 받아들일 때: 플래그를 '가능'으로 설정하고, CPU는 요청 신호를 받아들이고 인터럽터를 처리한다.
  • 막을 수 없는 인터럽트
    • 플래그가 불가능이더라도 무시할 수 없는, 가장 먼저 처리해야 하는 최우선순위의 인터럽트
      • ex. 정전, 하드웨어 고장 등으로 인한 인터럽트

인터럽트 서비스 루틴(Interrupt Service Routine)

  • 인터럽트를 처리하기 위한 프로그램. 인터럽트 핸들러(interrupt handler)라고도 부른다.
  • '어떤 인터럽트가 발생했을 때 어떻게 처리하고 작동해야 할지'에 대한 정보로 이루어진 프로그램이다.
  • 인터럽트 서비스 루틴의 작동
    • (1) CPU가 작업을 정상적으로 실행되던 중 인터럽트가 발생하면,
    • (2) 인터럽트 서비스 루틴을 실행하여 인터럽트를 해결한다.
    • (3) 이후 다시 기존 작업으로 되돌아와서 작업 수행을 재개한다.
  • 다양한 인터럽트 서비스 루틴
    • 입출력장치마다 인터럽트 처리 방법이 다르다.
    • 그래서 메모리에는 여러 개의 다른 인터럽트 서비스 루틴이 저장되어 있다.
    • CPU는 이 루틴들의 구분을 위해 인터럽트 벡터를 이용한다.

인터럽트 벡터(Interrupt Vector)

  • 인터럽트 서비스 루틴을 구분하기 위한 정보.
  • 인터럽트 벡터에는 인터럽트 서비스 루틴의 주소(인터럽트 서비스 루틴은 메모리에 올라 있으므로)를 갖고 있어, CPU는 필요에 맞는 특정 인터럽트 서비스 루틴을 찾아가 실행할 수 있다.
요약하자면, CPU가 인터럽트를 처리한다는 말은, 아래와 같은 과정을 거치는 것이다.
(1) 인터럽트 서비스 루틴을 실행하고
(2) 본래 수행하던 작업으로 다시 되돌아온다

그리고 CPU는 인터럽트 서비스 루틴을 실행하기 위해 인터럽트 벡터를 이용해 인터럽트 서비스 루틴의 시작 주소를 확인한다.

인터럽트의 발생, 처리, 이전 작업 재개 과정

작업을 수행하던 도중 인터럽트 요청이 발생하면, CPU는 다음 과정을 따라 기존의 작업과 인터럽트를 처리한다.

  1. 현재 수행중인 프로그램을 재개하기 위한 모든 내용(프로그램 카운터 값 등)을 메모리스택 영역에 백업
  2. 인터럽트 서비스 루틴의 시작 주소가 위치한 곳으로 프로그램 카운터 값을 갱신
  3. 인터럽트 처리(=인터럽트 서비스 루틴 실행)
  4. 스택에 저장해 둔 값을 다시 불러온 후 이전까지 수행하던 작업을 재개

CPU는 메모리에 저장된 명령어를 항상 순차적으로만 인출하고 실행하는 것은 아니다. 필요에 따라 가져온 명령어 실행을 위해 다시 한 번 간접 사이클을 통해 메모리를 접근해야 할 수도 있으며, 도중에 인터럽트가 발생하면 인터럽트를 처리한 후 다시 작업을 재개한다. 정리하자면, CPU는 다음과 같은 과정을 반복하며 프로그램을 실행한다.





* 이 글은 '혼자 공부하는 컴퓨터 구조+운영체제(한빛미디어, 2022)'를 개인적인 학습을 목적으로 요약한 게시글입니다. 문제가 있는 경우, 지적해 주시면 감사하겠습니다.

profile
부족한 경험을 채우기 위한 나만의 기록 공간

0개의 댓글