[Computer Architecture] 명령어 사이클

NtoZ·2023년 10월 11일
0

Study

목록 보기
8/9

🚩 명령어 사이클

개관


프로그램은 많은 양의 명령어로 이루어져 있습니다.

그리고 CPU는 이 컴퓨터 프로그램의 명령을 실행하며, 다른 하드웨어와의 데이터 흐름을 제어합니다.
컴퓨터의 '뇌'를 담당하는 CPU에게는 하나의 명령어를 처리하는 정형화된 흐름이 존재하는데, 이것이 명령어 사이클입니다.

오늘은 CPU의 명령어 사이클에 대해 포스팅 해보겠습니다.

🏁 명령어 사이클

명령어 사이클에 대해 이해하기 위해서는 CPU의 기본 구성 중 레지스터에 대해 알아야 합니다.

CPU에서 기본이 되는 구성은 산술 및 논리 연산을 수행하는 ALU(Arithmetic Logic Unit), CPU 내의 다른 유닛에게 명령 및 제어 신호를 전달하는 CU(Control Unit), 마지막으로 작은 단위의 데이터(명령어와 주소 등)를 저장하고 접근할 수 있도록 해주는 레지스터(Register) 볼 수 있습니다.

레지스터

레지스터의 종류

  • 프로그램 카운터(Program Counter, PC):

    다음에 실행할 명령어의 메모리 주소를 저장

  • 주소 레지스터(Address Registers):

    메모리 주소를 저장.
    예) 메모리 주소 레지스터(MAR)ㅡ는 데이터에 접근할 메모리의 주소를 저장하고, 메모리 버퍼 레지스터(MBR)는 읽기 또는 쓰기를 위해 메모리로부터 가져온 데이터 값을 저장

  • 데이터 레지스터(Data Registers):

    산술 및 논리 연산에 사용되는 입력값이나 결과값을 임시로 저장 (= 메모리 버퍼 레지스터, Memory Buffer Registers)

  • 명령 레지스터(Instruction Register, IR):

    현재 실행되고 있는 명령어를 저장

  • 상태 레지스터(Status Registers):

    CPU의 현재 상태를 나타내는 플래그나 상태 비트를 저장

  • 스택 포인터(Stack Pointer):

    현재 스택의 최상위 주소를 추적. 스택은 함수 호출, 로컬 변수 저장 등에 사용


CPU의 명령어 사이클은 다음과 같이 도식화 할 수 있습니다.


1. 인출 사이클(Fetch Cycle)

인출 사이클메모리에 있는 명령어를 CPU로 가져오는 단계입니다.
프로그램을 실행하기 위해서 주 기억장치에 적재된 프로그램 명령어들을 CPU로 가져오는 절차가 필요합니다.

이 절차에서 위에서 본 다양한 레지스터들이 활용됩니다.

  1. 프로그램 카운터(PC)에 명령어 주소 저장
  2. 메모리 주소 레지스터(MAR)에 명령어 주소 저장
  3. '메모리 읽기' 제어 신호 + 메모리 주소 레지스터 값메모리로 전달
  4. '값' 데이터 레지스터로 전달, 프로그램 카운터 증가하여 다음 명령어 읽을 준비
  5. 메모리 버퍼 레지스터에 저장된 값은 명령어 레지스터(IR)로 이동

2. 실행 사이클(Execution Cycle)

실행 사이클CPU로 가져온 명령어를 실행하는 단계입니다.
제어 장치(CU)가 명령어 레지스터(IR)에 담긴 값을 해석(Decode)하고, 제어 신호를 발생시킵니다.

OpCode(명령 코드)와 Operand(피연산자)를 해독하여 실행하고 제어 신호를 발생시킵니다.

인출 사이클과 실행 사이클을 도식화하면 다음과 같습니다.


3. 간접 사이클(Indirect Cycle)

간접 주소 지정을 처리할 때 발생합니다. 간접 주소 지정 방식은 명령어가 데이터의 실제 주소를 직접 포함하는 것이 아니라, 실제 데이터 주소가 저장된 메모리 위치를 가리킬 때 사용되는 사이클입니다.



🏁 인터럽트

인터럽트는 CPU에게 현재 처리 중인 작업을 일시 중지하고, 더 우선순위가 높거나 긴급한 작업을 처리할 필요가 있다는 것을 알리는 신호 입니다.

인터럽트 시스템을 통해 CPU는 여러 가지 장치, 상황, 또는 실행 중인 프로그램으로부터 동시에 입력 받을 수 있으며, 이를 통해 멀티태스킹과 빠른 응답 시간, 그리고 복잡한 I/O 장치와의 효율적인 통신이 가능해집니다.

인터럽트에는 동기 인터럽트(Synchronous Interrupts)와 비동기 인터럽트(Asynchronous Interrupts)가 있습니다.


동기 인터럽트(Synchronous Interrupts , 소프트웨어 인터럽트)

동기 인터럽트는 실행 중인 프로그램 내부에서 발생하는 예외 상황(예: 0으로 나누기, 접근 불가능한 메모리 접근 등) 때문에 발생합니다. 소프트웨어 인터럽트는 특정한 시스템 호출을 통해 의도적으로 발생시킬 수도 있습니다.

폴트(fault), 트랩(trap), 중단(abort) 등의 예외로 인해 CPU의 현재 작업이 일시 중단되고 더 급한 신호가 처리됩니다.

폴트 : 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외
트랩 : 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개, 디버깅
중단 : CPU가 실행 중인 프로그램을 강제로 중단시킬 수 밖에 없는 심각한 오류를 발견했을 때 발생하는 예외


비동기 인터럽트(Asynchronous Interrupts , 하드웨어 인터럽트)

비동기 인터럽트는 CPU 외부의 하드웨어 장치에서 오는 신호로, 보통 I/O 장치나 타이머 같은 것들로부터 발생합니다. 외부의 프린터기의 작업 완료, 키보드의 입력 완료 등의 알림을 CPU가 받아 현재 실행 중인 작업을 중단하고 인터럽트 요청을 처리한 다음 이전 상태로 복원합니다.

이 작업은 비동기식으로 발생하기 때문에 외부 장치에서 반환되는 응답을 기다릴 필요 없이 CPU가 다른 작업을 처리할 수 있도록 도와줍니다.


인터럽트 처리 절차

인터럽트 처리 절차는 대략 다음과 같이 이루어집니다:

  1. 인터럽트 발생: CPU는 현재 작업을 중지합니다.
  2. 현재 상태 저장: CPU는 현재 작업의 상태를 저장합니다(일반적으로 스택에 저장).
  3. 인터럽트 서비스 루틴 호출: CPU는 미리 정의된 인터럽트 서비스 루틴(ISR, Interrupt Service Routine)을 호출합니다. 이 루틴은 해당 인터럽트를 처리하는 코드를 포함하고 있습니다.
  4. 인터럽트 처리: ISR은 인터럽트를 처리한 후, CPU에게 제어를 반환합니다.
  5. 이전 상태로 복원: CPU는 인터럽트가 발생하기 전 상태로 작업을 복원합니다.


레퍼런스

profile
9에서 0으로, 백엔드 개발블로그

0개의 댓글