CPU
컴퓨터 사이언스 부트캠프 with 파이썬을 보고 정리한 내용입니다.
트랜지스터와 논리 게이트
전압, 전류, 저항
- 전압 강하: 높은 전압을 가지고 있다가 저항이라는 좁은 통로를 지나면서 전압이 낮아짐
- 5V는 높은 전압, 0V는 낮은 전압, 톱니 모양은 저항을 뜻함
- 저항을 지나면서 전압 강하가 일어남
- 전압이 컴퓨터가 0과 1을 인식하는 방법! 5V나 5V에 가까운 높은 전압은 1 또는 true로 인식하고, 0V 나 0V에 가까운 낮은 전압은 0 또는 false로 인식
- 그러면 0과 1을 어떻게 바꿀까?
- 트랜지스터가 스위치 역할을 해서 바꿈
- 베이스에 전압을 공급하면 콜렉터에서 이미터로(+에서 -로) 전류가 흐르고, 스위치가 켜짐
논리 게이트
- 논리게이트: 컴퓨터에 들어가는 수많은 디지털 회로를 구성하는 가장 기본적인 요소로, 불(bool) 함수를 구현하기 위한 회로
- AND, OR, XOR, NOT 등
- 예를 들어 AND 게이트는,
- 다음과 같이 입력 A와 B 모두가 전류가 흘러야만 출력 Y가 5V, 즉 참이 됨
- 그 외의 게이트들 = 조합 논리 회로(Combinational Logic Circuit) = 현재 입력에 의해서만 출력이 결정되는 논리 회로
조합 논리 회로와 가산기
CPU의 구성
- 4비트 CPU(Central Processing Unit; 중앙 처리 장치)의 구성
- CU(Control Unit; 제어 장치): 우리가 작성한 코드는 컴퓨터가 이해할 수 있는 언어인 기계어 (0 또는 1)로 번역되어 메모리에 저장되는데, 이후 CPU가 이를 한줄씩 읽어들여 실행함. 이때 해석과 실행에 있어 CPU의 각 파트에 지시를 내리는 역할
- ALU(Arithmetic Logic Unit; 산술 논리 연산 장치): 덧셈, 뺄셈 같은 산술 연산과 AND, OR 같은 논리 연산을 하는 곳
- AX, BX, IR, PC는 모두 레지스터 (CPU 안에 내장된 메모리)
- 가산기는 ALU 내부에 존재하고 레지스터 AX와 BX 값을 입력받음 (4비트 CPU이므로 AX와 BX 값도 4비트로 입력) → 연산 후 다시 AX로 출력됨
- AX에서 A는 Accumulator, 값을 축적해 나가는 레지스터
가산기
- 전가산기(Full-Adder)
- 반가산기(half-adder)는 단순히 비트 두개만 더함
- 캐리(carry)까지 연산에 포함하는 것을 전가산기라고 하며, 반가산기 2개와 OR 게이트 한개로 이루어져 있음
- AX와 BX에 2진수 1이 들어와 2진수 덧셈을 하려고 함 (결과물: 10)
- CI는 Carry In, CO는 Carry Out (Carry = 받아올림 수)
- 캐리를 왜 쓰냐? 출력 회로가 두개라면 1과 0을 출력하면 되지만 출력회로가 하나밖에 없음
- 그래서 출력 회로에서는 0을 출력하고, Carry Out 1을 통해 10 이라는 걸 표시함
- 이걸 4비트로 보면? Adder1에서 내보낸 CO가 Adder2에서 CI로 받는 걸 볼 수 있음
- 예시 0100(AX) + 0110(BX)
- Adder 3에서만 carry 발생
- 예시 0100(AX) + 0110(BX)
순차 논리 회로와 레지스터
- 순차 논리 회로(Sequential Logic Circuit)는 현재의 출력이 현재의 입력에만 영향 받는 게 아니라 현재의 입력과 과거의 출력에 따라 정해지는 논리 회로
- 가장 간단한 예시: \(\bar{SR}\) 플립플롭(Flip-flop)
- NAND는 AND의 반전임
- S가 0, R이 1일 때 Q가 1 / S가 1, R이 0일 때 Q가 0
- S와 R이 둘 다 1일 때는 2가지 경우가 있음
- 이전 Q값을 보관(유지)함
클록
- 진자가 주기 운동을 할 때 1초 동안 왕복한 횟수를 주파수라고 하고 이를 헤르츠(Hz)라고 부름
- 1초 동안 2번 왕복했다 = 2Hz = 1번 왕복하는 데 0.5초가 걸린다.
- 작업관리자에서 CPU를 누르면 속도가 GHz = 0.74 x 10^9 Hz라고 나옴
- 이를 클록 속도(clock rate)라고 하고, CPU 혹은 프로세서 속도의 지표로 1초에 클록이 몇 번 발생했는가를 의미함
- 컴퓨터 내부에 클록 발생기가 있어서 일정한 시간에 맞춰 펄스(신호)를 생성함
- 상승 에지(빨간 동그라미)에 맞춰 인스트럭션(=코드가 번역된 기계어 명령어)을 실행함
- 클록 주파수가 높을수록 1초당 상승 에지 수가 높아지고 그만큼 실행되는 인스트럭션 수도 늘어남 → 즉 CPU의 주파수가 높을수록 연산 속도가 빠른 성능 좋은 컴퓨터
- 성능 지표로 CPI(Clock cycles Per Instruction; 인스트럭션 당 클록 수)를 사용하기도 함
- 클록 동기화
- ALU의 가산기나 레지스터는 어떻게 클록에 동기화할까?
- D 플립플롭 (D: Data / Delay)
- 클록이 0이면 입력이 무엇이든 출력 Q는 변하지 않음
- 클록이 1일 때만 Q는 입력과 같은 값을 전달함
- D 플립플롭 (D: Data / Delay)
- 레지스터는 플립플롭의 묶음으로, 클록에 맞춰 결과값을 저장함으로써 결국 클록에 동기화된 것
- ALU의 가산기나 레지스터는 어떻게 클록에 동기화할까?
시스템 버스
각 레지스터의 의미
- IR (Instruction Register): 변환된 명령어는 프로그램 실행 시 메인 메모리에 올려지고 하나씩 실행되는데 이때 메모리에 있는 명령어를 CPU로 가져와 저장해두는 곳
- PC(Program Counter): 현재 실행 중인 명령어 다음에 실행될 명령어의 메모리 주소를 담고 있음
- AX, BX : 범용 레지스터로 메모리에서 읽어들인 데이터를 저장했다가 ALU가 연산할 때 피연산자로 전달하거나 연산 결과 값을 저장함
시스템 버스의 구성과 특징
- 시스템 버스는 CPU와 메모리에 국한된 이야기는 아니고 CPU, I/O, 주변 장치 모두 시스템 버스를 통해 데이터를 주고받음
- CPU와 메모리로 설명하면
- 데이터 버스: 제어 버스의 신호에 따라 데이터를 CPU에서 메모리로 전송하거나 반대로 메모리에서 CPU로 전송함, 그러므로 데이터 버스는 양방향이어야 함
- 제어 버스: 데이터를 레지스터로 읽어올지 아니면 메모리에 쓸지 CPU가 메모리에 전달함
- 주소 버스: 메모리에서 레지스터로 혹은 레지스터에서 메모리로 데이터를 전송할 때 필요한 메모리 주소를 전달함, CPU가 메모리에 알려 주는 형식이므로 단방향
인스트럭션 세트
- 인스트럭션 세트란 CPU가 인식하여 실행할 수 있는 기계어(바이너리 형태)
- 어셈블리어: 기계어를 사람이 읽을 수 있도록 일대일로 대응한 문자 형태의 명령어
- 인스트럭션 세트는 CPU마다 달라서 새로운 CPU를 도입했다면 그 CPU에 적합한 인스트럭션 세트로 다시 프로그래밍 해야 함
- 이러한 불편함을 없애고자 C 언어를 비롯한 하이레벨 언어가 탄생한 것
- 컴파일 언어는 작성한 코드는 그대로 두고 작동하는 컴퓨터에 따라 컴파일만 다시 하면 됨
- 8비트(1바이트) 명령어를 설계해보자.
- 앞에서 3비트는 명령어 종류를 의미함 → 3비트이므로 8개의 명령어를 표현할 수 있다.
- ADD, SUB, MUL, DIV, LOAD(직접/간접주소), STORE(직접/간접주소)
- 덧셈과 뺄셈 명령어
- 명령어 종류 뒤 2비트가 첫번째 레지스터, 다음 2비트가 2번째 레지스터를 가리킴
- 범용 레지스터가 AX, BX, CX, DX 4개로 2비트면 모두 표현 가능
ADD AX, CX
: AX와 CX를 더해 그 값을 AX에 저장하라.
- 명령어 종류 뒤 2비트가 첫번째 레지스터, 다음 2비트가 2번째 레지스터를 가리킴
- 곱셈과 나눗셈 명령어
- 피연산자가 하나임
MUL CX
: AX에 이미 저장된 값에 피연산자 CX 값을 곱한다음 AX에 저장하라.DIV BX
: AX 값을 BX로 나눈다음 몫을 AX에 저장하고 나머지를 DX에 저장하라.
- 메모리 접근 명령어
- 직접 주소 방식
- 가운데 2비트는 범용 레지스터 4개 중에서 메모리를 저장하려는 위치, 나머지 3비트는 데이터가 있는 메모리 주소
- 이때 3비트는 주소를 여덟 개만 가리킬 수 있는데, 8비트 컴퓨터는 주소를 256개 가질 수 있으므로 비효율적임
- 간접 주소 방식
- [] 안에 있는 주소는 읽어들일 메모리의 주소가 아니라 데이터의 메모리 주소 값을 저장하는 공간의 주소
- 직접 주소 방식
- 앞에서 3비트는 명령어 종류를 의미함 → 3비트이므로 8개의 명령어를 표현할 수 있다.
This post is licensed under CC BY 4.0 by the author.