본문 바로가기
Computer Architecture

CPU의 작동원리 - (1)

by seunghyeok lee 2023. 7. 30.
해당 포스팅은 2023년 8월부터 시작하는 cs 면접 스터디를 위해서 해당 이론을 공부하고 요약한 내용입니다.
매우 짧은 요약 글이므로 자세한 내용은 추후에 업로드하겠습니다.
해당 글은 계속 수정 될 수 있습니다.

CPU의 작동원리

CPU가 수행하는 세부적인 동작을 순서대로 나타낸다면 다음과 같습니다.

  1. 명령어 인출(Instruction fetch): memory에서 명령어를 읽습니다.
  2. 명령어 해독(Instruction decode): 수행해야 할 동작을 결정하기 위해 명령어를 해독합니다. 
  3. 데이터 인출(Data fetch): 명령어 실행을 위해 데이터가 필요한 경우에는 memory 혹은 I/O device로부터 데이터를 읽습니다.
  4. 데이터 처리(Data Process): 데이터에 대한 산술적 혹은 논리 연산을 수행합니다.
  5. 데이터 저장(Data store): 수행한 결과를 저장합니다.

위의 동작들 중에서 1번과 2번 동작은 모든 명령어들에 대해서 공통적으로 수행합니다. 그러나 나머지 세 동작들은 명령어에 따라 필요한 경우에만 수행합니다.


CPU의 기본 구조

CPU의 내부 구성은 다음과 같습니다.

  • 산술논리연산장치(Arithmetic and Logical Unit: ALU)
  • 레지스터 세트(register set)
  • 제어 유니트(control unit)

ALU는 각종 산술 연산들과 논리 연산들을 수행하는 회로들로 이루어진 하드웨어 모듈입니다.

이때 산술 연산은 덧셈, 뺄셈, 곱셈, 나눗셈을 말하며 논리 연산은 AND, OR, NOT 연산등이 있습니다.

 

레지스터는 cpu 내부에 위치한 memory이므로 액세스 속도가 컴퓨터의 memory 중 가장 빠릅니다.

그러나 레지스터는 내부의 회로가 매우 복잡하고 저장밀도가 매우 낮아 많은 수의 레지스터들을  cpu 내부에 포함하기 어렵습니다.

  • 특수 목적용 레지스터
  • 일반 목적용 레지스터

 

제어 유니트는 명령어를 해석하고, 실행하기 위해 control signal들을 순차적으로 발생하는 하드웨어 모듈입니다.

명령어 실행에 필요한 각종 정보들의 전송 통로와 방향 그리고 시스템 구성 요소의 동작시간을 조절합니다.

 

명령어마다 신호들의 종류와 발생시간이 다르기 때문에 명령어들의 수가 많아지면 control unit 내부 회로가 복잡해집니다.

 

마지막으로 cpu 내부 버스가 있습니다.

 

cpu 내부 버스는 ALU와 레지스터들간의 데이터 이동을 위한 데이터 선들과 control Unit에서 발생되는 control signal을 전송하는 선, 주소들의 선들로 구성되어 있습니다.

 

이 내부 버스 선들은 외부의 시스템 버스와는 직접 연결되지 않습니다. 버퍼 레지스터 혹은 인터페이스 회로를 통해서 시스템 버스와 접속됩니다


명령어 실행

 

명령어 실행의 과정을 살펴보면 CPU의 구조와 동작원리를 쉽게 이해할 수 있습니다.

 

명령어 사이클이란?

 

CPU가 한개의 명령어를 실행하는데 필요한 전체 과정입니다.

 

명령어 사이클은 크게 두 가지로 세분화됩니다.

 

명령어 인출(instruction fetch): cpu가 memory로부터 명령어를 읽어 오는 단계

명령어 실행(instruction execution): 인출된 명령어를 실행하는 단계

이러한 단계들을 각각 인출 사이클, 실행 사이클이라고 부릅니다.

cpu 내부에 기본적으로 필요한 레지스터는 다음과 같습니다.

 

  • 프로그램 카운터 (PC): 다음에 인출될 명령어의 주소를 가지고 있는 레지스터입니다. 각 명령어가 인출된 후에 자동적으로 명령어 길이에 해당하는 주소 단위 수만큼 증가합니다. 그러나 분기 명령어가 실행될 경우 그 목적지 주소로 갱신됩니다.
  • 누산기 (AC) : 데이터를 일시적으로 저장하는 레지스터입니다. 이 레지스터의 비트 수는 워드의 길이와 같습니다.
  • 명령어 레지스터(IR): 가장 최근에 인출된 명령어가 저장되어 있는 레지스터입니다.
  • 기억장치 주소 레지스터(MAR): PC에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터입니다. 이 레지스터의 출력 선들이 address bus 선들과 직접 접속됩니다.
  • 기억장치 버퍼 레지스터(MBR): 기억장치에 저장할 데이터 혹은 기억장치로부터 읽힌 데이터가 일시적으로 저장되는 버퍼 레지스터입니다. 이 레지스터 입출력 선들은 data bus 선들과 직접 접속됩니다.

인출 사이클

 

cpu는 각 명령어 사이클 시작 단계에서 PC가 가리키는 기억장치의 위치로부터 명령어를 인출해 온다. 그런 다음 CPU는 PC의 내용을 1씩 증가하여 명령어들을 기억장치에 저장되어 있는 순서대로 인출할 수 있게 준비합니다.

 

예를 들어 어떤 컴퓨터에서 현재 PC의 내용이 100이라고 가정합시다.

명령어 사이클이 시작되면 CPU는 기억장치의 100번지에 저장되어 있는 명령어를 인출하며 PC의 내용을 101로 증가시킵니다. 그러면 다음 명령어 사이클에서 101번지의 명령어가 인출됩니다.

이러한 반복으로 차례대로 명령어를 인출합니다. 이러한 과정을 인출 사이클이라고 표현합니다.

 

인출 사이클에서 각 단계별로 수행하는 동작을 마이크로 연산으로 표현하면 다음과 같습니다.

 

t0 : MAR <- PC

t1 : MBR <- M[MAR], PC <- PC + 1

t2 : IR <- MBR

 

t1 - t3 은 CPU 클록의 각 주기를 나타냅니다. 명령어 인출에서는 세 개의 CPU클록 주기만큼 시간이 걸립니다.

 

인출 사이클에서 가장 먼저 수행되는 동작은 현재 PC의 내용을 CPU 내부 버스를 통해 MAR로 보냅니다.

 

두 번째 주기에서는 그 주소가 지정하는 기억장치 위치로부터 읽힌 명령어가 데이터 버스를 통하여 MBR에 적재됩니다. 그와 동시에 PC의 내용을 1을 더하여 다음 명령어 주소를 가리킵니다.

 

만약 컴퓨터에서 각 기억장치 주소가 바이트 단위로 지정되고 명령어 길이가 2바이트라면 한 명령어는 두 개의 주소를 걸쳐 저장합니다. 따라서 이러한 경우에서는 한 명령어를 읽은 다음 PC의 내용에 2를 더해야 다음 명령어가 지정된 위치를 지정할 수 있습니다.

 

마지막 주기에서는 MBR에 저장된 명령어 코드가 IR에 이동됩니다. 

 

실행 사이클

 

실행 사이클에서 CPU가 인출된 명령어 코드를 해독하고 그 결과 필요한 연산을 수행한다. CPU가 수행하는 연산은 매우 다양하지만 기본적인 네 가지 연산으로 분류할 수 있습니다.

 

  • 데이터 이동: CPU와 기억장치 간 혹은 CPU와 I/O 장치 간에 데이터를 이동합니다.
  • 데이터 처리: 데이터에 대하여 산술 혹은 논리 연산을 수행합니다.
  • 데이터 저장: 연산 결과 데이터 혹은 입력장치로부터 읽어 들인 데이터를 기억장치에 저장합니다.
  • 프로그램 제어: 프로그램의 실행 순서를 결정합니다.

실행 사이클에서 수행되는 마이크로-연산들은 명령어의 종류에 따라 서로 달라집니다. 

 

가상적인 cpu의 명령어 형식을 다음과 같이 정의합시다.

 

명령어는 아래 그림과 같이 cpu가 수행할 연산을 지정해 주는 연산 코드와 그 연산의 수행에 필요한 오퍼랜드로 구성되며 오퍼랜드는 명령어가 사용할 데이터가 저장되어 있는 기억장치의 주소를 가리킨다고 가정합시다.

 

실행 사이클에서 첫 번째로 수행해야 할 연산은 IR에 저장된 명령어의 오퍼랜드, addr를 MAR을 통해 기억장치로 보내어 데이터를 인출해야 합니다.

 

네 가지 연산중에 첫 번째인 데이터 이동에 대해 알아봅시다.

 

데이터 이동을 위한 명령어는 다음과 같습니다. LOAD addr

 

이 명령어는 기억장치에 저장되어 있는 데이터를 CPU 내부 레지스터인 AC로 적재합니다. 이러한 동작을 수행하는 실행 사이클을 마이크로 연산은 다음과 같습니다.

 

t0 : MAR <- IR(addr)

t1 : MBR <- M[MAR]

t2 : AC <- MBR



첫 번째 주기에서 명령어 레지스터 IR에 적재된 명령어의 오퍼랜드인 주소를 MAR를 통하여 기억장치로 보냅니다.

두 번째 주기에서 그 주소가 지정하는 기억장소로 부터 데이터를 인출하여 MBR를 저장합니다.

세 번째 주기에서 데이터를 AC 레지스터에 적재함으로써 LOAD 명령어의 실행이 완료됩니다.

 

두 번째 분류인 데이터를 저장하기 위한 명령어 STA addr을 알아봅시다.

해당 명령어는 AC 레지스터의 내용을 기억장치에 저장하기 위한 연산입니다.

 

t0 : MAR <- IR(addr)

t1 : MBR <- AC

t2 : M[MAR] <- MBR

 

이전과 같이 첫 번째 주기에서는 데이터를 저장할 기억장소의 주소를 MAR로 보냅니다.

 

두 번째 주기에서는 저장할 데이터를 버퍼 레지스터 MAR로 이동시킵니다.

 

세 번째 주기에서는 그 주소가 지정하는 기억장소에 데이터가 저장됩니다.

 

세번째 분류인 데이터 처리를 위한 명령어 ADD addr에 대해 알아봅시다.

이 명령어는 기억 장치에 저장된 데이터를 AC 레지스터의 내용과 더하고 그 결과를 다시 AC 레지스터에 저장합니다.

 

t0 : MAR <- IR(addr)

t1 : MBR <- M[MAR]

t2 : AC <- AC + MBR

 

첫 번째 주기에서는 명령어 addr를 주소 버스를 통하여 기억장치로 보냅니다.

두 번째 주기에서는 해당 기억장소로 부터 데이터를 인출하여 MBR에 적재합니다.

세 번째 주기에서는 그 데이터와 AC 레지스터의 내용을 더하고 결괏값을 다시 AC 레지스터에 저장합니다.

 

 

마지막으로 네 번째 분류인 프로그램 제어를 위한 명령어 Jump addr을 알아봅시다.

 

일반적으로 명령어들은 기억장치에 저장되어 있는 순서대로 진행됩니다. 하지만 네번째 케이스에서는 명령어 실행순서를 조정해야 하기 때문에 PC의 내용을 다른 위치의 명령어로 실행순서를 바꿔줘야 합니다. 이러한 명령어들을 분기 명령어라고 부릅니다.

 

JUMP addr 명령어 마이크로 연산은 한 주기 만에 시작됩니다.

 

t0 : PC <- IR(addr)

 

즉 이 명령어 addr은 분기 목적지 주소를 가리키기 때문에 실행 사이클에서 그 주소를 PC에 적재하면 됩니다.

왜냐하면 다음 명령어 인출 사이클에서 그 주소가 가리키는 기억장치로부터 명령어를 인출하기 때문에 명령어 실행순서가 바뀐 겁니다.


지금까지 설명한 명령어 실행과정을 다음과 같은 어셈블리 프로그램을 이용하여 살펴봅시다.

주소 명령어 기계 코드
100 LOAD 320 1320
101 ADD 321 5321
102 STA 321 2321
103 JUMP 150 8150

 

위의 표를 보고 인출 사이클과 실행 사이클을 각 과정을 그림으로 분석해 보자.

 

지금까지 CPU의 구조와 명령어 인출 및 실행 사이클에 대해서 정리해봤습니다. 다음 포스팅에는 인터럽트 사이클과 간접사이클에 대해서 알아보는 시간을 가지겠습니다.

'Computer Architecture' 카테고리의 다른 글

컴퓨터 시스템 구성  (0) 2023.07.29
컴퓨터 구조 기초  (0) 2023.07.29

댓글