컴퓨터구조

CPU 동작원리

sjong 2023. 5. 17. 02:18

CPU

CPU는 트랜지스터라고 하는 반도체로 이루어져 있는데 트랜지스터가 어떻게 이루어져 있는지 알아보자.

 

반도체는 주로 실리콘으로 이루어져 있다.

실리콘의 최외각 전자는 4개로 8개가 될 때 가장 안정된 구조를 이루는데 다른 실리콘과 결합 시 8개가 된다. 

이렇게 된다면 전류는 흐르지 않게 되는데 다시 전류를 흐르는 방법으론 전자를 빼거나 추가하는 방법이 있다.

전자를 하나 잃은 반도체를 P(Positive)[양성]형 반도체, 하나 얻은 반도체를 N(Negative)[음성]형 반도체라고 한다.


 

CPU 동작원리

CPU에 대한 간단 설명이 끝났으니 동작원리를 알아보자.

일단 동작원리 설명을 위해 코드 하나를 예시로 들겠다.

#include <stdio.h>

int add() {
  int a = 1, b = 2;		// a에 1, b에 2를 저장 후
  int c = a + b;		// c에 a와 b를 더한 값을 저장하라

  return c;		// c값을 반환해라
}

 

이 코드를 CPU로 처리하는 방식을 구현해보기 전에 CPU의 내부 구조를 알아야 한다.

이 사진을 보면 CPU 내부의 대략적인 구조를 알 수 있다.

 

  • 연산장치 : 입력된 데이터를 활용하여 산술 연산과 논리연산을 하는 장치
  • 제어장치 : 프로그램에서 명령을 받아 각 장치를 동작하도록 제어하는 장치
  • 레지스터 : 프로그램 실행에 필요한 기본적인 명령어, 데이터를 기억하는 장치

대략적인 구조를 봤으니 좀 더 세세하게 알아보도록 해보자.

External Memory

그냥 메모리라고 보면 된다.

0x1000, 0x1002, 0x1004...와 같이 주소값들이 있고 그 안에를 보면 LOAD, ADD, STORE이 있는 걸 볼 수 있다. 그리고 각각 가리키는 주소값이 있는데 그 주소값을 보면 1과 2가 있다. 바로 이것들은 c = a + b를 어셈블리로 표현한 것이다.

 

이걸 해석해 보면 0x2000에 저장된 값, 1을 불러와서(LOAD) 0x2002에 저장된 값 2를 더한(ADD) 다음, 그 값을 0x2004에 저장(STORE)해라. 라고 해석할 수 있다.

 

이때 주소값들이 1씩 증가하는 게 아니라 2씩 증가하는데 그 이유는 비트값의 차이에 있다.

LOAD 0x2000 자체가 16비트인데 메모리는 8비트이므로 이것을 쪼개어 저장하기 때문이다. 


Processor

Program Counter[명령어 계수기] : PC라고도 불리며(pc방 할 때 그 pc 아님) 명령어의 실행 순서를 지정하기 위해 다음에 실행할 명령어가 기억되어 있는 주기억장치의 주소를 보관한다.

 

IR(Instruction Register)[명령어 레지스터] : 현재 수행 중인 명령 코드를 보관하는 레지스터로 연산 코드와 주소 필드로 구성된다.

 

Address Reigster[주소 레지스터] : 메모리 주소 레지스터(MAR)라고도 불리며 주기억장치에 명령이나 데이터가 기억되어 있는 주소를 보관한다.

 

Data Register[데이터 레지스터] : 주기억장치에서 가져온 데이터나 연산을 처리한 결과를 일시적으로 기억하는 장치이다.

 

Decoder[복호기] : 부호화했거나 형식을 바꾼 전기 신호를 원상태로 회복시키는 장치이다.

 

CU(Control Unit)[제어장치] : 명령 제어장치, 입력된 명령어를 해독하여 cpu내부의 움직임을 총괄하고 각과정을 통제한다. 

 

ALU(Arithmetic Logic Unit)[산술 논리 장치] :  덧셈, 뺄셈 같은 두 숫자의 산술연산과 배타적 논리합, 논리곱, 논리합 같은 논리연산을 계산하는 디지털회로이다.

 

ACC(Accumulator)[누산기] : 연산 장치를 구성하는 중심이 되는 레지스터로, 주기억장치에서 연산할 데이터를 받아 저장하거나 가산기로부터 연산 결과를 받아 저장한다.


세부적으로 알아봤으니 다음으론 실행 순서를 보도록 하자.

 

LOAD 과정

.

1. 현재 CPU가 실행하려는 주소는 PC에 들어 있는 0x10002. Address Register에 0x1000을 넣고서,
2. Address Register에 0x1000이 들어가는 순간 자동으로 Memory의 0x1000을 Access하여
3. 그 곳에 있는 Instruction이 Memory로부터 읽어 짐. (LOAD 0x2000)
4. Memory로 부터 읽혀진 Instruction은
5. IR에 저장됨
6. Decoder로 흘러 들어가 무슨 내용인지 해석 되는 동시에 PC는 다음을 실행하기 위하여 증가됨.
7. 0x2000번지의 값을 가져오라는 내용임을 파악하여,
8. Memory로 부터 0x2000의 값을 읽어 오라고 CU가 제어 신호를 발생 시킴, (ACC에게는 임시 저장토록 제어 신호발생).
9. CU가 발생시킨 제어 신호에 의하여 1이라는 값이 Data Register에 들어가고,

10. ALU에 보냄

11. 이 값은 ALU를 통하여 연산을 할지도 모르니까 ACC에 임시 저장됨.

 


ADD 과정

 

1. LOAD와 마찬가지로, 현재 CPU가 실행할 주소는 앞에서 이미 증가한 0x1002이므로

2. 이 값을 Address Register에 넣음.

3. 자동으로 0x1002에 위치하고 있는 ADD 0x2002가 Load 되며,

4. 이 값은 IR에 전달됨

5. 전달된 값은 IR에 저장되며,

6. IR의 값이 Decoder에 전달되는 동안 PC도 자동으로 다음 instruction을 가리킬 수 있도록 증가하며,

7. Decoder는 0x2002 번지의 값을 더하라는 해석을 완료하여 CU에 전달함.

8. CU는 Decoder의 해석에 의거하여 0x2002에 있는 값을 읽어 오도록 제어 신호를 발생시키며,

    ALU에게는 더하라는 제어 신호도 발생시킴.

9. 0x2002에 있는 Data 2를 Load 해서 Data Register에 저장함.

10. CU가 발생시킨 제어 신호에 의하여, ALU는 Data Register에서 읽어온 data 2를 이미 있던 ACC의 값과

     더하여,

11. ACC에 결과 값을 저장함.


STORE 과정

 

1. 현재 실행해야 할 Instruction은 PC의 값인 0x1004이며,

2. 이 값은 Address Register로 전달됨.

3. 결국 instruction을 load 하기 위하여 0x1004를 access 하여,

4. 0x1004에 값은 CPU로 loading 됨

5. Loading 된 값은 IR에 저장되며 이 값은 Decoder로 전달되는 동시에 PC는 또 한 번 증가함.

6. Decoder는 해석하여 ,

7. CU로 그 내용을 전달하여

8. CU는 ALU에게 ACC에 있는 값을 0x2004에 저장할 수 있도록 제어 신호를 발생시켜

9. ACC에 있는 값은 CU가 발생시킨 제어 신호에 의하여 0x2004 번지에 결과 값 3을 저장함.

10. 0x2004에 3이 저장됨.


이처럼 각 장치마다 역할이 있고 그 역할에 따라 순서도가 정해진다.

LOAD, ADD, STORE를 거쳐 최종적으로 3을 반환한다.

 

CPU는 인출 - 해석 - 실행 - 저장을 거치고 이 단계들을 각각 세분화하여 사용한다.

이렇게 분리된 프로세스를 스레드라고 한다.