[Crash Course: Computer Science] #7 중앙 처리 장치(CPU)

이민선(Jasmine)·2022년 12월 11일
0
post-thumbnail

우리는 지금까지 ALU와 메모리에 대해 살펴봤다.

레지스터란? 하나의 값을 저장하는 데 사용하는 작은 일렬로 된 메모리 뭉치
RAM이란? 서로 다른 주소에 수많은 수들을 저장할 수 있는 메모리 저장소

이것들을 하나로 모은다면?
컴퓨터의 심장인 CPU(Central Processing Unit)!!!!

CPU의 역할은 프로그램(Microsoft Office, Safari 등등)을 실행하는 것이다.
이러한 프로그램들은 instruction(명령어)의 연속으로 구성되어 있다.
더하기 빼기 같은 수학 명령어라면 CPU는 ALU에 수학 연산을 하도록 설정할 것이다.
메모리 관련 명령어라면, CPU는 메모리, read, write 동작으로 메모리와 얘기할 것이다.

RAM에 16개의 저장 공간이 있고, 각 저장 공간에는 8비트를 저장할 수 있다고 가정해보자.
그리고 프로세서는 A,B,C,D 4개의 8bit 메모리 register를 가지고 있다.

데이터는 메모리에 이진수 형태로 저장이 된다.
프로그램도 역시 메모리에 저장이 된다.

CPU가 지원하는 각 명령어(instruction)에 ID를 부여해보자.

LOAD,LOAD,ADD,STORE 4개의 instruction으로 구성되어 있다.
첫 4비트는 "operation code(또는 짧게 opcode)"를 나타낸다.
뒤의 4비트는 연산에 사용될 Data가 어디에서 오는가(레지스터 또는 메모리 주소)를 나타낸다.
instruction address 레지스터는 현재 instruction의 메모리 주소를 저장하며, 우리가 프로그램의 어디에 있는지 추적하는 레지스터이다.
instruction 레지스터는 현재 수행되는 명령어를 저장한다.

처음 컴퓨터가 부팅되면 모든 레지스터는 0에서 시작된다.
어떤 간단한 컴퓨터 프로그램이 RAM에 저장되어 있다고 하자.

<CPU 동작>
(1) 인출 단계(fetch phase)

instruction을 가져오는 단계이다.
RAM 모듈에 instruction address 레지스터를 연결하고, 레지스터의 초기값이 0이기 때문에 RAM은 0번지에 저장되어 있는 값을 보내준다. 예제에서는 0010 1110 이라는 값을 보내주는 것.
이 값이 instruction 레지스터에 복사된다. fetch 완료!

(2) 해독 단계(decode phase)

instruction 하나를 메모리로부터 fetch했으니 이제 instruction이 무엇인지를 알아보자.
예제에서 opcode는 0010이다.
이 opcode는 RAM에 저장된 값을 Register A로 옮겨오는 "LOAD A" instruction이다.
RAM의 주소는 instruction의 뒤의 4비트로, 예제에서는 1110(십진수로 14)이다.

(3) 실행 단계(execute phase)

RAM의 read enable을 켠다.
해독 단계에서 알아낸 주소 14를 전송하고, RAM의 주소 14에서 0000 0011(십진수 3)을 가져온다.
LOAD A instruction이기 때문에 이 값은 오직 Register A에 저장되어야 한다.
RAM의 data를 4개 레지스터에 전부 연결했더라도, write enable은 Register A의 것만 활성화된다.

이로써 RAM의 주소 14번지의 값(0000 0011(십진수3))이 성공적으로 Register A로 load 되었다 !! 축하축하 빰빰빰!!
하나의 instruction이 완성되었으므로, 연결선을 전부다 끄고 메모리에서 다음 instruction의 fetch 단계로 넘어갈 수 있도록 준비한다.
어떻게 준비하냐고? 초기값이 0으로 설정되어 있었던 instruction address 레지스터를 1 증가시키고(incremental increase) execute phase를 종료한다.


control unit은 오케스트라 지휘자처럼 CPU의 다른 모든 파트를 지휘한다.

인출/해독/실행의 전체 사이클이 한번 끝났으니, 이제 LOAD B 명령 수행을 위해 한 사이클 더 돈다.

(1) 인출 단계(fetch phase)
instruction address register는 0에서 incremental하게 증가된 1을 가지고 있고, RAM은 주소1번지에 저장된 숫자를 instruction register에 보낸다. 예제에서는 0001 1111.

(2) 해독 단계(decode phase)
0001은 LOAD B instruction이고, 이것은 RAM에서 값을 Register B로 이동시키는 것이다.
이번에는 메모리 위치가 1111(십진수로 15번지)

(3) 실행 단계(execute phase)
Control unit은 RAM의 15번지를 read할 수 있도록 설정하고, Register B는 데이터를 받을 준비를 한다. 15번지에 있는 숫자 0001 1110(십진수 14) 저장 성공!

LOAD A에서와 마찬가지로, 마지막으로 instruction address register를 1 증가시키고 또 하나의 사이클 완료!

그런데 그 다음 사이클은 조금 다르다.

(1) 인출 단계(fetch phase)
예제에서 주소2번지에 있는 1000 0100이라는 숫자를 instruction register로 전달.
opcode 1000은 ADD instruction이다.
더하라!!

이 instruction은 4bit RAM 주소 대신에 2bit 짜리 2개 셋트를 사용한다.
2bit는 4개의 값을 표현할 수 있으니, 4개의 레지스터 중 하나를 선택할 수 있다.

0100에서
첫번째 세트는 01이고 두번째 레지스터인 Register B를 나타낸다.
두번째 세트는 00이고 첫번째 레지스터인 Register A를 나타낸다.

따라서 1000 01 00은 Register B의 값을 Register A의 값과 더하라는 뜻이다!
이러한 연산을 수행하기 위해 5강에서 배운 ALU를 합쳐야 한다.


지휘자인 Control unit은 올바른 레지스터를 선택해서 입력해주고, 올바른 연산이 수행되도록 ALU를 설정해야 한다.

이 ADD instruction을 위해서 Control unit은 Register B와 Register A를 활성화하여 저장된 값을 enable하고 저장된 값을 ALU의 입력으로 각각 보낸다.
또한 ADD opcode(1000)을 전달해서 ADD 연산이 수행되도록 해야 한다.

이 경우에 입력은 3(Register B에 저장되었던 값)과 14(Register A에 저장되었던 값)이므로 합은 17이고, 이진수로 0001 0001이다.

이러한 연산 결과가 Register A에 저장되기 전에 내부 레지스터에 임시로 저장하고, ALU를 끈 다음, Register A에 저장한다.

이러한 cycle이 끝나면 이제 또 instruction address 레지스터를 1 증가시킨다.

새로운 사이클 시작!

(1) 인출 단계(fetch phase)
예제에서 주소3번지에 있는 0100 1101이라는 숫자를 instruction register로 전달.(fetch)
0100은 STORE A instruction이다.
1101은 십진수로 13이므로 여기로 연산 결과를 옮겨 저장하라는 것이다!

RAM모듈에 address를 전달하고, read enable 대신 write enable을 할 차례이다.
Register A에 있는 값을 읽기 위해서는 read enable한다.
데이터선에 Register A에 저장된 값이 통과하게 된다.


clock은 정확하고 규칙적으로 전기 신호를 발생시킨다.
이 신호는 Control Unit이 CPU 내부 동작을 완벽하게 발 맞춰 진행시킬 수 있게 해준다.

CPU가 fetch-decode-execute 사이클의 각 단계를 수행하는 속도를 Clock speed라고 한다.
주파수 단위인 헤르츠(Hz)로 표시함.
1헤르츠는 1초에 1 사이클이라는 의미이다.

<최초의 단일칩 CPU>
1971년에 출시된 Intel 4004라는 4 bit CPU이다.
이 CPU의 마이크로아키텍쳐는 우리의 예제와 비슷하다.
최초의 프로세서임에도 불구하고 740kHz로 작동했다고 한다.
k가 붙는다...1초에 무려 74만 사이클 수행ㅋㅋㅋㅋ

요즘은 더 빠르다.
1메가헤르츠(1MHz)는 1초에 백만 사이클이고
컴퓨터나 스마트폰은 몇 기가헤르츠(GHz)로 작동한다. 매 1초마다 수십억개의 CPU사이클이 작동하는 것이다.

computer overclocking : clock 속도를 올려 CPU의 속도를 올리는 것.
칩 제조사는 약간의 overclocking이 가능하도록 CPU를 설계한다.
하지만 너무 많이 하면 CPU가 과열될수도 있으니 주의!

underlocking : 때때로 프로세서가 최고 속도로 작동할 필요가 없을 때가 있는데, 사용자가 자리를 떠났거나, 별다른 프로그램을 실행하지 않는 경우 등등이다. CPU 속도를 느리게 해서 전력 소비를 줄일 수 있다. 배터리로 동작하는 노트북이나 스마트폰에서는 아주 중요한 일이다.

이러한 이유로 요즘 프로세서들은 많이들 clock speed를 높이거나 낮출 수 있는데, 이를 dynamic frequenct scaling이라고 한다.

RAM은 CPU 바깥에 별도 부품으로 위치한다.

두 부품은 서로 address, data, enable선들을 통해 통신한다.

다음 시간에는 몇 가지 instruction을 추가해서 CPU를 강화해보자.

profile
기록에 진심인 개발자 🌿

0개의 댓글