The journey to becoming a developer

My future is created by what I do today, not tomorrow.

Computer Science/Crash Course

The Central Processing Unit (CPU): Crash Course Computer Science #7

Millie 2021. 10. 8. 06:35

Processor에 대해서 설명해 주는 영상이다. 그런데 이 영상이 에피소드 중에서 가장 복잡할 수도 있다고 처음부터 경고하고 있다. 만약 이걸 이해한다면 golden 이라고 캐리안 쌤이 말한다.

어려울 것을 각오하고 봤는데 정말 말처럼 복잡하고 한 번 들어서는 이해가 안 가는 내용이다. 

CPU라는 말은 참 많이 들어봤어도 어떤 식으로 일처리를 하는지는 처음 배웠다. 제대로 이해하려면 여러 번 봐야할 것이다.


✔ Last Episode - ALU, Registers, RAM

  • ALU : Takes in binary numbers and performs calculations 

Two types of computer memory 

  • Registers : small linear chunks of memory, useful for storing a single value
  • RAM : a larger bank of numbers that can store a lot of numbers located at different addresses

 

❔ Today's Episode

Now it's time to put that all together and build the heart of computer!

This is called the Central Processing Unit (CPU).

 

 

A CPU's job is to execute programs

Programs are made up of a series of individual operations called instructions, because they instruct the computer what to do. 

  • 예를 들어 덧셈, 뺄셈같은 수학적 명령(mathematical instruction)이라면, CPU는 ALU에게 수학적 연산을 하라고 설정함 
  • 메모리 명령이라면, CPU는 메모리에게 값을 읽거나 쓰라고 명령함 

 

CPU의 동작 원리와 과정

CPU에는 부품이 정말 많아서, 하나씩 배치한 다음 그것을 구축하는 식으로 배워볼 것이다. 

wire 하나하나를 보기보다는 우선 기능적인 블록(functional block)에 초점을 맞춘다.

두 개의 부품을 하나의 선으로 연결하게 되면, 이것이 바로 추상화의 단계를 한 단계 높이는 것이다. 

 

Micro-archictecture

This high level view is called the micro-architecture.

 

우선 메모리가 필요하니까, 지난 에피소드에서 만들었던 RAM module을 가져온다. 

  • 심플함을 유지하기 위해 메모리에는 16개의 memory loaction이 있고, 각각에는 8bit를 저장할 수 있다고 가정하자. 
  • 또한 프로세서에는 A, B, C, D라는 이름을 붙인 4개의 8bit memory register를 주자. 이것은 일시적으로 값을 저장하고 조작하는 데 쓰인다. 

 

Instruction Table

우리의 CPU가 지원하는 각 명령어에 ID를 할당해 볼 수 있다.

  • 처음 4비트는 'operation code(op-code)'를 저장한다. 
  • 마지막 4비트는 연산에 사용될 data가 어디에서 오는지를 나타낸다.
    • 이것은 메모리 주소일 수도, 레지스터일 수도 있다. 

 

We also need two more registers to complete our CPU.

(1) a register to keep track of where we are in a program

For this, we use an instruction address register, which as the name suggests, stores the memory address of the current instruction.

우리가 프로그램의 어디에 있는지 추척할 수 있는 레지스터 - 현재 instruction의 주소를 저장한다.

 

(2) the other register to store the current instruction, which we’ll call the instruction register.

현재 수행되는 명령어가 저장되는 레지스터 

처음에 컴퓨터를 부팅하면, 모든 레지스터는 0부터 시작된다. 레지스터들은 8bit으로 가정했기 때문에 0이 8개 저장되어 있음.

CPU 동작 단계 

1. Fetch phase

CPU 동작의 가장 첫 단계는 instruction을 가져오는 것이다. (retreive instruction)

  1. Instruction Address Register를 RAM module(표 형식으로 되어 있는 것)에 연결한다.
  2. 현재 Instruction Address Register의 값은 0이다. 따라서 RAM은 0번지에 저장되어 있는 값을 리턴한다. 이 경우엔 0010 1110을 리턴할 것이다. 
  3. 이 값은 instruction register에 복사된다. 
  4. 이렇게 하면 instruction 하나를 메모리로부터 fetch한 것이다. 
  5. 이제는 이 instruction이 무엇인지를 알아내야 한다. 그래야 이 instruction을 실행할 수 있다. 

 

2. Decode phase

instruction을 해독하는 단계

예시에서, instruction register의 op-code는 0010 1110이다.

  • 여기서 첫 4비트는 0010이다. instruction table을 보면 0010은 RAM에 저장된 값을 Register A로 옮겨 오는 LOAD A라는 instruction을 나타낸다.
  • 마지막 4비트는 1110인데, 이것은 십진수로 14이다. 

Control Unit

Control unit은 instruction을 번역(decode)하고 해석한다.

다른 것과 마찬가지로, 이것 역시 논리 게이트로 구성된다.

예를 들어, LOAD A instruction을 해독하기 위해서는 opcode가 0010인지 확인하는 회로가 필요하다. 이것은 논리 게이트 몇 개를 사용해서 만들어 낼 수 있다.

 

이제 무슨 instruction을 처리해야 하는지를 해독해서 알아냈다.

그 다음은? 바로 이렇게 알아낸 instruction을 실행하는 단계이다. 

 

3. Execute phase

LoAD_A checking circuit을 이용해서 RAM의 read enable을 켤 수 있다. 그리고 주소 14를 전송한다.

그러면 RAM에서 00000011 (십진수로 3)을 가져온다.

LOAD_A instruction이기 때문에 이 값은 오직 Register A에 저장되어야 한다.

RAM의 data를 4개의 레지스터에 전부 연결했더라도, LOAD_A 검사 회로는 Register A의 write enable만 활성화된다. 그래서 RAM의 주소 14번지의 값이 성공적으로 Register A로 load될 수가 있는 것이다.

하나의 instruction이 완성되었으므로 모든 연결선을 끄고, 메모리에서 다음 instruction을 fetch할 수 있도록 준비한다. 그렇게 하기 위해 instruntion address register를 1 증가시키고 execute phase를 종료한다. 

 

지금까지 예로 들은 LOAD_A는 CPU가 수행할 수 있는 여러 instruction 중에 하나일 뿐이다. 

다른 instruction은 또 다른 논리 회로를 통해 decode되고, 해당하는 동작을 수행할 수 있도록 CPU의 구성 요소를 설정한다.

 

A new Level of Abstraction!

그런데 각각의 decode circuit들을 보는 것은 너무 디테일하다. 위에서 이미 하나의 예제를 봤기 때문에, 다른 것들은 Control Unit으로 묶어서 단순화한다.