1) CISC(Complex Instruction Set Computer)
CISC (Complex Instruction Set Computer)은 복잡한 명령어 세트를 갖는 CPU 아키텍쳐이다. CISC는 어드레싱 모드와 명령어 유형이 다양하여 메모리 가격과 접근시간을 더 좋게 하였으며, 간결한 명령 코드를 갖고 있다. CISC의 가장 중요한 특징은, 각각의 명령어가 더 많은 것을 수행하도록 ISA를 설계한 점이다. 결과적으로, CISC 컴퓨터는 다양한 어드레싱 모드를 지닌다. 더 나아가 CISC 컴퓨터는 다양한 명령어와 함께 오퍼랜드의 위치와 개수를 ‘마음대로’ 가질 수 있다. 결과적으로 명령어 길이와 실행시간이 매우 가변적이다.
CISC가 등장한 초창기에 같은 프로그램 크기에서 더 많은 연산이 이뤄지게 하는 것으로 인해 사용자들로부터 환영을 받기 시작했다. 그 당시에는 저장장치가 고가였기 때문에 적은용량을 소비해 많은 일을 처리하는 것은 사용자들에게 매우 고마운 일이었다. 컴퓨터가 계속 발전함에 따라, 컴퓨터 제조업체들은 간단한 모델에서부터 더 빠르고 성능이 좋은 모델을 공급하였고, 추가된 기능과 향상된 호환성은 컴퓨터를 더욱더 복잡하게 만들어갔다. 게다가 컴퓨터 설계자들은 컴퓨터 명령어와 고급 언어 구조 사이에 존재하는 ‘의미적인 차이’를 알아야 했다. 복잡한 명령과 어드레싱 모드로 이 차이를 줄여서 성능향상을 얻으려 노력했고 잘 될 거라고 믿었다. 컴파일러 작성자들은 이에 대해 비판했다. 왜냐하면, 언어의 요구사항을 맞추기 힘들 뿐만 아니라 그것은 제한된 유용성을 갖기 때문이었다. 한 연구에 의해 프로그램 문장의 85%가 할당문, 조건문, 호출문으로 구성되어 있음을 밝혀냈고, 할당문 80%가 산술이 없는 MOVE란 것도 알려졌다. 복잡한 명령어와 어드레싱 모드는 명령어당 수행하는 마이크로 동작이 많아서 더 빠른 클럭 속도로 동작하는 것을 어렵게 한다는 것으로 결론 내려졌다.
최근에는 계속된 메모리 가격의 하락으로 명령어가 ‘많은 일을 수행’해야 되는 문제는 어느 정도 해소되었고 메모리 지연시간을 줄이기 위한 방법이 요구되고 있다. 소규모의 고속 캐시 사용으로 어느 정도 지연시간을 단축시키기도 하였다.
2) CISC -> RISC
컴퓨터 설계자들은 명령어를 중첩하여 실행함으로써 실행 속도를 높이고자 하였다. 가장 일반적인 방법은 명령어 선인출, 파이프라이닝, 슈퍼스칼라 동작이다.
명령어를 실행 할 때 우선 한 명령어를 인출하고 실행한 후 다음 명령어를 인출하고 실행하는 과정을 거친다. 하지만 현재의 컴퓨터들은 대체로 이 과정을 중첩 시킨다. 명령어 선인출이란 현재 명령을 끝내기 전에 다음 명령어를 미리 인출하여 명령어 큐에 넣는 것을 말한다. 이렇게 하면 상당한 이득을 얻을 수 있다. 명령어 선인출은 파이프라이닝의 초기 형태라고 볼 수 있다. 파이프라이닝을 단순히 현재 명령어가 끝나기 전에 다음 명령어를 읽어 들이는 것으로 간주하면 초창기의 컴퓨터들도 파이프라이닝을 이용했다고 볼 수 있다. 현재 우리가 사용하고 있는 컴퓨터들은 많은 수의 명령을 중첩 실행하고 있다. 슈퍼스칼라 동작은 프로세서가 동시에 둘 이상의 명령어를 수행하는 것을 말한다. 슈퍼스칼라 동작을 최대한으로 사용한다면 간혹 명령어들의 실행 순서가 바뀌기도 한다. 왜냐하면 두 개의 명령어를 동시에 실행하면 짧은 명령어가 먼저 끝나기 때문이다.
CISC 컴퓨터 설계자들도 선인출, 파이프라이닝, 그리고 슈퍼스칼라 동작을 설계에 반영하긴 하나 길고 복잡한 명령어, 오퍼랜드의 참조가 복잡한 주소계산들로 인해 속도향상에 효과적으로는 사용하지는 못하는 상태다. 게다가 복잡한 명령어와 주소계산은 간단한 명령어에 비해 클럭 속도를 저하시킨다. RISC는 CISC 컴퓨터 시대에 고안한 캐싱과 선인출, 파이프라이닝 그리고 슈퍼스칼라 방법을 효과적으로 적용하기위해 설계된 컴퓨터이다.
3) RISC(Reduced Instruction Set Computer)
RISC(reduced instruction set computer)는 마이크로프로세서를 설계하는 방법 중의 하나로, CPU의 명령어 개수를 줄여, 하드웨어 구조를 좀 더 간단하게 만드는 방식을 사용한다. 실제로 RISC설계자들이 캐싱, 파이프라이닝, 슈퍼스칼라 등을 이용하기 위해 채택한 방법은 여러 가지가 있는데 RISC 설계에서는 이 모든 방법들이 다 사용되는 것은 아니다.
RISC설계에서 가장 중요한 것은 주기당 하나의 명령어가 실행되게 하는 것이다. 파이프라이닝의 사용이 일반화되기 때문에 클럭 주기당 적어도 하나의 명령어가 발송되어야 한다. 프로그램 실행시간은 작업처리량에 의존할 뿐 개별적 명령어 실행시간에 의존되는 것이 아니므로 주기당 평균 1개의 비율로 명령어를 발송해야한다.
클럭 주기당 하나의 명령어가 발송된다면, RISC 설계자는 모든 명령어의 길이를 고정된 길이, 일반적으로 1Word로 제한 할 것이다. 이 Word에 명령어에 대한 모든 것을 지정하게 된다. (오퍼랜드가 있다면 오퍼랜드를 가져오는 곳, 결과가 있다면 결과를 저장하는 곳, 그리고 다음 명령어를 가져오는 곳)
32비트 워드가 보편적으로 사용됨에 따라 오퍼랜드를 가져오는 시간이 길어지므로 RISC설계는 실행될 모든 오퍼랜드가 레지스터에 있을 것을 요구한다. 메모리에 있는 오퍼랜드를 가져오는 것은 적재와 저장이라는 두 개의 동작만으로 제한된다. 이는 프로세서의 동작을 오퍼랜드의 참조와 실행이라는 두 가지로 확실하게 구분하고, 프로세서와 메모리 사이의 트래픽을 최소화 하며, 필요로 하는 모든 오퍼랜드가 레지스터에 있다는 것을 입증해 준다. 결국 오퍼랜드가 비어서 생기는 파이프라인의 지연을 최소화 한다.
RISC 컴퓨터는 일반적으로 레지스터 간접 방식과 인덱스 방식으로 어드레싱 모드를 갖는다. 여기서 인덱스는 레지스터에 있거나 아니면 명령어 내에 있는 즉치 상수 이다. 단 두 개의 간략한 어드레싱 모드를 갖기 때문에 주소계산이 용이하고 따라서 클럭 지속 시간이 짧아져 속도향상을 거둘 수 있다.
RISC는 CISC에서 가지는 복잡한 명령어를 지니지 않는다. 따라서 주어진 클럭 주기에서 수행해야하는 것이 더 적다. 이는 더 짧은 클럭 주기를 가짐을 의미한다. 복잡한 명령어들을 더 간단한 여러 개의 명령어들로 나누는 것이다. 캐시가 이 명령어들의 수행을 유지만 해 준다면 RAM의 사용이 증가되는 단점 밖에는 없다.
RISC 구조에서는 적재 및 저장 그리고 분기 명령을 실행하는데 하나 이상의 클럭 주기가 사용되기도 한다. 적재와 저장의 경우, 메모리 참조에 시간이 걸리기 때문에 지연이 발생하고, 분기 명령은 주소에 있는 명령어를 가져오는데 지연이 발생된다. 따라서 이 명령어들은 하나이상의 클럭 주기가 필요하게 된다. 이 명령어들이 끝날 동안 프로세서로 하여금 적재 또는 분기 명령어 다음에 있는 명령어, 다시 말해서 독립적인 명령어를 지연시킨 명령어 다음에 먼저 실행해서 효과적으로 처리한다.
오퍼랜드 또는 분기명령을 미리 인출해 둠으로써 접근을 위한 별도의 실행시간을 절약 할 수 있다. 분기 목표주소를 가지고 있고, 병렬로 여러 명령어를 동시에 실행할 수 있는 몇 개의 기능 장치를 가지고 있다면, 어떤 프로세서들은 분기 조건이 만족되었는지의 여부를 알기도 전에 목표주소에서 실행을 시작한다. 그런 후, 만약 조건이 만족되지 않았다면 미리 실행한 결과를 버린다. 이것을 예측 실행이라 한다.
RISC는 떠 짧고 더 적은 수의 명령어를 가지고 있으며 명령어가 하는 일도 더 적다. 하나의 복잡한 명령어를 찢어서 더 간단한 여러 명령어로 만들면, 명령어들 사이에는 더 많은 의존성이 생긴다. 컴퓨터 자원을 최대한 이용하기 위해선 가능한 때에 언제든지 명령어가 순서를 벗어나 실행될 수 있도록 해야 한다. 주어진 프로그램의 올바른지에 대한 여부뿐만 아니라, 프로그램이 실행될 특정 컴퓨터의 파이프라이닝 및 순서와 다른 실행, 지연된 실행에 대해서도 최적화 되었는지에 대해도 고려해야 된다. 이 때문에 RISC의 컴파일러들은 주의 깊게 만들어져 있다.
4) CISC와 RISC 비교
CISC | RISC |
하드웨어가 강조됨 | 소프트웨어가 강조됨 |
여러 클럭의 복합 명령어를 포함 | 오직 단일 클럭의 축양명령어만 포함 |
Memory to Memory : 'LOAD', 'STORE'가 각 명령어들 안에서 수행됨 | Register to Register : 'LOAD', 'STORE'를 독립적인 명령으로 사용함 |
작은 코드 크기, 단위시간동안 높은 사이클 | 단위시간동안 낮은 사이클 수, 큰 코드 크기 |
축약명령어 저장을 위해 트랜지스터가 사용됨 | 메모리 레지스터에 보다 많은 트랜지스터가 사용됨 |
5) CISC + RISC (Post-RISC)
80년대 초반 RISC 칩이 소개된 이후로 프로세서 기술은 두드러진 발전을 보여 왔고 여러 가지 향상된 기술들이 RISC와 CISC프로세서에 도입됨으로써 둘 간의 경계는 흐려지고 있다. 사실 두 아키텍쳐들은 거의 서로의 장점들을 수용하고 있는 듯하다. 프로세서의 성능이 향상됨에 따라 CISC 칩들은 이제 하나의 클럭 안에 1개 이상의 명령어를 실행할 수 있게 되었고 이것은 CISC 칩이 파이프라이닝을 이용할 수 있음을 말한다. 또한 다른 기술적인 향상과 함께 칩 안에 보다 많은 트랜지스터를 넣을 수 있게 되었고 이로인해 RISC프로세서가 CISC와 같은 복잡한 명령들을 제공할 수 있게 되었다. 또한 “수퍼스칼라 실행”과 같은 여분의 실행 단위를 이용할 수 있는 복잡한 하드웨어를 사용할 수 있는 환경이 되었다. 이러한 모든 요인들은 몇몇 그룹에서 논의하고 있는 "Post-RISC” 시대를 보여주는 것들이다.
그러나 RISC칩이 여전히 몇 가지 장점들은 그대로 유지하고 있으며, RISC는 엄격한 단일형식의 싱글 사이클 명령을 이용한다. 또, Register-to-Register, Load/Strore 아키텍쳐를 유지한다. 확장된 명령어 셋에도 불구하고 RISC칩은 여전히 많은 수의 범용 레지스터들을 가지고 있다.
'Study' 카테고리의 다른 글
20120711_1차원 배열과 포인터 (0) | 2012.11.20 |
---|---|
20120630_Java 스터디 1일차 (0) | 2012.11.20 |
20110906_리스트뷰를 내맘대로!!(이미지+텍스트) (0) | 2012.11.20 |
20110905_안드로인드 DB연계 (0) | 2012.11.20 |
20110902_나의 안드로이드 첫 작품!! (0) | 2012.11.20 |