본문 바로가기

CS/컴퓨터 구조

[컴퓨터 구조] 명령어 사이클과 인터럽트

728x90

명령어 사이클과 인터럽트

CPU가 하나의 명령어를 처리하는 과정은 일정한 흐름을 가지고 있으며, 이를 반복하여 명령어를 처리합니다. 이 정형화된 흐름을 명령어 사이클이라고 합니다.

명령어 사이클

CPU는 명령어들을 하나씩 실행합니다. 이때 프로그램 속 각각의 명령어들은 일정한 주기로 반복되며 실행되는데, 이 주기를 명령어 사이클이라고 합니다.

명령어 사이클 과정

  1. 인출 사이클 (Fetch Cycle)
    • CPU가 메모리에 신호를 보내고 메모리에서 값을 가져오는 과정입니다.
  2. 실행 사이클 (Execution Cycle)
    • CPU가 인출한 명령어를 실행합니다. 제어장치가 명령어를 해석하고, ALU(산술 논리 장치)로 연산을 수행하며, 제어 신호를 발생시키는 과정입니다.

프로그램 속 명령어들은 일반적으로 인출과 실행 사이클을 반복하여 실행됩니다. 그러나 모든 경우가 이 두 개의 사이클로만 이루어지지는 않습니다.

 

 3. 간접 사이클 (Indirect Cycle)

  • 인출 사이클 과정에서 가져온 값이 유효 주소가 아닐 경우, 메모리에 직접 값을 저장하는 대신 주소를 저장하는 경우가 있습니다. 이를 간접 주소 지정 방식이라고 하며, 이 경우 메모리에 한 번 더 접근하는 사이클이 필요합니다. 이 사이클을 간접 사이클이라고 합니다.

명령어 사이클은 인출 사이클과 실행 사이클, 간접 사이클로 구성되며, 인터럽트는 이 사이클의 흐름을 중단시킬 수 있습니다.

 

 

인터럽트

인터럽트 (Interrupt)는 "방해하다" 또는 "중단시키다"를 의미합니다. 컴퓨터를 사용할 때 많은 인터럽트가 발생하며, 컴퓨터는 이를 빠르게 처리하여 사용자는 거의 느끼지 못합니다. 대표적인 예로는 마우스 클릭, 키보드 입력, 프린터 작업 등이 있습니다. 컴퓨터는 현재 진행 중인 작업을 일시 중단하고 인터럽트를 처리한 후, 다시 중단되었던 작업을 이어갑니다. 인터럽트는 CPU가 즉시 처리해야 할 작업이 발생했을 때 발생합니다.

인터럽트 종류

인터럽트는 크게 두 가지로 나눌 수 있습니다:

  1. 동기 인터럽트 (Synchronous Interrupt)
  2. 비동기 인터럽트 (Asynchronous Interrupt)

동기 인터럽트

  • 동기 인터럽트는 CPU 내부에서 발생하는 인터럽트입니다. CPU가 명령어를 수행하는 도중 예상치 못한 상황에 직면했을 때 발생하며, 이는 보통 프로그램상의 오류나 예외 상황입니다. 예를 들어, 프로그램에서 예외(예: ZeroDivisionError)가 발생할 때 동기 인터럽트가 발생합니다.

비동기 인터럽트

  • 비동기 인터럽트는 CPU가 아닌 입출력 장치에 의해 발생합니다. 이들은 하드웨어 인터럽트라고도 불리며, 예외 상황보다는 시스템 상태를 알리는 역할을 합니다. 입출력 장치의 속도가 CPU보다 느리기 때문에, CPU는 장치가 작업을 완료할 때까지 대기해야 합니다. 이를 해결하기 위해 비동기 인터럽트를 사용하여 CPU가 다른 작업을 처리하는 동안 입출력 장치가 완료되면 인터럽트를 발생시켜 CPU에 작업 완료를 알립니다.

예를 들어, CPU가 프린터에 출력 명령을 내리고 다른 작업을 처리하는 동안, 프린터가 출력을 완료하면 프린터가 CPU에 인터럽트를 보내어 "출력을 완료했다"는 신호를 전달합니다. 이후 CPU는 중단되었던 작업을 재개합니다.

  • 인터럽트는 현재 작업을 중단하고 다른 작업을 처리하게 만드는 신호입니다.
  • 동기 인터럽트는 CPU 내부에서 발생하며, 오류나 예외 상황에 대응합니다.
  • 비동기 인터럽트는 입출력 장치에서 발생하며, 시스템 상태를 알리거나 CPU와 입출력 장치 간의 속도 차이를 극복하기 위해 사용됩니다.

 

비동기 인터럽트 처리 순서

비동기 인터럽트의 처리 과정을 살펴보겠습니다:

  1. 입출력 장치가 CPU에 인터럽트 요청 신호를 보냅니다.
  2. CPU는 실행 사이클이 끝나고 인출 사이클이 시작하기 전에 항상 인터럽트 여부를 확인합니다.
  3. CPU는 인터럽트 요청이 있는지 확인한 후, 인터럽트 플래그를 통해 현재 인터럽트를 처리할 수 있는지 여부를 결정합니다.
  4. 인터럽트를 처리할 수 있다면, CPU는 현재 작업 상태를 스택(Stack)에 저장합니다.
  5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴(Interrupt Service Routine, ISR)을 실행합니다.
  6. 인터럽트 서비스 루틴이 끝나면, CPU는 스택에 저장된 작업 상태를 복원하여 작업을 재개합니다.

주요 용어

  • 인터럽트 요청 신호 (Interrupt Request Signal): 입출력 장치가 CPU에 보낸 신호로, 인터럽트를 요청하는 것입니다. 장치가 작업을 중단하고 CPU의 작업에 영향을 주려는 신호입니다.
  • 인터럽트 플래그 (Interrupt Flag): 플래그 레지스터에서 관리하는 비트로, 현재 작업이 인터럽트에 대응할 수 있는지 여부를 결정합니다. 이 비트가 인터럽트를 허용하지 않도록 설정된 경우, 현재 작업이 완료될 때까지 인터럽트는 무시됩니다.
  • 인터럽트 벡터 (Interrupt Vector): 인터럽트 서비스 루틴의 시작 주소를 포함하는 정보입니다. 인터럽트가 발생하면, CPU는 인터럽트 벡터를 참조하여 해당 서비스 루틴의 주소를 찾고 실행합니다.
  • 인터럽트 서비스 루틴 (Interrupt Service Routine, ISR): 인터럽트 요청을 처리하기 위한 프로그램입니다. 특정 입출력 장치나 오류 상태를 처리하기 위해 작성된 코드로, 인터럽트가 발생했을 때 실행됩니다. 인터럽트 핸들러라고도 불립니다.

메모리 저장

  • 스택(Stack): CPU가 현재 작업 상태를 저장하는 메모리 영역입니다. 인터럽트 발생 시, CPU는 레지스터에 있는 작업 상태를 스택에 저장하고, 인터럽트 서비스 루틴이 끝난 후 스택에 저장된 작업 상태를 복원하여 작업을 재개합니다.

정리

  • 인터럽트 요청 신호는 CPU의 작업을 방해하고, 인터럽트 플래그는 이 요청을 수용할 수 있는지 결정합니다.
  • 인터럽트 벡터는 인터럽트 서비스 루틴의 시작 주소를 알려주며, 인터럽트 서비스 루틴은 실제 인터럽트를 처리하는 프로그램입니다.
  • CPU는 스택을 사용하여 현재 작업 상태를 저장하고 복원하며, 명령어 사이클은 인출 사이클, 실행 사이클, 간접 사이클, 인터럽트 사이클로 구성됩니다.
728x90