[Book] 02. 컴퓨터 구조에 대한 두 번째 이야기
by jennysgap컴퓨터 구조의 접근방법
[Q] 프로세스 : 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
[Q] 쓰레드 : 프로세스 내에서 실행되는 흐름의 단위
컴퓨터를 디자인하자
- 디자인할 요소는 CPU이다.
- CPU를 구성하는 기본적인 요소 중 ALU와 Control Unit은 이미 존재한다고 가정하고 레지스터만 디자인할 것이다.
- 시스템 프로그래머 입장에서 CPU를 보는 관점은 대부분이 레지스터에 집중되기 때문에 레지스터에 대한 이해는 아주 중요하다.
레지스터를 디자인하자
다음은 레지스터를 디자인하는데 있어서 결정해야 할 중요 요소이다.
- 레지스터를 몇 비트로 구성할 것인가?
- 몇 개 정도로 레지스터를 구성할 것인가?
- 레지스터 각각을 무슨 용도로 사용할 것인가?
공부하는 입장에서 64비트 시스템은 표현하는 데 있어서 부담스럽다. 따라서 16비트로 디자인하고 레지스터 개수도 8개로 제한하겠다.
r4-r7은 각각 다른 이름을 지니도록 했는데, 이는 특수한 목적으로 사용하기 위해서 그렇게 한 것이다.
- ir : 다음 번에 실행하게 될 명령어를 미리 가져다 놓는 용도로 사용
- sp : 가장 최근에 입력된 데이터를 가르킴
- ir : 서브루틴 함수에서 되돌아갈 주소를 저장, 예외 처리후 돌아갈 주소를 저장
- pc : 다음에 수행될 명령어의 주소값 저장
명령어 구조 및 명령어를 디자인하자
16비트로 레지스터 크기를 결정하였기 때문에 명령어 길이도 16비트로 구성하는 것이 좋다.
- 저장소에는 연산결과를 저장할 레지스터 정보만 올 수 있도록 제한하자.
(일반적인 ALU는 연산결과를 레지스터에 저장하기 때문에 이러한 규칙을 따른 것이다.)
[Q] 왜 연산결과를 레지스터에만 저장하도록 제한하는가? 메인 메모리에 직접 그 결과를 저장할 수 있도록, 피연산자로 메모리 주소가 오게끔 디자인 할 수도 있는 것 아닌가?
[A] 명령어 구조가 복잡해지고, 이에 따라 하드웨어 구성도 더불어 복잡해진다. 명령어를 처리하는 데 걸리는 시간도 명령어 종류에 따라 다양해질 수 있다. 이러한 제약사항들은 CPU의 종합적 측면(성능, 비용 등)이 고려되는 가운데서 등장하게 된다. 때문에 우리는 이러한 제약사항을 지켜야 한다. - 피연산자에는 레지스터 정보나 숫자가 올 수 있도록 디자인했다.
(레지스터 정보가 온다면, 레지스터 안에 저장된 데이터를 참조하겠다는 의미로 해석된다.) - 연산 대상이 되는 두 개의 피연산자는 저장된 데이터가 숫자를 표현한 것인지, 레지스터를 표현하는 것인지 구분할 수 있어야 한다. 이 문제를 해결하기 위해 네 개의 비트 중 가장 첫 번째 비트가 1이면 레지스터 정보, 0이면 숫자 정보를 담은 것으로 약속하자.
- 제약사항 : 피연산자가 표현할 수 있는 숫자가 8개 밖에 되지 않는다. 이에 대한 해결책은 잠시 후 고민하겠다.
RISC vs CISC
CISC 구조 CPU 특징
- Complex Instruction Set Computer
- 인텔의 16비트 CPU까지는 CISC 구조였다.
- [장점]
명령어 종류가 많다(다양한 조합이 가능)는 것은 프로그램을 구현하는 데 있어서 편리함을 가져다 준다.
수십 줄에 걸쳐서 구현해야 하는 기능을 단 한 줄로 완성시킬 수 있다.
필요에 따라 명령어 길이도 유동적이기 때문에 메모리를 효율적으로 사용할 수 있다. - [단점]
명령어 수가 많고, 그 크기가 일정치 않기 때문에 CPU는 복잡해질 수 밖에 없다.
이러한 복잡한 구조는 성능 향상에 제한이 따른다.
보다 높은 성능의 CPU를 디자인하기 위해서는 보다 단순한 CPU 구조가 필요하다.
RISC 구조 CPU 특징
- Reduced Instruction Set Computer
- CISC 구조 CPU가 지니는 전체 명령어 중에서 주로 사용하는 명령어가 10% 정도밖에 되지 않는 데서 착안된 구조이다.
- 인텔의 32비트, 64비트 CPU 뿐만 아니라, 근래에 임베디드 환경에서 사용되는 대부분의 CPU가 RISC 구조이다.
- 메인 메모리 주소 정보를 피연산자로 올 수 있도록 명령어 구조를 설계하지 않았다. (이것은 범용적으로 사용되는 RISC의 특징)
- [장점]
명령어 수를 대폭 줄이고, 명령어 길이를 일정하게 디자인했다. - [Q] RISC는 어떠한 이유 때문에 높은 성능을 내는 데 유리한 걸까?
[A] 초당 클럭 수를 높이는 것도 성능을 향상시키는 일이지만, 이보다 더 중요한 것은 클럭당 처리할 수 있는 명령어의 개수이다. RISC는 명령어 길이가 동일하고 명령어를 처리하는 과정이 일정하기 때문에 클럭당 둘 이상의 명령어 처리가 가능(Pipelining 기법)하다. 바로 이점이 성능 향상에 있어서 RISC 구조가 지니는 가장 큰 장점이 된다.
Pipelining 기법
기존에 명령어 처리시 메모리에서 첫번째 명령어를 가지고 와서 명령어에 해당하는 연산을 수행하고, 다음 명령어를 또 메모리에 가져와 연산을 수행한다. 이때 다음 명령어가 도착할 때까지 쉬어야 하는데, Pipelining 기법은 명령어 연산을 수행하는 동안 다음 명령어를 가져다 놓는다. 즉, ALU가 명령어 A를 연산하고 있을 때, 다음 명령어를 Fetch 하는 것이다.
LOAD & STORE 명령어 디자인
LOAD & STORE 명령어의 필요성
명령어 제약사항
- 연산결과를 레지스터에만 저장
- 모든 피연산자는 메인 메모리의 주소값이 올 수 없다.
- 피연산자로 올 수 있는 것은 숫자와 레지스터로 제한
[문제] 지금까지 디자인한 명령어만을 가지고는 다음과 같은 연산을 할 수 없다.
메인 메모리에서 저장된 데이터를 레지스터로 옮겨 놓은 다음 덧셈을 진행해야 한다.
레지스터와 메인 메모리 사이에서 데이터를 전송할 수 있는 LOAD & STORE 명령어가 필요하다.
LOAD & STORE 명령어의 디자인
지금까지 디자인해 온 명령어들로 구성한다면 다음과 같다.
LOAD r1, 0x10 // 0x10번지에 저장된 데이터를 r1로 이동
LOAD r2, 0x20 // 0x20번지에 저장된 데이터를 r2로 이동
ADD r3, r1, r2 // r1, r2에 저장된 값을 더해서 r3에 결과 저장
STORE r3, 0x30 // r3에 저장된 값을 0x30번지에 저장
Direct 모드와 Indirect 모드
Direct 모드의 문제점과 Indirect 모드의 제안
- 하나의 명령어에 여러 정보를 담다 보니 표현하는 데이터 크기에 제한이 따른다는 문제점이 등장하였다.
- ex) LOAD 명령어의 메인 메모리의 주소값을 나타내는 source부분을 보면, 표현할 수 있는 값의 범위가 0x0000에서 0x00ff까지가 전부이기 때문에 문제가 발생한다. (Direct Addressing Mode)
- 기존의 방식으로는 메모리의 모든 영역에 대한 접근이 불가능하다.
- 이를 해결하기 위해 Indirect Addressing Mode가 등장했다.
Indirect 모드의 이해
Direct Addressing Mode : 명령어에서 지정하는 위치의 메모리를 참조하는 방식
Indirect Addressing Mode : 명령어에서 지정하는 위치에 저장된 값을 주소값으로 하여 메모리를 참조하는 방식
Indirect 모드는 Direct 모드가 지니는 한계를 극복하는 데 도움을 준다.
Indirect 모드 활용 예제
LOAD r1, 0x0010 // r1=10 (a)
MUL r0, 4, 4 // r0=16
MUL r2, 4, 4 // r2=16
MUL r3, r0, r2 // r3=256(=0x100)
STORE r3, 0x0030
LOAD r2, [0x0030] // r2=20 (b)
ADD r3, r1, r2 // r3=30 (a+b)
STORE r2, 0x0020
|
'BOX' 카테고리의 다른 글
[열혈C] 02. Part2 내용 정리 (포인터와 배열의 시작) (0) | 2018.04.19 |
---|---|
[열혈C] 01. Part1 내용 정리 (C 언어의 기본) (0) | 2018.04.19 |
[Book] 01. 컴퓨터 구조에 대한 첫 번째 이야기 (0) | 2018.03.08 |
추천사이트 #02 Java API 문서 사이트 (0) | 2018.01.10 |
[Hackerschool FTZ] level 17 - Function Pointer(2) (0) | 2018.01.09 |
블로그의 정보
jennysgap
jennysgap