Racury Works

Computing System

03 May 2024
cs

이 글은 “The Elements of Computing Systems” 의 내용의 요약본이며, 자세한 내용을 학습하고 싶다면 해당 도서를 이용하는 것을 추천한다.

불 논리 Boolean Logic

컴퓨터나 핸드폰과 같은 디지털 기기는 모두 정보를 저장/처리하도록 설계된 칩들을 탑재하는데, 동일한 구성 요소인 기초 논리 게이트 로 만들어진다. 따라서, 물리적으로는 다양한 기법으로 제작되지만 논리적 작동방식은 모든 컴퓨터가 동일하다는 것이다.

불 대수

불 논리 이전에 불 대수Boolean algebra 에 대해서 먼저 알고 넘어가야 한다. 불 대수는 참(True)/거짓(False), 1/0 과 같은 불값을 가지는 대수학이며, 주로 1/0으로 표현한다. 불 함수는 2진수를 입력받아 2진수를 출력하는 함수인데, 컴퓨터는 2진수를 표현하고 처리하므로 불 함수가 하드웨어 아키텍처의 명세, 구성, 최적화에 중심적인 역할을 한다. 불 게이트는 불 함수를 물리적으로 구현한 칩이다.

  • 진리표 표현
a b c f(a, b, c)
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 0
1 1 0 0
1 1 1 1

위는 AND 함수의 진리표 예제이다. 불 함수를 나타내는 가장 쉬운 방법이며, 함수의 입력값-결과값을 표로 나타내는 것이다. 변수의 개수는 N개가 될 수 있다.

  • 불 표현식

이는 입력값에 대한 불 연산을 하는 것으로, x AND y 과 같이 표현하는 것이다. 여기서 자주 사용되는 대표적인 불 연산 3가지가 있는데,

x AND y : x, y 둘다 1일때만 1이다. 논리곱이라고도 불리며 곱셈(x·y, xy)으로 표현한다. x OR y : x, y 둘중 하나라도 1이라면 1이다. 논리합이라고도 불리며 덧셈(x+y)으로 표현한다. NOT x : x 가 1이면 0으로, 0이면 1로 반전한다. 부정이라고도 불리며 x’와 같이 표현한다. 또는, x 위에 -를 얹은 기호로도 사용한다.

위의 진리표 표현의 불 함수는 (a’ + b) · c 라는 함수이며, 한번 직접 계산해보면 진리표 표현과 불 표현식의 결과는 같다는 것을 알 수 있다.

  • 정준canonical 표현

특이한 방법이며, 함수의 진리표에서 함수 값이 1인 행들 각각의 입력값에 대해 리터럴(변수나 변수의 부정)을 AND하여 하나의 항으로 만들 수 있다. 예를 들면, 입력값 (0, 0, 1)은 a’b’c 로 묶을 수 있고 (0, 1, 1)은 a’bc 로 묶을 수 있고, (1, 1, 1)은 abc로 묶을 수 있다. 이제 이 항들을 모두 OR로 묶으면 진리표와 같은 불 표현식을 구할 수 있다. f(a, b, c) = a'b'c + a'bc + abc 여기서 알 수 있는 중요한 사실은, 아무리 복잡한 불 함수도 AND, OR, NOT 세 가지 불 연산만으로 표현이 가능하다는 것이다.

  • 추가 개념

n개의 2진 변수에 대해 정의되는 불 함수의 수는 22n 개이다. 예를 들어, 변수가 2개라면 2^2^n = 16개이다.

여기서 중요한 것은 NAND라는 함수인데, 이는 AND의 결과에 NOT을 취하는 함수이다. 이 함수가 중요한 이유는, 이 함수 하나만으로 AND, OR, NOT 연산을 만들 수 있기 때문이다.

예시로, x OR y는 (x NAND x) NAND (y NAND y) 로 표현할 수 있다. 그런데 모든 불 함수는 AND, OR, NOT으로 표현이 가능하므로, 결과적으로 NAND 연산만으로 모든 불 함수를 만들 수 있다는 것이 된다.

게이트 논리

게이트는 불 함수를 구현한 물리적 장치이며, n개의 변수로 m개의 2진 결과값을 반환하는 불 함수를 게이트로 구현하면, 이 게이트에는 n개의 입력 핀과 m개의 출력 핀이 있게 되는 것이다.

가장 단순한 형태의 게이트는 트랜지스터transistor 라는 스위치 장치들을 특정한 구조로 연결해 특정 기능을 하도록 만든 것이다. 이 게이트는 전기 신호뿐만 아니라 스위치나 신호 전달만 할 수 있다면 광학, 생물학, 수압 어떤 것으로든 구현이 가능하다.

게이트는 칩chip 이라고 불리기도 하며, 이런 경우 보통 게이트는 단순한 칩을 지칭한다. 이 뒤로는 기본 논리 게이트에 대해 기술한다. 하지만 NAND가 모든 게이트를 구성할 수 있기 때문에 완전히 기초 게이트는 아니다.

기본 논리 게이트

  • NOT(x) : x을 0에서 1, 1에서 0으로 바꾼다
  • AND(x, y) : x, y 둘다 1이면 1, 아니면 0이다
  • OR(x, y) : x, y 중 적어도 하나가 1이면 1, 아니면 0이다
  • XOR(x, y) : “배타적 논리합exclusive or”라고도 불리며 x, y가 서로 다를경우 1, 아니면 0이다
  • 멀티플렉서(x, y, sel) : 멀티플렉서multiplexor는 3-입력 게이트이며, ‘선택 비트selection bit’ 입력을 이용해 나머지 두 개의 ‘데이터 비트’ 입력 중 하나를 선택한다. 예를들어 sel이 0이면 x를, sel이 1이면 y를 반환한다
  • 디멀티플렉서(in, sel) => (a, b) : 디멀티플렉서demultiplexor는 멀티플렉서의 반대이며, 출력이 2개가 있어서 sel이 0이면 a 출력핀에 in값을, sel이 1이면 b 출력핀에 in값을 반환하며 나머지 출력핀에는 0을 반환한다

기본 게이트의 멀티비트

컴퓨터 하드웨어는 일반적으로 ‘버스bus’라 불리는 멀티비트 배열에 대해 연산을 수행하는데, 32비트 컴퓨터는 기본적으로 두 개의 32비트 버스에 대해 AND함수를 비트 단위로bit-wise 계산할 수 있다.

이 때, 32개의 2진 AND 게이트를 나란히 놓고 각각의 비트 쌍마다 AND를 적용하는식으로 구현되는데, 이 게이트들을 2개의 32비트 입력버스와 1개의 32비트 출력버스를 인터페이스로 하는 하나의 칩으로 합칠 수 있다.

간단히 말해서, 멀티비트라는건 입력이 n개인 비트쌍에 대해 연산을 하는 것이다. 01001011 을 8비트 NOT 게이트에 넣으면 10110100 이 된다.

주로 배열 문법을 사용하여 멀티비트를 나타낸다.

  • 멀티비트 NOT(x[n]) : n비트 입력 버스의 모든 비트에 대해 NOT연산을 한다
  • 멀티비트 AND(x[n], y[n]) : 두 개의 n비트 입력 버스로 들어오는 모든 n비트 쌍에 대해 AND연산을 한다
  • 멀티비트 OR(x[n], y[n]) : 모든 n비트 쌍에 대해 OR연산을 한다
  • 멀티비트 멀티플렉서(x[n], y[n], sel) : 입력이 n비트라는 점을 제외하고 일반 멀티플렉서와 같다

기본 게이트의 다입력

입력이 여러개(다입력multi-way)인 게이트를 말한다

  • 다입력 OR(x[n]) : n비트 입력 중 적어도 하나가 1이면 1이며, 그 외에는 0이다
  • 다입력/멀티비트 멀티플렉서(a[n], b[n], …, sel[k]) : m-입력 n비트 멀티플렉서는 m개의 n비트 입력 버스중에 하나를 골라 n비트 출력 버스에 출력하며, 선택 입력은 k개의 제어 비트로 이루어져 있고 k = log2m 이다.
  • 다입력/멀티비트 디멀티플렉서(in, sel[k]) => (a[n], b[n], …) : 이 또한 디멀티플렉서를 다입력 멀티플렉서처럼 해석하면 된다.

불 연산

불 연산을 진행하기에 앞서, 2진 연산에 대해서 알아볼 것이다. 그 중에 2진 덧셈이 가장 중요한데, 2진 덧셈은 다른 연산의 토대가 되는 중요한 연산이다. 2진 연산에는 뺄셈이 없기 때문에 숫자를 음수(-)로 만들어 덧셈을 하고, 곱셈과 나눗셈 또한 각각 여러번의 덧셈과 음수덧셈(뺄셈)으로 이루어진다.

2진수

우리가 사용하는 10진법은 기수base를 10으로 하는데, 이것의 의미는 10이 될 때 자릿수가 증가한다는 것이다. 2진법은 기수가 2로, 10110 이라는 2진수를 10진법으로 나타내면 이는 1·24 + 0·2·23 + 1·22 + 1·21 + 0·20 = 22 가 된다.

2진 덧셈은 10진수 덧셈과 마차가지로 오른쪽에서 왼쪽 자릿수로 숫자를 하나씩 더하면 된다. 이 때 가장 오른쪽 숫자를 최하위 비트(least significant bit, LSB) 라고 부르고, 가장 왼쪽의 숫자를 최상위 비트(most significant bit, MSB) 라고 부른다. 숫자를 더해 1+1 = 2가 되어 자리올림을 해주어야 한다면, 자리올림 비트carry bit 가 1이 되어 다음 순서의 비트쌍의 합에 추가로 더해진다.

만약 마지막 비트(MSB) 를 더해도 자리올림수가 1이라면 오버플로overflow가 발생하며, 보통 컴퓨터에서는 이 값이 버려진다.

부호가 있는 2진수를 나타내는 방법은 여러가지가 있는데, 컴퓨터에서는 2의 보수 라는 방법을 사용하며, 이는 기수의 보수radix complement법 이라고도 불린다. n개의 숫자로 된 2진수 x를 2의 보수로 나타내려면 2n - x 을 하면 된다. 이는 물론 2진법 뿐만 아니라 2만 다른 기수로 바꾼다면 다른 어떤 진법에서도 사용될 수 있다. 예를 들어 00101을 2의 보수로 나타내면 11011이 된다. 식을 더 간단하게 하자면, LSB부터 연속된 0과 첫번째 1은 냅두고 나머지 비트들을 모두 뒤집으면 되며, 다른 방법으로는 0은 1로, 1은 0으로 바꾼 후에 1을 더하면 된다.

x + (-x) 을 하면 언제나 2n이 되는 특성 덕에 2의 보수법이라는 이름이 붙여졌다. 최댓값과 최솟값은 각각 2n-1 - 1과 -2n-1 이며, MSB가 0이면 양수고 1이면 음수이다.

가산기

  • 반가산기half-adder (a, b) => (sum, carry) : 두 비트를 더한다. sum은 a + b의 LSB고 carry(자리올림)는 a + b의 MSB이다
  • 전가산기full-adder (a, b, c) => (sum, carry) : 세 비트를 더한다. 반가산기와 같다
  • 가산기adder (a[n], b[n]) : 두 개의 n비트 숫자를 더한다. 플랫폼에 따라 n은 16, 32, 64..의 값을 가지며 보수 덧셈을 수행한다. 오버플로는 감지/처리하지 않는다
  • 증분기incrementer (in[n]) : 주어진 숫자에 1을 더한다. 오버플로는 감지/처리하지 않는다

Arithmetic Logical Unit, ALU

간단하게 말해 계산기라고 할 수 있다. 값 2개를 멀티비트로 입력받으며, 안쪽에 여러 함수들이 내장되어 있어서 원하는 함수를 제어 비트control bit 라는 추가 입력을 활용하여 칩 하나로 덧셈, 뺄셈, 곱셈, 나눗셈 등의 다양한 연산을 지원하도록 할 수 있다. 이에 관한 자세한 내용은 다른 문서를 찾아보는 것을 추천한다.

순차 논리

이전까지 설명한 칩들은 모두 조합 칩combinational chip 으로, 입력 값의 조합에만 의존하는 함수를 계산한다. 그래서 상태를 유지하지 않기 때문에, 시간이 지나도 데이터를 보존할 수 있는 메모리 소자가 필요하며, 이는 순차 칩sequential chip으로 만든다.

메모리 소자에는 동기화, 클로킹clocking, 피드백 루프 등의 복잡한 논리들이 있는데 플립플롭flip-flop 이라는 순차 게이트 하나로 이 논리들을 모두 수행할 수 있다.

클록

대부분의 컴퓨터에는 연속적으로 신호를 발생하는 마스터 클록으로 시간 진행을 표현하는데, 0-1과 같이 두 신호 상태를 연속해서 오가는 발진기oscillator로 구현한다. 이 때 0의 시작에서 다음번 1의 끝까지 경과된 시간을 사이클cycle이라 하는데, 한 클록 사이클이 하나의 시간 단위 구분을 모델링한 것이다. 현재 클록 상태는 2진 신호로 표현되며, 이 신호는 하드웨어의 회로망을 통해 컴퓨터에 있는 모든 순차 칩들에 동시에 전달된다.

플립플롭

컴퓨터에서 가장 기본적인 순차 소자는 플립플롭이며, 다양한 종류가 존재한다. 그 중에서 데이터 플립 플롭(DFF)을 다루게 될텐데, 전 시간의 입력을 출력하는 out(t) = in(t-1) 구조로 이루어져 있으며 클록 신호를 입력받는다. 이 플립플롭은 레지스터부터 RAM까지 컴퓨터에서 “상태를 저장” 하는 모든 하드웨어의 기초가 된다.

레지스터register

레지스터는 값을 저장하고 불러올 수 있는 out(t) = out(t-1) 의 구조로 이루어져 있다. 내부적으로 멀티플렉서를 사용하여 새 값을 저장할 것인지 기존의 값을 불러올 것인지를 고를 수 있게 해준다. 이 때 멀티플렉서에 사용되는 선택 비트를 ‘로드 비트load bit’라고 한다. 로드 비트가 0이면 내부의 값을 유지하겠다는 뜻이다. 멀티비트 레지스터는 1비트 레지스터를 원하는 만큼 배열하면 된다. 레지스터가 저장할 수 있는 비트의 개수는 이라 부르며, 16 32 64.. 비트가 그 폭이다. 레지스터에 저장된 멀티비트 값을 보통 워드word 라고 부른다.

메모리

레지스터를 여러개 쌓아서 임의 접근 메모리(Random Access Memory, RAM) 소자를 만들 수 있다. 이 용어의 의미는, 어떤 워드든 물리적인 위치와 관계없이 똑같은 속도로 접근이 가능하다는 뜻이다. 이것이 가능한 이유는 n개의 레지스터로 이루어진 RAM의 각 단어들마다 0에서 n-1 사이 정수로 주소를 할당하여 어떤 주소 i의 레지스터를 개별적으로 선택할 수 있도록 게이트 논리를 만든다. 회로도로 보기에는 물리적으로 주소가 표시되지는 않아 메모리 칩은 주소 개념을 구현하는 직접 접근 논리direct access logic를 갖춘다. 정리하면 고전적인 RAM은 데이터 입력, 주소 입력, 로드 비트 3가지 입력을 받는다.

계수기

계수기counter는 매 시간마다 내부 상태값을 증가하는 순차 칩이다. out(t) = out(t-1) + c 로 이루어져 있고 계수 c는 보통 1이다. 계수기중 프로그램 계수기는 일반적으로 CPU에 탑재되어 다음에 실행할 프로그램 명령의 주소를 출력하는 기능을 한다. 이 외에도 값을 0으로 초기화하거나 계수값을 변경하는 기능 등이 존재한다.

시간 문제

순차 논리의 칩들은 모두 순차적이며, 하나 이상의 DFF 게이트를 장착한 칩이다. 조합 칩은 시간을 인지하지 못해서 DFF를 넣어도 출력은 입력을, 입력은 출력을 따르므로 결국 자기 자신이 출력을 결정하는데, 순차 칩은 DFF에 시간 지연이 있어(t의 출력은 t-1의 출력에 따른다) 이런 문제가 없어 데이터 경쟁data race을 피할 수 있다.

조합 칩의 출력은 입력이 바뀔 때만 변경되고, DFF가 들어간 순차 칩의 출력은 한 클록 사이클이 넘어갈 때 바뀌며, 한 사이클 안에서는 바뀌지 않는다. 클록 사이클 중간에는 순차 칩의 상태가 불안정해도 상관없고, 다음 사이클을 시작하는 순간에만 올바른 값을 출력하면 된다.

이렇게 순차 칩 출력이 이산화discretization 되면 중요한 부가 효과가 있는데, 이 특성을 전체 컴퓨터 아키텍처를 동기화하는 데 활용할 수 있다는 점이다. ALU에 x+y를 계산하라고 명령했는데, x는 바로 근처 레지스터에 있고 y는 가장 멀리있는 RAM 레지스터의 값이라 할때 여러가지 제한때문에 x과 y에 동시에 접근될 수 없을 가능성이 높은데, 그럼 x+y를 요청한 순간에 결과를 출력하려 해도 시간이 걸리게 되며 그 전까지의 ALU 출력은 의미없는 값이 된다. 그럼 이 문제의 해결방법은 무엇인가? 신경 쓸 필요 없다. ALU의 출력은 항상 어떤 순차 칩으로 전송되므로, 비트 하나가 가장 긴 경로를 따라 전송되는 시간보다 클록 사이클 주기를 살짝 더 길게 만들기만 하면 된다.

기계어

컴퓨터는 어떤 하드웨어 플랫폼을 더 저수준 칩들로 어떻게 구성하는지, 구성적 으로 설명할 수 있다. 또, 컴퓨터는 기계어의 함수들을 정의하고 사용법을 보여주는 식으로, 추상적 으로도 설명할 수 있다. 실제로 새로운 컴퓨터 시스템을 이해하려면 그 시스템의 기계어 프로그램을 먼저 살펴보는 방법이 유용하다. 하드웨어가 왜 그렇게 설계되었는지 이해하는 데도 도움이 되기 때문이다.

기계어는 기계 수준의 명령어들로 이루어진 저수준 프로그램을 코딩할 수 있도록 미리 정의된 규칙이며, 프로그래머는 이 명령을 이용해서 프로세서에서 산술, 논리 연산을 하고 메모리에서 값을 저장하거나 불러오는 등의 작업을 한다. 기계어는 대상 하드웨어 플랫폼에 직접적으로 명령을 실행하고, 하드웨어를 완전히 제어하는 것이 목표다.

어셈블리 언어

기계어는 101101010010 와 같은 2진 코드이며, 인간이 이해할 수는 없기 때문에 설계할 때 2진 코드와 연상기호를 둘다 사용한다. 예를 들어 1010을 ADD라는 연상 기호로 표현하고, 레지스터를 R1, R2와 같이 표기한다고 하면 2진 코드 대신 ADD R1,R2,R3 와 같이 간결하게 표현할 수 있을 것이다. 이 때 이런 방식으로 기계어를 연상 기호로 추상화하여 프로그래밍 할 수 있게 해주는 것이 어셈블리assembly 이다. 그리고 어셈블리를 2진 코드로 번역하는 프로그램을 어셈블러assembler 라고 한다.

메모리 접근

메모리 접근 명령은 두종류가 있는데, 산술 및 논리 명령은 레지스터 외에도 특정 메모리 주소에 접근할 수 있다. 다른 방법은 로드load 와 저장store 명령으로, 레지스터-메모리 사이에 데이터를 이동하는 명령이 있다. 이 메모리 접근 명령은 몇 종류의 주소 지정 모드addressing mode를 사용하는데, 어떤 컴퓨터든지 다음 3가지는 거의 지원한다.

  • 직접 주소 지정 방식direct addressing : 특정 주소를 직접 쓰거나, 그 주소를 나타내는 기호를 활용한다. LOAD R1,67 LOAD R1,addr 위는 레지스터R1에 메모리의 67(혹은 addr)번째 값을 로드하라는 뜻이다.

  • 즉시 주소 지정 방식immediate addressing : 명령어 코드의 상수를 불러올 때 쓰이며, 숫자 값 자체를 로드한다. LOAD R1,67 위는 R1에 숫자 67을 로드하라는 뜻이다.

  • 간접 주소 지정 방식indirect addressing : 명령어에 메모리 주소가 하드코딩 되지 않고, 필요한 주소 값을 저장하고 있는 메모리 위치를 참조하는 명령어를 사용하며, 포인터pointer 를 다룰 때 쓰인다.

제어 흐름Flow of Control

보통 프로그램은 명령어를 하나씩 순서대로 실행하지만, 갑자기 다른 위치로 분기branching 하는 경우도 있는데, 이는 반복, 조건 실행, 서브루틴 호출 등의 종류들이 있다. 그래서 어셈블리는 레이블 문법으로 프로그램 내 특정 위치에 기호를 지정할 수 있다.

beginWhile:
    JNG R1,endWhile // 만약 R1<0 이면 endWhile로
    JMP beginWhile
endWhile:

JMP는 무조건 점프unconditional jump 로, 가고자 하는 주소만 명시하고 JNG는 조건 점프conditional jump 로, 불 조건을 명시해주어야 한다.

컴퓨터 아키텍처

내장식 프로그램

컴퓨터는 정해진 명령어 집합들을 실행하는 고정된 하드웨어 플랫폼에 기반한다. 동시에 컴퓨터가 실행하는 명령어들은 기본 블록이 되어 무한히 복잡한 프로그램으로 조합된다. 그리고 이 프로그램들은 하드웨어에 내장되지 않으며, 프로그램의 코드는 컴퓨터 메모리상에 바로 데이터처럼 저장되고 연산되는데 이것이 ‘소프트웨어’ 이다. 사용자가 실행하는 소프트웨어에 따라 연산이 달라지므로 같은 하드웨어 플랫폼도 어떤 프로그램을 불러오는지에 따라 완전히 다른 일을 수행한다.

폰 노이만 구조

내장식 프로그램은 추상적인 컴퓨터 모델이나 실제 모델의 핵심 요소로 이 모델중 “보편 튜링 기계universal Turing machine” 와 “폰 노이만 기계von Neumann machine” 이 가장 주목할 만하다. 특히, 폰 노이만 구조는 클라우드 컴퓨팅을 제외한 현대의 거의 모든 컴퓨터 플랫폼의 개념적 설계도이자 설계 구조이다.

Neumann 출처: wikipedia

위는 폰 노이만 구조를 개념적으로 나타낸 것인데, 폰 노이만 구조는 중앙 처리 장치Central Processing Unit, CPU 를 기반으로 하여, 메모리 장치와 통신하고, 입력 장치에서 데이터를 받고, 출력 장치에 데이터를 보낸다. 이 구조의 중심에 내장식 프로그램 개념이 존재한다.

메모리

폰 노이만 기계의 메모리는 데이터와 명령어(Program) 두 종류의 정보를 저장하며, 두 정보의 기능은 다르지만 동일한 무작위 접근 구조에 2진수로 저장된다는 점은 동일하다. 이 구조는 워드나 위치location라고 불리는 정해진 크기의 셀들이 배열된 것으로, 각각의 셀은 유일한 주소를 가져 개별 워드를 주소로 특정할 수 있다.

데이터 메모리 고수준 프로그램은 변수, 배열, 객체와 같은 추상적 데이터를 다루는데, 이들을 기계어로 번역하면 2진 숫자열로 저장된다. 특정 워드에 값을 읽거나 쓴다.

명령어 메모리 고수준 명령어를 기계어로 번역하면, 각 2진수 기계어 명령어를 뜻하는 워드들이 되며 이 명령어들은 명령어 메모리instruction memory에 저장된다. 컴퓨터 연산의 각 단계마다 CPU는 명령어 메모리에서 워드 하나를 읽기fetch 하고 해석한 후에 명령어를 수행하고, 다음에 실행할 명령어를 찾아낸다. 또한, 명령어 메모리에 상주하는 명령어는 기계어로 작성된다. 어떤 컴퓨터는 연산-피연산자를 나타내는 코드가 한 워드라면 어떤 컴퓨터는 여러 워드로 쪼개져 기술되기도한다.

중앙 처리 장치

컴퓨터 아키텍처의 핵심이며, 불러온 프로그램의 명령어를 실행하는 일을 담당한다. CPU는 이 명령어들을 통해 다양한 계산을 수행하며, 계산과 메모리에 읽기/쓰기, 조건에 따라 다른 명령어로 점프 등을 한다. 이는 산술 논리 연산 장치(ALU) 와 제어 장치, 그림에는 없지만 레지스터 3가지가 구성되어 작업한다.

산술 논리 연산 장치 컴퓨터의 모든 저수준 산술 연산과 논리 연산을 수행한다.

레지스터 계산을 빠르게 하기 위해 매번 메모리에서 로드하고 저장하기보다 모든 CPU는 워드 하나를 저장할 수 있는 고속 레지스터를 어느정도 갖추고 있다.

제어 장치 컴퓨터 명령어는 보통 폭이 16/32/64 비트인 2진 코드로 표현되며, 명령어를 실행하기 위해 명령어를 해석한다. 이 때 이 해석을 제어 장치에서 하며 어떤 명령어를 인출하고 다음에 실행하는지 알아내는 역할도 수행한다.

레지스터

메모리는 데이터가 옮겨지는 시간과 수백만 개의 데이터 셀들 때문에 느려 연산에는 크기가 작고 CPU와 가까운 레지스터를 주로 사용한다.

데이터 레지스터

CPU의 단기 기억 메모리 기능을 하며, (a-b)·c 라는 식이 있을 때 (a-b) 의 결과값을 저장해두는 식으로 사용된다.

주소 지정 레지스터addressing register

CPU는 계속해서 메모리에 접근해야 하는데, 이 연산마다 접근할 메모리 주소를 지정해야 하는데, 이 주소는 명령어에 포함될때도 있고 예전 명령어의 실행 결과를 이용하기도 하는데 후자의 경우에 사용되는 레지스터이다.

입력과 출력

컴퓨터는 입력/출력(I/O) 장치를 통해 외부와 통신하는데, 이는 마우스와 키보드, 모니터나 프린터같은 것들이 포함된다. 컴퓨터는 이렇게 수도 없이 많은 입출력 장치를 통합하기 위해 메모리 매핑memory-mapped I/O 기법을 사용한다. 기본적으로 I/O 장치를 에뮬레이션 해서 CPU에게 그 장치를 일반적인 메모리 세그먼트처럼 ‘보이게’ 하는 것이다. 각 I/O 장치마다 메모리 내에 전용 영역이 할당되어 메모리 맵 역할을 하여 키보드와 마우스와 같은 입력 장치의 메모리 맵은 지속적으로 장치의 물리적 상태를 반영reflect하게 되어있고, 출력 장치의 경우는 지속적으로 물리적 상태를 구동drive 하도록 만들어져 있다.