LISTORY

[윈도우즈 시스템 프로그래밍] 컴퓨터 구조의 접근방법(2) 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] 컴퓨터 구조의 접근방법(2)

LiStoryTeller 2018. 5. 19. 17:12


뇌를 자극하는 윈도우즈 시스템 프로그래밍 유투브 강의에 대한 정리이다.


저번 시간에 이어 컴퓨터 구조의 접근방법에 대해 정리해보겠다.


⊙ YouTube 강의 ⊙ ☞  컴퓨터 구조의 접근방법(2)



컴퓨터 구조의 접근 방법


저번 시간에 이어 레지스터 디자인을 계속해보겠다.


저번 시간에 우리는 레지스터는 16비트로 구성하고, 총 8개의 레지스터가 있도록 결정하였다.


그러므로 명령어의 크기는 16비트가 되어야한다.


(CPU로 명령어를 Fetch 할 때 하나의 명령어가 하나의 레지스터에 저장 가능하기 때문)


그럼 명령어는 어떻게 구성되어야 할까?


사실 명령어는 일을 시키기 위한 기본정보가 다 담겨있어야 하므로 복잡하게 구성되어 있다.


아래의 그림과 같이 16비트의 명령어 안에 어떠한 연산을 할 것이고, 결과는 어디 저장을 할것이며, 연산의 피연산자는 무엇인가에 대한 정보가 담겨있어야 한다.


앞의 2비트는 나중에 설명하겠다.




이렇게 명령어 구성을 디자인 하는 것은 CPU 디자인에 참여하는 프로그래머 역할이다.


명령어가 어떠한 일을 하라고 하는지를 구분하는 장치가 명령어를 해독하는 ALU이다.


즉, 프로그래머가 명령어를 디자인해야 ALU를 디자인 할 수 있다.


명령어가 어떤 것이냐에 따라 명령어의 내부 구조는 바뀔 수 있다.


위의 조합은 사칙연산에 대한 명령어 구조이다.


사칙연산에 대한 정의는 다음과 같이 하겠다.



저장소는 레지스터만 오도록 제한을 두겠다. 이는 보통 그렇다.


3비트면 8개의 레지스터를 모두 표현할 수 있기 때문에 저장소는 3비트로 하였다.


피연산자에는 레지스터와 숫자 둘 다 올 수 있도록 하겠다.


근데 여기에 문제가 있다.


우리가 피연산자1에 숫자 1, 즉 0001을 넣고 싶다.


그렇다면 이것이 레지스터 0001인지, 숫자 0001인지 어떻게 구분할 수 있을까?


보통 이를 구분하기 위해 앞에 하나의 비트를 약속을 위한 비트로 사용한다.


네 개의 비트 중 맨 앞을 레지스터인지, 숫자인지 구분하는 비트로 사용하는 것이다. 


이렇게 명령어가 허용하는 범위가 넓어진다면 그만큼 손해를 볼 수 밖에 없다.


0을 레지스터, 1을 숫자로 약속한다면 다음과 같이 해석할 수 있다.


0001 : 레지스터 001

1001 : 숫자 001


그런데 여기에 또 문제가 있다.


4개의 비트로 숫자를 표현하는 것도 부족한데 3개의 비트로 숫자를 표현하는 것은 지나치게 적다.


숫자 0~7까지밖에 표현할 수밖에 없기 때문이다.


이 부분은 나중 강의에서 다루도록 하겠다.



⊙ CISC & RISC


명령어는 단순하게 할 필요가 있다.


명령어 구조가 단순한 cpu 구조를 RISC라고 한다. 상대되는 개념으로는 CISC가 있다.


C는 Complex라는 뜻이다.  즉 명령어가 복잡하다는 것이다.


명령어가 복잡하다는 것은 다양한 형태로 명령어를 조합할 수 있다는 것이다. 


R은 Reduce라는 뜻이다. CISC에서 명령어가 굉장히 복잡하게 많이 있는데, 이를 대부분 쓰지 않으므로 명령어를 간소화 시키겠다는 것이다.


물론 이건 제한사항이 많이 붙는다.


CISC는 프로그램 하기 편하다. 명령어 조합을 다양하게 할 수 있기 때문이다.


반면에 RISC는 명령어 조합이 다양하지 못하다. 명령어 자체가 단순하기 때문이다.


그래서 CISC로 한줄이면 처리하는 것을 RISC는 수십줄로 표현해야 할 수도 있다.


하지만 오늘날의 대부분의 CPU는 RISC이다. 속도를 향상시키기 위해 CISC는 지극히 제한적이기 때문이다.


반면에 RISC는 고성능의 CPU에 적합하다.


명령어 하나가 처리 되는 과정은 Fetch -> Decode -> Execution이다. 각각의 단위는 하나의 클럭에 처리된다.


RISC에서 각각의 단계는 한 클럭에 처리되므로 하나의 명령어를 처리하는데 필요한 클럭은 3클럭이다.


명령어 5개를 처리하는데는 최소 15클럭이 필요하다.


Fetch는 메모리에서 CPU로 명령어를 가져오는 것이고, Decode는 컨트롤 유닛이, Execution은 ALU에서 실행된다.


즉, 각각 별도의 로직에서 진행되므로 동시에 실행되어도 아무런 문제가 되지 않는다. 즉, 파이프라인 사용 가능하다.


RISC는 명령어가 간단해서 한 클럭에 하나의 단계를 실행 성공할 수 있지만 CISC는 명령어가 복잡하므로  어떤 명령어는 7클럭, 어떤 명령어는 5클럭등 하나의 단계에서 여러 클럭을 사용할 수 있다.


이러한 경우에는 명령어를 처리하는 과정을 단순화 시키지 못한다.


즉, 속도가 CISC에 비해 굉장히 빨라지는 것이다. 


CISC도 파이프라인을 사용할 수 있지만 각각의 단계가 다른 클럭을 사용하므로 RISC에 비해 느리다.










Comments