[CS] 컴퓨터 구조 핵심 정리

·2024년 9월 2일

Study Note ✍🏻

목록 보기
47/60

컴퓨터 시스템

컴퓨터 시스템은 크게 하드웨어소프트웨어로 나뉜다.

소프트웨어는 운영체제(Windows, Linux, Mac OS)와 응용 프로그램(운영체제 위에서 돌아가는 여러 가지 프로그램)으로 구분되고, 하드웨어는 CPU(중앙처리장치(필수)), Memory, Storage(SSD/HDD)(외부저장매체), Network(인터넷) 등이 필요하다.

폰노이만 구조


폰노이만 구조 이전에는 컴퓨터가 어떤 작업을 하려면 각 작업마다 일종의 컴퓨터(하드웨어)를 따로 만들어주거나, 스위치, 전선을 다르게 구성해야만 했다. 이 구조는 하드웨어는 하나로 만들고 그 안에서 여러 가지 프로그램을 돌릴 수 있게 만든다. 이를 통해 소프트웨어만 메모리에 교체를 해주면 CPU가 일을 순차적으로 시행하면서 내가 원하는 다양한 작업을 할 수 있게 되었다고 한다.

CPU에 명령을 하는 코드를 메모리에 순차적으로 올려두고 CPU가 그 코드를 한줄한줄 읽어서 그 코드에 쓰여져 있는 명령대로 실행만 하면, 메모리의 코드를 프로그램에 따라서 바꿔주기만 하면 CPU라는 하드웨어 하나에 메모리 하나 넣은 구조로 여러 가지 프로그램을 돌릴 수 있을 것이다.

지금 컴퓨터 구조는 모두 CPU, 메모리, 저장매체(Storage)가 있다. 저장매체 <-> 메모리 <-> CPU의 과정을 따른다.

컴퓨터 구성 요소

1. CPU(중앙처리장치, Central Processor Unit)
CPU는 크게는 연산제어의 기능을 담당한다.

연산(ALU, Arithmetic Logic Unit)
산술 연산(Arithmetic Operation) : 덧셈 연산 등
논리 연산(Logic Operation) : 참/거짓을 판별하는 연산 등
제어(Control Device) : CPU밖의 여러 가지 메모리, 저장매체, 네트워크 등을 제어해주는 기능이다. 메모리에서 데이터를 가져와라, 계산하라 등 제어의 역할

2. Memory(메모리)
코드와 데이터를 저장하는 장치이다.

1) 폰노이만 구조 그림에서 나오는 메모리(= RAM)
2) 전체적으로 CPU와 어떤 식으로든 데이터, 코드를 저장할 수 있는 장치(내/외부 기억장치)

내부 기억장치(주기억장치) : 속도가 빠르지만 휘발성

  • CPU 내부 저장장치 :
    레지스터(Register) : 작은 공간의 데이터를 임시로 저장할 수 있는 저장 공간
    캐쉬(Cache Memory) : CPU가 메모리에 가서 데이터를 가져오는 데 많은 시간이 소요되므로 가져왔던 데이터를 일정시간 쌓아둬서 재사용될 때에 빠르게 사용할 수 있게 해주는 저장 공간, 성능(속도)이 빨라진다.
  • DRAM 등의 메모리(RAM, DDR4, DDR5 등), 1)에서의 메모리 (코드와 데이터를 일시적으로 저장)
    외부 기억장치(보조기억장치) : 주기억장치에 비해 속도가 상대적으로 느리지만 비휘발성
    SSD, HDD

3. IO Device(입출력장치, Input/Output Device)

버스(Bus)

System Bus : 위 3가지 구성 요소를 서로 연결하고 데이터 전달을 위한 경로. 즉, 주요 3가지의 장치를 연결해서 통신이 가능하도록 하는 기기

Internal Bus : 주요 3가지 장치들의 데이터를 주고받기 위한 버스가 아닌, CPU 내부 장치들간에 데이터를 주고받기 위한 버스를 말한다.

논리 게이트

반가산기 / 전가산기


1과 1을 더했을 때는 10이 된다. 이를 이진수로 나타낼 때는 한자리에 10을 쓸 수 없기 때문에 sum비트와 carry비트로 나누어서 10을 처리해준다. 즉, sum 비트는 위와 똑같이 덧셈 연산을 하고, carry 비트는 10과 같이 자릿수가 달라졌을 때만 1을 담는다.

XOR 게이트로 sum을, AND 게이트로 carry를 나타낼 수 있다. 각각 하나의 bit인 A와 B를 통해 합 sum과 올림수 carry를 출력하는 조합 논리회로를 만들 수 있다.

1. 반 가산기 (half adder)
두 bit를 덧셈하는 가산기 -> 입력과 출력이 모두 2개이다. (각 하나의 bit인 A와 B를 더해 합 S와 자리 올림(Carry) C를 출력한다.

2. 전 가산기 (full adder)
두 but 외 carry까지 계산할 수 있는 가산기 -> 반가산기를 조합해서 만든다. A, B bit와 carry bit 값을 입력으로 받아 sum과 carry 값을 출력해준다.

반 가산기는 1비트의 데이터에 대해서만 사용 가능하다. 이 반가산기를 조합하여 전 가산기를 만들었고, 전 가산기는 이전 값의 올림에 대한 계산까지 가능하기 때문에 모든 비트에 대하여 사용 가능하다.

플립플롭

데이터를 저장하는 조합논리회로 (스위치를 키고 끄고를 저장할 수 있다.)

불이 켜져 있다. = 최근에 첫 번째 스위치가 켜졌었다.
불이 꺼져 있다. = 최근에 두 번째 스위치가 꺼졌었다.

1. R-S(Reset-Set) 플립플롭
한 번 스위치를 켰다면, 해당 스위치를 몇 번 열고 닫더라도 출력이 계속 0이 된다. 즉, 회로에 더 이상 영향을 줄 수 없는 상황이 된다. 이 회로는 두 스위치가 모두 열려있을 때 두 가지 안정된 상태를 가지고 있다고 말한다.
R과 S가 동시에 1이 되지 않도록 설계해야 한다.


2. 레벨 트리거 D 플립플롭
E(Hold That Bit)가 1일 때만, Data가 1일 때 출력 값에 적용이 된다. 즉, 값을 저장할지 말지를 결정할 수 있는 회로.
R과 S가 동시에 1이 되지 않도록 설계한다. R과 S가 동시에 0일 경우도 Q 값에 영향을 주지 않으므로 삭제한다.

레벨 트리거 D 플립플롭을 1 bit latch이라고도 한다.
Hold That Bit를 Writ로 표시하고, Data In이 데이터를 넣을 때, Write도 1이 되어야 한다.
1 bit를 일시적으로 저장할 수 있는 메모리이다.

  • 8 bit latch
  • 8-to-1 selector
    8개의 1 bit latch 중에서 하나의 데이터 출력 신호를 선택 가능

    S0, S1, S2를 이용해 8개의 unique한 신호를 전달할 수 있음. 이를 통해 하나의 데이터만을 출력할 수 있게 된다.
  • 3-to-8 selector
    3-to-8 decoder 위에 write switch를 놓아 8개의 bit data 중 하나에만 write 신호를 받는다. write 신호를 받아 data input에 8곳에 1을 보내더라도 이 중 write 신호가 1인 latch에만 data output에 1이 나올 수 있다.
  • 8 bit latch (= RAM)
    3-to-8 decoder와 8-to-1 selector로 구성
    address(s0, s1, s2)가 decoder와 selector에 동일하게 적용
    특정 8개의 latch 중에 특정 address의 데이터를 쓸 수 있고 해당 데이터를 읽을 수도 있음

    8×1 RAM : 8개의 비트 중 1개의 특정 비트를 쓰고 읽을 수 있는 메모리
    데이터를 저장할 수 있고, 특정 공간에 새로운 데이터를 저장하거나 읽기가 가능하다. Address 지정을 통해 특정 공간 값 접근이 가능하다.

    16×1 RAM : 8개의 비트 중 2개의 특정 비트를 쓰고 읽을 수 있는 메모리 (8×2 RAM) 구조에 Select와 1-to-2 Decorder/2-to-1 Selector을 추가
    Select는 4번째 Address의 역할을 하게 된다. (1-to-2 Decorder의 두 개의 값 중에 어떤 값을 사용할 지를 결정)

    64K RAM

Accumulaotr (가산기)

플립플롭 구조에서 clear 라는 버튼 추가
data가 1이면 output이 1이지만, 만약 clear가 1이면 output은 무조건 0이다. 즉, clear가 1이면 data가 삭제된다.

data-in에 X값을 넣어주면 반대편 data-in은 0이므로 8-bit adder를 통해 X + 0을 통해 data-out이 X가 된다.
data-out된 X는 다시 8-bit latch의 data-in으로 들어가 여기서 add가 눌러져 저장되었다가 data-out으로 X가 됨 그리고 다시 8-bit adder로 들어간다.
여기서 8-bit adder에 Y를 넣어주면 X + Y가 되어 data-out이 된다.
X + Y가 8-bit latch에 data-in이 되어 add를 통해 데이터가 저장되고 data-out으로 출력되며 다시 8-bit adder로 들어간다.
만약 현재 X + Y 상태에서 I + J를 하고 싶다면 8-bit latch에서 add가 아닌 clear를 통해 data-out이 0이 된다. 그리고 다시 8-bit adder에 0이 들어간다.

흐름을 보면 축척되는 느낌이 있기 때문에 Accumulator라고 할 수 있다.
X + Y를 할 때 X를 저장해둘 임시적인 공간 필요해 CPU 안에 여러가지 data 처리를 위한 임시적인 data 공간(Register)이 존재한다.

Program Counter (PC)

= Accumulator + 16-bit counter + control panel
메모리에서 실행할 다음 명령어의 주소를 저장하는 register.
각 명령을 가져올 때마다 프로그램 카운터는 저장된 값을 1씩 증가시킨다. 각 명령을 가져온 후 프로그램 카운터는 순서대로 다음 명령을 가리키며, 컴퓨터가 재시작되거나 재설정되면 프로그램 카운터는 일반적으로 0으로 돌아간다.

Automation

네 수를 더하고, 두 수를 더한다고 가정

0000h부터 네 수를 하나씩 할당한다. 첫 번째 네 수를 더한 값을 저장 후 두번째 시작할 때 clear 한다음에 0005h부터 다시 시작한다.
그리고 두번째 더한 값도 저장한다. 이러한 순차적인 과정을 메모리에만 넣으면 자동으로 할 수 있다. 그러면 폰노이만 구조에 의해 하나씩 CPU에서 가져가서 실행을 하게 된다.

각 주소에 대응해 Load, Add, Store를 의미하는 값을 만들어야 한다. -> RAM을 분리하여 명령을 의미하는 값을 순차적으로 넣어주면 코드를 실행할 수 있다.
이러한 명령 숫자를 Instruction Code, Operation Code, opcode라고 한다.

CPU

CPU에는 레지스터(Register)라는 저장공간이 존재한다.

PC(Program Counter): 다음 실행할 명령어 주소를 가리키는 레지스터
IR(Instruction Register): 가장 최근에 인출한 명령어 보관 레지스터
누산기(ACC, Accumulator): 데이터 일시 보관 레지스터
MAR(Memory Address Register): CPU가 메모리 참조를 위해 보관하는 데이터 주소를 가진 레지스터
MBR(Memort Buffer Register): CPU가 메모리로부터 읽거나, 저장할 데이터 자체를 보관하는 레지스터

CPU 기본 실행 구조

  1. Instruction Fetch : 실행할 명령어를 메모리에서 읽어 CPU로 가져온다.

    PC가 가리키는 주소 → MAR에 전달
    MAR에 적힌 주소를 메모리(Memory)에서 읽어 → MBR에 전달
    MBR에 있는 명령어 → IR 저장
    다음 명령어를 가리키도록 PC 주소값 증가

  2. Instruction Decode : IR에 저장된 인출한 명령어를 해석을 해서 해당 명령어에 포함된 데이터를 가져오고 해독한다.

  3. Instruction Execution : 명령어 실행

    MBR의 데이터와 ACC(Accumulator)의 데이터로 연산 후, ACC(Accumulator)에 저장

  4. Write Back : 실행 결과를 저장

CPU 파이프라인

프로세서 작업을 여러 단계로 분할하여 동시에 수행함으로써 처리 속도를 향상시키는 기술.
일반적으로 한 개의 명령어를 처리하는 데 필요한 시간을 줄이고, 같은 시간 동안 더 많은 명령어를 실행할 수 있도록 함으로써 전체적인 작업 성능을 향상시킨다. -> 세부적으로 단계를 나누면 나눌수록 속도가 빨라진다.

CISC, RISC

CISC (Complex Instruction Set Computer)

하나의 명령어 실행으로 가능한 많은 작업을 수행한다. (복합 명령어)
복합 명령어 수행을 위해 CPU 로직 회로 복잡도가 증가한다. 하나의 명령어 실행 시간이 증가하게 된다.

명령어의 포맷인 길이에 관한 규칙이 없음 -> 전체 명령이 얼마나 걸릴지 시간 예측이 어려움

RISC (Reduced Instruction Set Computer)

간단한 명령어를 조합해 실행한다.
CPU 로직 회로 복잡도는 낮은 대신 코드는 길어지면서 복잡해질 수 있다.
핵심적인 명령어를 기반으로 최소한의 명령어 세트를 구성함으로써 파이프라이닝이라는 획기적인 기술을 도입할 수 있어 빠른 동작 속도와 하드웨어의 단순화와 효율화를 시킬 수 있다.

명령어의 포맷과 길이 고정, 하나의 사이클로 명령어(세부 작업) 실행 -> 전체 명령 시간 예측이 가능

profile
Frontend🍓

0개의 댓글