본문 바로가기

full of life/book

[한 권으로 읽는 컴퓨터 구조와 프로그래밍] 조너선 스타인하트 - 4

4장. 컴퓨터 내부 구조 - 컴퓨터 하드웨어는 어떻게 구성되는가

 

 

컴퓨터에는 조작할 비트들을 저장할 장소가 필요하다. 이를 메모리라고 부른다.

메모리는 집이 빈틈없이 늘어선 거리와 같다. 모든 집은 크기가 똑같고, 모든 집에는 정해진 개수만큼 비트를 저장할 수 있는 방이 있다. 각 집에는 주소가 부여된다.

 

컴퓨터에 정보를 전달하거나 컴퓨터의 정보를 가져오는 것을 I/O라고 한다. I/O에 연결되는 장치를 주변장치, peripheral이라고 한다.

 

36비트나 64비트 컴퓨터가 흔해진 요즘은 메모리 거리의 주소 수가 훨씬 많아졌다. 메모리 거리가 너무 길기 때문에 모든 주소에 집(메모리)이 있지는 않게 됐고, 빈 주소가 많아졌다. 따라서 메모리 거리 중 일부를 I/O 장치에 할당하는 것이 타당해졌다.

 

많은 컴퓨터에는 설계상 표준 입력/출력 슬롯이 있어서 일관된 방식으로 I/O 장치를 연결할 수 있다.

아무도 사용하지 않는 주소 영역을, 몇몇 사용 허가된 지역으로 나눈다. -> 각 슬롯을 차지한 장치는 자신에게 할당된 주소를 모두 사용할 수 있다. 각 슬롯에는 어떤 장치가 연결됐는지 파악할 때 사용할 수 있는 특별 주소가 있다.

 

 

👉🏻 중앙 처리 장치 (Center Processing Unit, CPU)

실제 계산을 처리하는 컴퓨터 부품이다. 다른 모든 요소는 CPU를 지원하는 역할을 한다.

 

산술 논리 장치 (Arithmetic Logic Unit, ALU)는 CPU의 핵심 부품이다. 산술 계산, 불리언 대수 및 기타 연산을 수행하는 방법을 알고 있는 장치다. 셀렉터논리 게이트가 연결된 부품이다.

하지만 곱셈과 나눗셈은 없다. 새로운 연산이 아닌,, 덧셈을 반복 -> 순차 논리로 구현하거나, 시프트와 가산기를 조합하는 곱셈기를 만들면 되기 때문이다.

 

시프트 연산

어떤 수를 1비트 왼쪽 시프트를 하면 그 수 *2와 같고, 오른쪽 시프트를 하면 //2와 같다.

이 시프트를 할 때 사라지는 MSB(가장 왼쪽 비트)나 LSB(가장 오른쪽 비트) 값이 필요할 때가 종종 있다. 이 비트를 조건 레지스터에 저장한다.

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

그리고 클록에 따라 1비트씩 시프트하는 시프트 레지스터를 플립플롭을 사용해 만들 수 있다. (배럴 시프터)

 

실행 장치 == 제어 장치

ALU는 그 자체로는 그리 유용하지 않다. 누군가 ALU에게 할 일을 알려줘야 한다. 실행 장치는 메모리의 정해진 장소에서 명령코드와 피연산자들을 가져와서 ALU에게 어떤 연사을 수행할지 알려주고, 결과를 메모리에 돌려준다.

 

우리는 실행 장치에게 명령어 목록을 제공한다.

실행 장치는 어디에서 이런 명령어를 찾을 수 있을까? 메모리에서 찾는다.

이 방법의 시초는 앨런 튜링의 튜링 기계이다. 이를 존 폰 노이만이 전자식 컴퓨터에 도입했다.

 

이제 비트를 살펴보고 해석하는 방법이 하나 더 생겼다. 명령어는 컴퓨터에게 어떤 일을 할지 알려주는 비트 패턴이다. 명령어에는 공통 표준이 없다. 그래서 인텔 Core와 ARM Cortex 등 각각이 다른 패턴을 사용할 가능성이 높다.

 

실행 장치는 메모리에서 명령어를 가져와야 하는 위치를 어떻게 알 수 있을까?

프로그램 카운터(Program Counter, PC)를 사용한다. 현재 위치를 알려주는 화살표 같은 것이다.

PC도 레지스터의 일종이며, 메모리와 별도의 특별한 곳에 위치한다. 순수 레지스터 대신 카운터로 이뤄진다. 레지스터에 카운터 기능이 추가된 것으로 생각하면 된다.

 

PC에는 메모리 주소가 들어 있다. 즉, 메모리 위치를 가리킨다(참조한다). 실행 장치는 PC가 가리키는 주소에서 명령어를 읽어온다. 명령어를 수행한 뒤에는 다음 명령어를 메모리의 다음 위치에서 가져올 수 있도록 PC가 증가된다.

마치 보물찾기와 같다. 메모리의 정해진 위치에서 쪽지를 찾는다. 쪽지에는 어떤 일을 해야하는지 적혀 있다. 그 후 다른 장소로 이동해 다음 쪽지를 찾는다. 이를 반복하며 프로그램을 실행한다.

 

 

👉🏻 명령어 집합 구성

[주소 지정 모드, 명령코드, 주소] 로 구성되어 있다.

 

주소 지정 모드

  • 직접 주소 지정: 사용할 주소가 명령어에 직접 들어가 있다.
  • 간접 주소 지정: 명령어에 들어 있는 값을 메모리 위치를 가리키는 주소로 사용한다. -> 그 메모리에 가서 읽어온다.
  • 즉시 주소 지정 모드: 주소에 해당하는 비트를 그냥 값으로 간주한다.
  • 메모리와 관계 없는 연산

명령코드

0(2) load, and, or, xor, add, sub, cmp, store, bra, bov, beq, bne, blt, ble, bgt, bge 15(2) 까지 순차적으로 구성됨

주소 지정 모드에 사용할 수 있거나, 없을 수 있으며 명령이 다를 수도 있다.

 

 

👉🏻 마지막 설계

이전까지 살펴본 모든 부분을 하나로 모아서 실제 컴퓨터로 만들어 보는 과정이다.

 

명령어 레지스터

명령어를 실행할 때는, 메모리에서 명령어를 가져오는 페치 과정이 먼저 일어난다.

페치한 명령어에 편하게 접근할 수 있도록 저장할 다른 위치가 필요하다. 명령어 레지스터에 이를 추가하게 된다.

 

데이터 경로와 제어 신호

프로그램 카운터(PC)의 값을 메모리 주소 버스에 넣을 방법과, 메모리에 있는 데이터를 명령어 레지스터로 넣을 방법이 필요하다.

 

데이터 흐름 제어

교통을 제어하는 장치, 먼저 동작은 [ 페치 -> 메모리 주소에서 읽어옴 -> 읽어온 값을 지정한 곳에 저장함 ] 이다.

이 동작에 여러 단계가 필요하므로, 각 단계를 추적할 카운터가 필요하다.

랜덤 논리로 이뤄진 제어 회로를 이용하거나, 마이크로코드를 사용한다.

 

오늘날 마이크로코드를 제공하는 컴퓨터 중에 일반 사용자가 마이크로코드를 변경할 수 있도록 허용하는 경우는 드물다. 일단 사용자가 이런 명령어에 의존성이 생기고 나면 생산자가 하드웨어를 변경하기 어려워진다. 또 마이크로코드에 버그가 있으면 컴퓨터에 해를 입힐 수도 있다. 예를 들어, CPU에서 메모리를 활성화하면서 동시에 데이터버스를 활성화하면 토템-폴 출력이 서로 연결되면서 내부 트랜지스터가 타버린다.

 

 

👉🏻 RISC와 CISC 명령어 집합

설계자들은 유용한 컴퓨터 명령어들을 만들어냈지만, 명령어가 복잡해지면서 컴퓨터 제어 회로도 복잡해졌다. 그렇지만 이 복잡한 명령어 중 상당수는 거의 쓰이지 않는다는 사실을 발견했다.

 

그래서 복잡한 명령어를 따로 사용하지 않고, 단순한 명령어를 조합해 처리하는 기계를 만들었다. -> RISC

이와 대조적으로 기존 설계 방식으로 만든 컴퓨터 기계를 -> CISC 라고 한다.

 

하지만 시간이 지나면서 더 새로운 프로그램들을 분석한 결과, 설계자들은 새로운 명령어를 RISC에 계속 추가하게 됐다. 이로 인해 최근의 RISC 기계는 오래전의 CISC 기계보다 훨씬 더 복잡하다.

 

 

👉🏻 GPU (Graphics Processing Unit)

컴퓨터를 사용한 그래픽은 마치 번호에 맞춰 색을 칠하는 아주 커다란 컬러링 북과 같다.

여러 점을 동시에 찍으면 성능이 향상되기 때문에, 그래픽은 병렬화하기 아주 좋은 작업이다.

 

그래픽 처리는 아주 특화된 작업이기 때문에 일반적인 용도에 사용할 CPU가 제공하는 모든 기능이 필요하지는 않다.

GPU를 특징짓는 기능은 두 가지가 있다.

- GPU에는 간단한 처리 장치가 아주 많이 들어 있다.

- GPU는 CPU보다 메모리 버스의 폭이 더 넓다. 메모리에 더 빠르게 접근할 수 있다. 

 

시간이 지남에 따라 GPU도 더 일반적인 용도에 쓰일 수 있게 됐다. 여러 응용 분야(공학계산, 인공지능 등)에 GPU를 쓸 수 있다. 또, 비트코인 채굴에도 사용되었다.

 

 


컴퓨터는 조합 논리, IC가 모인 작은 컴퓨터들로 이루어져 있다.

메모리가 구성된 모습과 데이터의 흐름을 살펴보았고, 다음 장에서는 이 메모리를 관리하는 방식을 알아본다.