CPU의 작동 원리 - 명령어 사이클과 인터럽트

Computer Science/OS + CA · 2023. 4. 7. 14:34

CPU가 하나의 명령어를 처리하는 과정에서 어떤 정형화된 흐름이 존재하는데, 이를 명령어 사이클이라고 한다. 또한 이 흐름이 끊어지는 상황도 발생하는데 이를 인터럽트라고 한다.

명령어 사이클 (Instruction Cycle)  

인출 사이클(fetch cycle)
메모리에서 명령어를 CPU로 가져오는 단계

실행 사이클(execution cycle)

CPU로 가져온 명령어를 실행하는 단계

간접 사이클 (indirect cycle)

어떤 명령어는 인출과 실행 사이클 만으로도 가능하지만, 어떤 명령어를 실행하기 위해서는 메모리 접근이 필요하다. 이때, 메모리 접근하는 단계를 간접 사이클이다.

인터럽트

CPU가 어떤 일을 수행중 방해를 받아서 중단될 수 있는데, 이러한 신호를 인터럽트라고 한다. 인터럽트는 크게 동기 인터럽트와 비동기 인터럽트로 나뉜다.

동기 인터럽트 (synchronous interrupts)

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

 

비동기 인터럽트 (asynchronous interrupts)

입출력장치에 의해 발생하는 인터럽트로, 입출력장치가 작업 완료의 신호 혹은 어떤 입력이 들어왔을 때의 알림 역할을 한다.

  • 하드웨어 인터럽트
    • 하드웨어 인터럽트 사용 이유 
      CPU는 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트를 사용한다. 입출력장치는 CPU에 비해서 속도가 매우 느리기 때문에, 인터럽트가 없이는 주기적으로 입출력장치에 완료 여부를 확인해야 한다. 그리고 이는 CPU 사이클에 낭비가 발생한다.
    • 하드웨어 인터럽트 처리 순서
      • 입출력장치는 CPU에 인터럽트 요청 신호 보냄
      • CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부 확인
      • CPU는 인터럽트 요청 확인 후, 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는 지 여부 확인
      • 인터럽트를 받아들일 수 있다면, 지금까지의 작업을 백업
      • CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴 실행
      • 인터럽트 서비스 루틴 실행 끝나면, 백업해 둔 작업 복구하여 실행 재개
    • 인터럽트 요청 신호
      입출력 장치의 작업 끝 알람 및 입력이 들어왔을 때, CPU에 인터럽트가 가능한지 요청
    • 인터럽트 플래그
      하드웨어 인터럽트를 받아들일지, 무시할지 결정하는 플래그
      • 막을 수 있는 인터럽트 (maskable interrupt)
        인터럽트 플래그로 막을 수 있는 인터럽트
      • 막을 수 없는 인터럽트 (non maskable interrupt)
        정전 고장과 같이 반드시 가장 먼저 처리해야 하는 인터럽트
    • 인터럽트 서비스 루틴 (=인터럽트 핸들러)
      인터럽트를 처리하기 위한 프로그램으로, 어떤 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램
    • 인터럽트 벡터
      수많은 인터럽트 프로그램 중 특정 인터럽트의 서비스 루틴을 구분할 수 있는 정보로, 특정 인터럽트 서비스 루틴의 시작 주소를 담고 있다. 

최종적으로 CPU는 아래와 같은 과정을 반복하며 프로그램을 실행한다.