Post

컴퓨터 내부 구조

컴퓨터 내부 구조

메모리

컴퓨터에서 조작할 비트들을 저장하는 장소

메모리는 공간들이 빈틈없이 배치되어 있고, 각 공간들은 1바이트를 저장할 수 있고, 고유한 주소가 부여된다. 이때, 메모리의 기본 단위가 바이트라고 1바이트 단위로만 데이터를 읽는 것은 아니고, 32비트 컴퓨터는 4바이트 단위로, 64비트 컴퓨터는 8바이트 단위로 데이터를 읽는다.

32비트와 64비트의 주소는 1바이트 주소 지정 방식과는 다르게 롱 워드 주소를 사용한다.
롱 워드 주소 = 워드 주소(바이트 주소 + 바이트 주소) + 워드 주소(바이트 주소 + 바이트 주소)

롱 워드 주소를 하나의 집이라고 했을 때, 데이터 버스는 한 번에 하나의 집만 들릴 수 있기 때문에, 다른 집에 있는 워드 주소나 바이트 주소에 접근할 수 없다. 이렇게 한 번에 여러 공간에 걸친 데이터를 읽으려 하는 경우를 정렬이 맞지 않는 접근이라고 부른다.

프로세서마다 엔디안이 다르기 때문에 데이터 순서가 달라질 수도 있어서, 서로 다른 시스템 간의 데이터 전송 시 주의해야 한다.

입력과 출력

과거에는 메모리가 작아서 빈 공간 없이 거의 다 사용했지만, 현재처럼 32비트나 64비트 컴퓨터가 사용되는 시점에서는 오히려 빈 공간이 많아져서 빈 주소가 많아지게 되었다. 그래서 메모리 경로 중 일부를 I/O 장치에 할당하게 되어서 I/O와 메모리가 같은 버스를 사용하게 되었다.

컴퓨터는 표준 입출력 슬롯이 있어서 일관된 방식으로 I/O 장치를 연결할 수 있다. 즉 경로에서 특정 지역을 장치에 할당하고, 장치는 해당 범위의 주소를 모두 사용할 수 있고, 각 범위에는 어떤 장치가 연결된지 알 수 있는 특별한 주소도 있다.

중앙 처리 장치(CPU)

실제 계산을 처리하는 컴퓨터 부품이고, 다른 모든 부품은 사실상 CPU를 지원하는 역할이다.

산술 논리 장치(ALU)

ALU는 CPU의 핵심 부품으로 산술 계산, 불리언 대수 및 기타 연산을 수행한다.

구성
피연산자 : 수를 표현하는 비트
연산 코드 : 피연산자에 어떤 연산자를 적용할지 지정
조건 코드 : 결과에 대한 추가 정보 (조건 코드 레지스터에 저장된다.)

시프트

모든 비트를 왼쪽 혹은 오른쪽으로 1비트씩 옮기고 해당 방향의 맨 끝쪽 비트를 버린다. 왼쪽 시프트는 2를 곱하는 것과 같고, 오른쪽 시프트는 2로 나눈 몫을 구하는 것과 같다. 이때 버려지는 비트가 필요할 때가 종종 있는데 이를 저장하는게 바로 조건 레지스터다.

실행 장치(제어 장치)

실행 장치는 ALU에게 어떤 일을 해야할지 지정해주고, 결과를 메모리에 돌려주는 역할을 담당한다. 이때 실행 장치는 메모리에 있는 명령어 목록에서 명렁어를 찾아 ALU에게 시킨다. 이러한 방식의 컴퓨터를 프로그램 저장 방식 컴퓨터라고 부른다.

명령어는 컴퓨터에게 할 일을 가르쳐주는 비트 패턴으로 공통 표준은 없고, CPU마다 고유하다. 실행 장치는 프로그램 카운터를 통해 메모리에서 명령어를 가져와야 하는 위치를 알 수 있다. 카운터는 레지스터의 일종으로 메모리와 독립적인 곳에 위치해 메모리 주소를 갖고 있다.

명령어 수행 이후에는 다음 명령어를 메모리의 다음 위치에 가져올 수 있게 카운터가 증가하고, 다시 명령어를 실행한다. 이러한 과정을 반복하면서 컴퓨터가 프로그램을 실행한다.

명령어 집합

명령어

3주소 명령어 구성
명령코드, 두 개의 피연산자, 결과로 구성된다. 16비트 명령어 기준으로 각 주소에 4비트 밖에 쓸 수 없어 유효한 크기의 메모리를 가리킬 수 없다.

세 가지 메모리 위치를 한번에 지정하는 메모리 주소 접근을 사용해 각 메모리 블록은 서로 다른 장치에 존재해서, 연산 결과를 다른 연산에 활용하려면 결과가 있는 메모리 장치에 있는 데이터를 다른 피연산자 메모리 장치로 보내기 위해 별도의 명령어를 사용해야 한다.

DRAM 주소 지정 기법
주소 확장 레지스터를 두고 별도의 명령어를 사용해 상위 주소를 지정한다. 레지스터에 값을 설정해서 시간이 더 들고, 여러 번 레지스터를 설정해야 하는 단점이 있다.

누산기
산술 및 논리 연산의 중간 결과를 저장한다. 데이터 이동 없이 연속적인 연산이 가능해 속도가 빠른데, 이는 데이터를 메모리에서 누산기로 로드 후 계산하고 다시 메모리에 저장하기 때문이다.

즉, 1주소 명령어 구성으로 더 많은 주소 비트를 사용할 수 있다.

주소 지정 모드

누산기는 16비트 중 12비트를 주소 지정에 쓸 수 있어 3주소 명령어 구성보다는 주소에 쓸 수 있는 비트가 많지만 여전히 12비트도 부족하다. 그리고 이러한 주소를 가리키는 경우를 직접 주소 지정이라고 하고, 이는 사용할 주소가 명령어에 직접 들어가 있다는 뜻이다.

간접 주소 지정을 추가하면 CPU는 명령어에 들어 있는 값을 피연산자 주소가 아닌 피연산자 주소를 얻을 수 있는 메모리 위치를 가리키는 주소로 사용한다. 명령어가 참조하는 주소가 다른 메모리 위치를 가리킬 수 있기 때문에 더 넓은 메모리 공간을 활용할 수 있다.

추가로 상수를 지정해야 할 때처럼 바로 값을 누산기에 넣어야 할 때, 즉시 주소 지정 모드라는 주소에 해당하는 비트를 그냥 값으로 간주하는 방식도 있다.

즉시 주소 지정은 메모리에 한 번만 접근하면 되서 가장 빠르고, 직접 주소 지정은 두 번, 간접 주소 지정은 세 번 접근해야해서 더 느리다.

조건 코드 명령어

CCA : 조건 코드 레지스터의 값을 누산기로 복사하는 명령어
ACC : 누산기의 값을 조건 코드 레지스터에 복사하는 명령어

분기 명령어

명령어를 순서대로 수행하기만 하는 것이 아니라, 의사결정을 내리고 코드 중 일부를 선택적으로 실행하고 싶을 때, 프로그램 카운터의 값을 변경할 수 있는 명령어다.

최종 명령어 집합 구성

주소 지정 모드(2비트) + 명령코드(4비트) + 주소(10비트)

마지막 설계

명령어 레지스터

컴퓨터가 프로그램을 실행할 때는 패치와 실행으로 이루어진 상태 기계 과정이 이뤄진다. 패치는 메모리에서 명령어를 가져오는 것인데, 명령어 실행을 위해 메모리에 접근해야 할 때 명령어를 명령어 레지스터에 저장한다.

데이터 경로와 제어 신호

네?

데이터 흐름 제어

  1. 프로그램 카운터 초기화
  2. 프로그램 카운터 동작
  3. 프로그램 카운터 증가
  4. 간접 주소 레지스터 동작
  5. address source를 통해 명령어 가져오기
  6. 명령어 레지스터 동작
  7. 메모리 쓰기
  8. 메모리 동작
  9. 연산코드
  10. 조건 코드 레지스터 동작
  11. 누산기 동작
  12. 데이터 버스 동작
  13. 데이터 소스에 저장

이게 무슨…

RISC와 CISC 명령어 집합

RISC
복잡한 명령어는 상당수 거의 쓰이지 않고, 프로그램 실행 시간의 대부분을 차지하는 명령어만 포함한 기계로, 복잡한 명령어를 단순한 명령어를 조합해 처리한다.

메모리와 레지스터를 오가는 명령어들과 레지스터 간 명령어로만 이어진 적재-저장 구조를 사용한다.

CISC
기존 설계 방식대로 만든 컴퓨터

GPU

그래픽 작업은 매초 수억 번 이상 메모리에 접근해야 하는 경우도 있는데, 그래픽 처리는 아주 특화된 작업이라 일반적인 용도의 CPU가 제공하는 모든 기능이 필요하지 않고, 동시에 여러 점을 찍으면 좋기 때문에 그래픽은 병렬화가 효율이 좋다. 또한, GPU는 간단한 처리 장치가 많이 들어 있고, CPU보다 메모리 버스의 폭이 넓아 더 빠른 메모리 접근이 가능하다.

최근에는 GPU를 사용하기 위한 연구고 진행되어 공학계산과 인공지능에서 활발하게 사용되고 있고, 비트코인 채굴에도 사용되고 있다.

후기

p185에 ‘앞에서 우리가 살펴봤던 내용인 레지스터, 실렉터, ALU, 트라이스테이트 버퍼 등일 뿐이다’ 라고 적혀있다. 미안한데 거의 기억이 나지 않는 것들이다…

3장까지 회로만 주구장창 나와서 회로만 끝나면 되겠지 했는데 전혀 그렇지 않다…

This post is licensed under CC BY 4.0 by the author.

Trending Tags