컴퓨터 내부 구조 : 컴퓨터 하드웨어 구성

김민우·2023년 4월 30일
0

컴퓨터구조

목록 보기
4/8

컴퓨터

  • 전자 부품을 다양하게 조합해 비트를 조작하는 회로
  • 메모리(Memory), 입력과 출력(I/O), CPU(중앙 처리 장치)로 구성

메모리


집이 빈틈없이 늘어선 거리이며 각 집에는 고유 주소가 있다.

메모리의 기본 단위는 바이트이지만 꼭 바이트 단위로 데이터를 읽는 것은 아니다. 32비트는 4바이트를, 64비트 컴퓨터는 8바이트로 구성된다.

이러한 구성은 거리가 몇차선인지와 비슷하다. 거리의 차선이 많으면 더 많은 데이터를 버스에 실을 수 있어 더 많은 데이터 처리가 가능하다.

또한, 주소를 각 유닛이나 듀플렉스 또는 건물 전체(포플렉스)로 지정할 수 있다.

  • 32 Bit 메모리 구성

현대적 컴퓨터에서 버스는 오직 한 건물(포플렉스)에만 정차해 비트를 태워 도심(CPU)으로 돌아온다. 이 말은 주소가 5, 6, 7, 8인 바이트를 사용하는 긴 워드를 사용할 수 없고 2번 왔다갔다 해야한다는 것을 의미한다. 이를 정렬이 맞지 않는 접근이라 한다.

도심을 오가는 버스의 각 자리에는 누가 앉을까? 0번 바이트가 들어갈까 아니면 3번 바이트가 들어갈까? 이는 사용하는 프로세서에 따라 다르다. 이를 엔디안이라 하는데, 이를 무시하면 데이터 순서가 섞일 수 있다. 엔디안을 무시하여 데이터가 뒤섞이는 현상을 녹시 신드롬이라 한다.

입력과 출력


외부 세계와 통신하기 위한 장치이다. 컴퓨터에 정보를 전달하거나 컴퓨터에서 정보를 가져올 수 있는 방법이다.

I/O 처리를 위한 별도의 거리가 존재하며 이는 메모리 거리와 비슷하다. 과거에는 물ㄹ적 한계로 인해 이 둘을 분리하였다. 또한 메모리 거리에 집이 많지 않았기에, 제한된 주소에 I/O를 지원하는 것은 바람직하지 않았다.

요즘은 메모리 거리의 주소 수가 훨씬 많아 졌다. 즉, 아무 메모리도 연관되지 않은 주소(빈 집)이 많아졌다. 이곳에 I/O 장치를 할당하는 것이 타당하다. (이는 마치 도시 한구석에 산업 지구를 두는 것과 비슷하다)

더 많은 부분을 연결이 한정적인 패키지에 넣어야 하기 때문에 메모리와 I/O의 공존은 당연하다.

중앙 처리 장치


일명 CPU라 불리는 중앙 처리 장치는 실제 계산을 처리하는 부품이다. 메모리나 I/O 에서 각 집마다 비트들을 실은 후 목적지는 도심이라 했는데, 이 도심이 바로 CPU이다.

산술 논리 장치(ALU)

ALU는 산술 계산, 불리안 대수 및 기타 연산을 수행하는 방법을 알고 있는 장치이다.

  • 피연산자 : 수를 표현하는 비트
  • 연산 코드(명령코드, opcode) : 연산자
  • 조건 코드 : 결과에 대한 추가 정보, 보통 조컨 코드 레지스터라는 레지스터에 조건 코드가 저장된다.
    • N 비트 : 마지막 연산결과가 음수인 경우 1로 설정
    • Z 비트 : 마지막 연산 결과가 0인 경우 1로 설정
    • O 비트 : 마지막 연산 결과가 오버플로 또는 언더플로인 경우 1로 설정

다음은 ALU가 할 수 있는 일들이다.

ALU는 실렉터와 논리 게이트로 구성된다.

시프트

비트 전체를 왼쪽 또는 오른쪽으로 전체 이동시키는 것을 시프트라 한다. 이동 방향에 따라 왼쪽 시프트, 오른쪽 시프트라 부른다.

왼쪽 시프트시 MSB(가장 왼쪽 비트)가 누락되며 오른쪽 시프트시 LSB(가장 오른쪽 비트)가 누락된다. 따라서, 이 비트를 조건 레지스터에 저장한다. 우리 CPU에서는 이 비트를 O 비트에 저장한다.

시프터는 부동 소수점 연산을 구현할 때 핵심 부품이다. 두 피연산자의 가수를 지수에 따라 시프트함으로써 소수점을 정렬 후 서로 더하거나 뺄 수 있다.

실행 장치

계산을 수행하는 장치(ALU, 일꾼)에게 명령을 내리는 장치(보스)가 있어야 한다. 컴퓨터의 실행 장치 또는 제어 장치라고 부르는 장치가 이 역할을 한다. 역할을 보면 알 수 있듯 컴퓨터의 대장 역할을 한다.

실행 장치는 메모리의 정해진 장소에서 명령 코드(opcode)와 피연산자들을 가져와 ALU에게 어떤 연산을 수행할 지 알려주고, 결과를 메모리에 돌려준다. 실행 장치는 어떤 유용성을 유지할 수 있는 방식으로 이 모든 단계를 수행해야 한다.

명령어 목록을 실행장치에게 제공함으로써 실행 장치는 명령을 내릴 수 있다. PC라고 불리는 프로그램 카운터를 통해 메모리에서 명령어를 가져와야 하는 위치를 찾는다. PC는 우편 배달부나 현재 위치를 알려주는 큰 화살표라 생각하자.

PC는 메모리 위치를 가리키며 실행 장치는 PC가 가리키는 주소에서 명령어를 읽어온다. 특별한 명령어를 실행하는 경우가 아니면 현재 명령을 수행한 후 다음 명령어는 그 다음 위치(PC + 4) 에서 가져올 수 있도록 프로그램 카운터가 증가한다.

이 모든 기능은 마치 보물찾기처럼 작동한다. 컴퓨터는 메모리의 정해진 위치에서 쪽지를 찾는다. 이 쪽지에는 컴퓨터가 어떤 일을 해야 하는지가 들어있다. 그 후 컴퓨터는 다른 장소로 이동해 다음 쪽지를 찾는다. 컴퓨터는 이러한 과정들을 반복하면서 프로그램을 실행한다.

명령어 집합


컴퓨터가 보물찾기를 하는 중에 메모리에서 찾는 쪽지를 명령어라고 부른다.

명령어

명령어의 구성은 다음과 같다.

  • 명령 코드(opcode)
  • 피연산자 A
  • 피연산자 B
  • 결과

이러한 구성을 다음 3주소 방식으로 나눌 수 있다.

하지만, 이렇게 나누는 것은 잘 작동하지 않는다. 결과와 피연산자 주소에 4비트 밖에 쓸 수 없기 때문이다.

또 다른 방법으로는 본 DRAM 주소 지정 기법을 사용하는 것이다. 주소 확장 레지스터를 두고 별도의 명령어를 사용해 상위 주소를 지정한다. 그러나, 주소 확장 레지스터에 값을 설정하려면 시간이 들고 이를 통해 메모리 영역을 모두 지정하려면 여러 번 레지스터를 설정해야 한다는 단점이 있다.

하지만 3주소 명령어가 잘 작동하지 않는 큰 이유는 3개의 메모리 위치를 한 꺼번에 지정(물리적으로 존재하지 않는)하는 메모리 주소 접근법을 사용하기 때문이다.

3개의 메모리 블록은 각기 다른 장치에 존재하며 주소 버스와 데이터 버스가 3개씩 따로 존재한다. 이런 경우 연산 결과를 다른 연산에 활용하려면 결과가 들어있는 메모리 장치에 데이터를 다른 피연산자 메모리 장치로 보내기 위한 별도의 명령어를 사용해야 한다.

CPU 패키지의 입출력 핀 수가 제한되기에 3개의 버스가 같은 핀을 공유하고 다른 클록에 작동하는 수 밖에 없다. 하지만 이런식으로 처리한다면 굳이 버스를 3개나 둘 필요가 없다.

따라서, 데이터 버스와 주소 버스를 하나만 두고 메모리 장치를 공유해야 한다.

이 경우 피연산자 A, B의 내용을 저장하는 레지스터를 추가해 명령어를 처리할 수 있다. 하드웨어는 다음 절차를 거쳐 명령어를 실행한다.

  1. PC에 들어있는 주소를 사용해 메모리에서 명령어를 읽어온다.
  2. 명령어의 피연산자 A에 있는 주소를 사용해 메모리에서 데이터를 읽어 레지스터에 저장한다.
  3. 명령어의 피연산자 B에 있는 주소를 사용해 메모리에서 데이터를 읽어 레지스터에 저장한다.
  4. 연산 수행 결과를 명령어의 결과 부분에 있는 주소에 해당하는 메모리에 저장한다.

이 과정을 수행하려면 4 클록이 필요하다. 한 번에 한 메모리 위치에만 접근할 수 있다는 사실에 맞춰 명령어 집합을 적절히 설계해야 한다는 사실을 깨달아야 한다.

게다가 한 번에 한 주소에만 접근하면 더 많은 비트를 주소에 활용할 수 있다.

레지스터 거리에 다른 집을 추가하면 이렇게 할 수 있다. 이 레지스터를 누산기라 하며, 누산기 레지스터를 A 레지스터라 부르기도 한다. 누산기는 ALU의 계산 결과를 저장한다.

두 피연산자의 계산 결과를 다른 메모리에 넣는 대신 한 메모리 위치에 있는 값과 누산기에 있는 값에 대한 연산을 수행하고 결과를 누산기에 넣는다.

물론, 누산기에 있는 값을 메모리에 저장하기 위한 저장 명령어를 추가해야 한다. 이렇게 하면 명령어 구성을 다음처럼 바꿀 수 있다.

다음 연산을 누산기를 사용해서 처리하면 다음과 같다.

C = A + B

누산기 = A
누산기 = 누산기 + B
C = 누산기

주소 지정 모드

누산기를 사용하면 12비트를 주소 지정에 쓸 수 있고, 4096가지 주소를 가리킬 수 있으며 16가지 주소를 가리킬 수 있는 것보단 훨씬 낫지만, 여전히 사용 가능한 주소는 충분하지 않다.

이렇게 주소를 직접 가리키는 방식을 직접 주소 지정이라 한다. 이 말은 사용할 주소가 명령어에 직접 들어가있다는 뜻이다.

간접 주소 지정을 추가하면 더 많은 메모리를 사용할 수 있다. CPU는 명령어에 들어 있는 값을 피연산자 주소로 해석하지 않고, 피연산자 주소를 얻을 수 있는 메모리 위치로 해석한다.

이 두 가지 방법으로도 충분하다 생각할 수 있지만, 때로는 상수를 지정해야 될 수 있다. 예를 들어, 10까지 숫자를 세려면 10이라는 상수를 누산기에 넣을 방법이 필요하다.
이를 위해 즉시 주소 지정 모드라는 방식이 존재한다. 이 경우엔 주소에 해당하는 비트를 그냥 값으로 간주한다. (ex. 0011 -> 3)

분명히 직접 주소 지정은 메모리를 두 번 접근해야 하기 때문에 즉시 주소 지정보다 느리다. 그럼에도 사용 가능한 주소가 많아지기에 사용한다.

조건 코드 명령어

덧셈, 뺄셈, 비교 연산에서 조건 코드가 설정된다는 것을 알 수 있었다. 그러나, 조건 코드를 원하는 값으로 설정하거나, 조컨 코드의 값을 살펴볼 수 있는 방법이 필요하다. 조건 코드 레지터의 값을 누산기로 복사하는 cca라는 명령어와 누산기의 값을 조건 코드 레지스터로 복사하는 acc라는 명령어를 추가할 수 있다.

분기 명령어

지금까지 명령들은 처음부터 끝까지 순차적으로 실행되기만 했다. 의사 결정을 내리고 코드 중 일부를 선택해서 실행하는 프로그램이 필요하다. 즉, PC값을 PC + 4가 아닌 완전히 다른 값으로 변경할 수 있는 명령어가 필요하다. 이를 분기 명령어라 한다.

분기 명령어에는 조건을 저장하기 위한 비트가 필요한데, 다음 표에서 볼 수 있다.

최종 명령어 집합 구성

이 모든 기능을 우리 명령어 집합에 넣으면 아래와 같다.

  • 주소 지정 모드 선택을 위한 2비트가 필요하다.

주소 지정 모드와 명령 코드를 디코딩하면 아래 명령어를 얻을 수 있따. 다만, 이렇게 만든 완전한 구현은 앞의 표 4-1에서 봤던 ALU 내용과 완전히 일치하지는 않는다.

왼쪽 시프트와 오른쪽 시프트는 다른 경우에 사용하지 않을 비트들을 사용해 시프트할 피트 수를 지정한다.

마지막 설계


지금까지 살펴본 모든 부분을 하나로 모아서 실제 컴퓨터를 만들어보자. 여러 부분이 함께 작동하기 위해선 이들을 이어주는 일명 "접착제"에 해당하는 요소가 필요하다.

명령어 레지스터

컴퓨터가 한 프로그램을 한 번에 한 명령어씩 실행하지 않는다. 명령어를 실행하려면 어떤 일이 벌어질까? 컴퓨터에서 벌어지는 일을 아래 그림처럼 이뤄진 상태 기계로 설명이 가능하다.

페치란 처음에 컴퓨터가 해야 하는 일(명령어)을 메모리에서 가져오는 것을 말한다. 페치를 한 후 이 명령어를 어떻게 실행할지 고민해야 한다.

명령어를 실행하려면 메모리에 접근해야 되는 경우가 많다. 이 말은 다른 목적으로 메모리를 사용할 때 페치한 명령어에 편하게 접근할 수 있도록 저장할 다른 위치가 필요하다는 뜻이다.

CPU에 명령어 레지스터를 추가해서 현재 실행중인 명령어를 저장할 수 있다.

데이터 경로와 제어 신호

PC 값을 메모리 주소 버스에 넣을 방법과 메모리에 있는 데이터 명령어 레지스터로 넣을 방법이 필요하다. 이전에 배웠던 레지스터, 실렉터, ALU, 트라이스테이트, 버퍼 등을 통해 구현할 수 있다.

  • 주소 실렉터 : 3방향 교차로
  • 데이터 실렉터 : 4방향 교차로
  • 데이터 버스, 주소 버스의 왼쪽 : I/O 장치

간접 주소 레지스터라는 부분이 추가되었는데, 이는 간접 주소 지정을 사용할 때 메모리에서 읽어온 주소를 어딘가에 저장해야 하기 때문에 필요하다.

데이터 흐름 제어

입/출력에 대해 모두 알았으므로 이제 교통을 제어하는 장치를 만들 때다.

어떤 명령어든 처리하려면 페치를 해야한다. 페치를 하려면 다음과 같은 신호가 필요하다.

  • address source는 프로그램 카운터를 선택해야 한다.
  • 메모리를 동작시켜야 한다(enable=1), 그리고 r/w는 읽기(1)로 설정해야 한다.
  • 명령어 레지스터를 동작시켜야 한다(enable=1).

0개의 댓글