[6] 명령어 사이클과 인터럽트

hyunsooo·2023년 3월 30일
0

이번 포스트에서 알아볼 개념은 명령어 사이클과 인터럽트입니다. 자세한 설명을 하기 전 간단한 개념을 알아보겠습니다.

지난 포스트들에서 CPU는 메모리에 저장된 프로그램의 명령어나 데이터를 읽거나 쓰며 실행된다고 배웠습니다.
이러한 실행은 일정한 주기가 존재하는데요. 이 정해진 주기(흐름)을 명령어 사이클이라고 합니다. 또한 이런 주기를 끊어내는 신호를 인터럽트라고 합니다.

명령어 사이클

메모리에 저장된 프로그램을 실행할 경우, 일반적으로 메모리에서 CPU로 명령어나 데이터를 가져오는 인출 사이클과 가지고 온 정보들을 실행하는 실행 사이클로 나눌 수 있습니다. 하지만 지난 주소지정방식에 대해서 알아볼 때, 간접주소 지정 방식같은 경우 인출한 명령어들을 바로 실행할 수 없고 몇차례 메모리 접근이 더 필요할 수 있습니다. 이런 경우를 해결하기 위해 간접 사이클이 작동하여 메모리 접근을 할 수 있도록 합니다.

인터럽트

인터럽트는 왜 필요할까요? 예를들어 CPU가 실행하고 있는 프로그램보다 더 중요한 작업이 있다면 현재 실행되는 프로그램을 멈추고 실행해야 합니다. 이런 경우를 위해 인터럽트는 꼭 필요하다고 할 수 있습니다.

인터럽트는 아래와 같이 나눌 수 있습니다.

  • 인터럽트

    • 동기(예외) 인터럽트 : 예외적인(예기치 못한) 상황이 발생할때, 잠깐 멈추고 발생한 상황부터 처리(디버깅 등)

    • 비동기(하드웨어) 인터럽트 : 주로 입출력장치로 인해 발생. 문제라기 보다는 알림과 같은 역할

      • 막을 수 있는 인터럽트(maskable)

      • 막을 수 없는 인터럽트(non maskable) : 인터럽트 플래그로 막을 수 없는 경우(정전, 하드웨어 고장 등)

동기 인터럽트는 실행 중인 명령어로 인해 발생하는 경우를 의미하고 보통 예외라고 합니다. 비동기 인터럽트는 하드웨어 장치에 의해서 생성되는 인터럽트로 보통 인터럽트라고 말합니다. 저희는 하드웨어 인터럽트에 대해서 자세히 알아보겠습니다.

하드웨어 인터럽트는 CPU가 입출력 작업 도중에도 효율적으로 명령어를 처리 하기 위해 필요하게 됩니다. 만약 인터럽트가 존재하지 않는다면 CPU는 일정 주기별로 입출력 작업이 끝났는지 확인을 해야되는 상황에 놓일 수 있습니다. 이를 방지하기 위해 입출력 장치로부터 온 하드웨어 인터럽트로 부터 알림을 받아 처리할 수 있습니다.

인터럽트 처리 순서

아래의 인터럽트 처리 순서는 대부분의 인터럽트 처리와 유사합니다.

  1. 입출력 장치는 CPU에 인터럽트 요청 신호(현재 인터럽트 처리를 할 수 있는지)를 보낸다.

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

  3. CPU는 인터럽트 요청 신호를 확인하고 인터럽트 플래그(플래그 레지스터 안)를 통해 현재 인터럽트를 받아들일 수 있는지 확인한다.

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

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

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

인터럽트 서비스 루틴은 인터럽트가 발생했을때 인터럽트를 위한 프로그램입니다. 입출력장치는 키보드, 마우스, 프린트 등 다양한 장치에서 인터럽트가 발생할 수 있으며 각각의 장치별로 다른 인터럽트 서비스 루틴을 가집니다. 서비스 루틴은 결국 프로그램이기 때문에 메모리의 한 영역에 저장되게 되는데 장치별로 다른 루틴을 실행해야 하기 때문에 고유한 시작 주소를 가지게 되고 이런 정보를 가지고 있는게 인터럽트 벡터를 의미합니다. 결국 CPU가 인터럽트를 처리한다는 것은 "인터럽트 서비스 루틴을 실행(인터럽트 벡터에 의해 시작 주소를 알 수 있음)하고, 본래 수행하던 작업으로 다시 되돌아온다"는 것을 의미하게 됩니다.

CPU의 레지스터들에는 실행중인 프로그램의 정보들이 저장되어 있습니다. 이 정보들을 백업을 하고 인터럽트 서비스 루틴을 실행시켜야 하는데 백업을 하기 위해 메모리의 스택영역에 저장하게 됩니다.
실행한 인터럽트가 끝나게 되면 스택영역의 내용을 복구하여 프로그램 실행을 재개할 수 있게 됩니다.


인터럽트까지 추가된 실행사이클은 위의 이미지와 같습니다. 실행 사이클이 끝나고 인터럽트 여부를 확인했는데 인터럽트가 존재한다면 인터럽트 사이클이 실행되게 되는 구조입니다.

profile
지식 공유

0개의 댓글