본문 바로가기

Layer7

Layer7 - 하드웨어 2차시 과제

 

CPU구조, 동작 과정

 

 CPU는 주기억장치에서 데이터를 가져와서 실행, 연산, 해석하는 역할을 합니다. 컴퓨터에서는 없어선 안될 핵심적인 부품입니다.

 

CPU는 연산장치, 제어장치, 레지스터라는 3개의 장치로 이루어져 있습니다.

 

연산장치는 산술 연산과 논리 연산을 담당합니다. 제어 장치에서 발생한 제어 신호에 따라서 연산을 수행합니다.

연산 장치는 보수기, 가산기, 누산기, 데이터 레지스터, 오버플로우 검출기, 상태 레지스터로 구성되어 있습니다.

 

제어장치는 주기억장치에서 데이터를 인출하고 해독하고 실행합니다. 그리고 다시 주기억장치로 되돌려줍니다. rip레지스터가 가리키고 있는 instruction을 실행하는 장치라고 생각하면 편합니다.

 

레지스터는 CPU가 접근할 수 있는 메모리중에 가장 빠르고 용량이 매우 작습니다. 레지스터에는 연산에 필요한 데이터, 연산 결과 등 일반적인 데이터를 저장하는 범용 레지스터와 명령어의 주소를 저장하는 등 특수한 데이터를 저장하는 특수 목적 레지스터가 있습니다.

 

CPU의 동작 과정은 인출(Fetch), 해석(Decode), 연산(Execute), 결과 저장(Write-Back)의 과정을 거칩니다. 주기억 장치에서 명령어를 가져와서 해석하고 연산하고 결과를 저장하는 과정은 생각해보면 당연한 과정입니다. 이러한 과정을 명령어 사이클(Instruction Cycle)이라고 부릅니다.

 

 

ISA

 

ISA는 Instruction set architecture의 약자입니다. 한글로 해석하면 명령어 집합 구조입니다. 마이크로프로세서가 인식해서 기능을 이해하고 실행할 수 있는 기계어 명령어를 말합니다. Software에서 Hardware로 넘어가는 중재자 역할을 해줍니다.

 

 

한마디로 그냥 기계어의 집합이라고 이해했습니다. ISA에는 RISC와 CISC이렇게 2가지 아키텍처가 있습니다. RISC는 클록 주기당 하나의 명령어를 실행하고  CISC는 명령어를 완료하는데 여러 클럭 사이클이 걸린다는 차이점이 있습니다.

 

 

Pipelining

 

데이터를 Decode하는 동안 다음 데이터를 Fetch하고 Decode하던 데이터가 Execute로 넘어갈때 Fetch한 데이터를 Decode하고 또 새로운 명령어를 Fetch하고.. 이런 식으로 한 단계를 서로 동시에 병렬적으로 수행하는 기술입니다. 기존의 Fetch -> Decode -> Execute -> Fetch -> Decode -> Execute로 하나씩 순차적으로 실행되는 구조는 한 명령어가 Decode되는 과정에서 하나의 장치밖에 사용하지 않습니다. 따라서 이러한 비효율적인 방식을 효율적으로 바꾸고자 고안된 기술이 Pipelining이고 아래의 사진과 같이 병렬적으로 처리함으로써 모든 장치가 놀지 않고 효율적으로 사용될 수 있게끔 해줍니다.

 

 

한번에 하나의 장치만을 사용하던 기존의 방식보다 훨씬 효율적이고 빠르게 데이터를 처리할 수 있습니다.

하지만 단점도 존재합니다.

 

단점은 Data Hazard라고 불리는 논리적인 문제가 발생할 수 있습니다. 예를 들어서

 

mov rax, 0x3b
push rax

 

위와 같이 앞 명령어의 결과값이 필요한 명령어가 있다고 가정해보면 mov rax, 0x3b 명령어가 Execute되는 과정에서 push rax는 Decode됩니다. 하지만 push rax는 Decode과정에서 앞 명령어의 결과값이 필요한데 앞 명령어는 Execute되고 있으므로 논리적으로 실행이 불가능해집니다.

 

Control Hazard라는 문제도 발생합니다. 앞 분기문의 결과를 알지 못할 경우 지연이 발생하는 문제입니다.

 

 

Out-of-order execution

 

찬우님 블로그 보고 다른 글 보다가 조금 다른 내용이 있어서 혼동이 와서 비워둡니다. 찬우님께 물어보니까 이따 동아리 시간에 다 같이 찾아서 채우자고 하십니다. 비순차적 실행을 하지 않았을때와 결과가 같은 경우 앞 명령어의 결과와 상관없는 뒤의 명령어들을 동시에 같이 처리해서 속도를 높이는 기술이라는건 이해했습니다.

 

 

Branch prediction

 

Control Hazard문제를 해결하기 위해서 고안된 기술입니다. 분기문의 참 거짓 여부를 검사하는 동안 파이프라인이 대기하게 되는 지연을 방지하기 위해서 참 거짓 여부를 검사하는 도중에 미리 분기 결과를 예측해서 해당하는 명령을 실행시킵니다. 결과가 맞을 경우 파이프라인 낭비 없이 다음 명령어가 계속 수행되고 예측 결과가 틀리더라도 미리 실행되던 명령이 파이프라인에서 전부 취소되면서 올바른 명령어가 실행되게 됩니다.

 

 

Speculation execution

 

명령어 실행에 필요한 데이터가 아직 없어서 지연될때 사용되는 기술입니다. 말그대로 미리 결과를 추측해서 실행해 놓는 것입니다. 맞을 경우에는 그대로 이어서 실행하고 틀릴 경우에는 전부 취소시키는 방식으로 Branch prediction과 동일하게 동작합니다. Branch prediction도 Speculation execution의 한 종류라고 볼 수 있습니다.