CPU는 사람의 두뇌라고 볼 수 있다. 모든 컴퓨터 장비들을 통제하고 실질적으로 모든 작업에 대해서 main으로 처리하는 장비이다

 

매우 좋은 자료 : https://www.youtube.com/watch?v=Fg00LN30Ezg 

 

CPU가 처리하는 작업으로는 대표적으로 4가지가 있다 

Fetch, Decode, Execute, Writeback 

  • Fetch 
    1. PC(Program Counter)에 저장되어있는 주소를 MAR(Memory Address Register)에 복사한다 
    2. MAR에 저장되어있는 주소를 address bus*에 배치시킨다 
    3. 제어장치가 read signal을 발생시키기 위해 control bus에 read state를 배치시킨다 
    4. address bus에 있는 주소를 참조하여 메모리에서 해당 주소에 해당하는 값을 읽어 Data bus(Buffer bus)에 배치시킨다 
    5. Data bus에 배치되어있는 명령 또는 데이터를 MDR(Memory Data(Buffer) Register)에 불러들인다 
    6. MDR의 명령어가 IR(Instruction Register)에 복사된다 
    7. Program Counter에 메모리 주소가 다음 주소로 증가한다 ( CPU의 처리 단위 bit에 따라 주소 증가 값이 다름*)
  • Decodes
    1. CU(Control Unit)이 IR에 저장된 명령어를 decodes 한다 - CPU 제조사에 따라 opcode가 다를 수 있음
      명령어 : 00000001 -> opcode 리스트를 확인하여 -> 저장명령어구나 ! 한다. 
  • Execute 
    1. 해석된 명령어에 따라 데이터에 대한 명령을 수행한다 
  • Writeback
    • 처리가 완료된 캐시에 있는 데이터를 메모리에 기록한다. 결과값을 기다리는 명령어가 있다면 결괏값이 생겼다 알려준다

*address bus - 일정한 메모리 번지를 찾을 때 사용되는 신호를 운반하는 컴퓨터 내의 배선 버스 

*CPU의 처리단위 bit에 따라 주소 증가값 : RAM에 주소 하나에는 8bit씩 저장되어 OS 64bit process의 경우 8씩 증가한다
(64bit = 8bit의 묶음 8개) 

 

위의 CPU의 4가지 작업은 간단한 순차적 처리의 경우의 단순한 예시이다. 

만약 특정 메모리 주소의 데이터를 참조해야하는 명령어가 진행 중인데 특정 메모리 주소의 값이 아직 처리되기 전이라면 가만히 기다릴 것인가? 

  • Out-of-Order Execution OoOE - 비순차적 명령어 처리
    1. 만약 어떤 결과값을 받아야 다음이 실행되어야 하는 명령어가 있을 때 결괏값을 받을 때까지 계속 대기한다면 Idle time이 길어지게 된다
    2. 이때 현재까지 진행하던 명령어 처리를 잠시 뒤로하고 다음 명령어를 실행하면 Idle time을 줄일 수 있다
    3. 그러면 이전 명령어는 어떻게 다시 불러올까? 
    4. 이전 명령어의 진행단계를 특정 저장장소에 저장해놓자 
    5. 그렇게 하기위해서는 일정 명령어들끼리 미리 의존성(이전 결괏값을 기다려야 하는 명령어가 있는가?)을 조사하여 의존성이 해결된 명령어들을 먼저 실행하자! 
    6. 그렇기 위해서는 위에서 설명한 Decode 단계를 Issue, read-operand 2단계로 나눈다. 바로실행할 수 없는 명령어는 대기상태(stall)로 변경된다 
      • issue - 다음 명령어가 실행가능한지 검증한다 
      • read-operand - 실행가능한 명령어의 opcode를 불러온다 
    7. 비순차적 명령어 처리로 인해 발생할 수 있는 문제 
      1. WAR - Write after Read - 변경된 값을 읽어옴
      2. WAW - Write after Write - 변경하고 또 변경함 
      3. 아래 SMT를 설명할 때 추가설명

* 분기 예측 (Branch Prediction): 특정 조건에 맞는 상황에 다음에 실행할 명령어의 주소를 예측한다

* 추측 실행 (Speculative Execution): 어떤 명령어가 특정 단계에서 필요한 정보가 없어 진행이 막혔을 때 필요한 정보를 예측해서 높은 확률로 맞춘다면 틀렸을 때의 다소 큰 손해를 넘어서는 큰 이익을 취할 수 있다. 

 

비순차적 명령어 처리에서 이전 명령어의 진행단계는 어디에 어떻게 저장하나? 

기존 CPU의 명령 cycle이 4단계에서 8단계로 세분화된다

  • Rename 
    1. 실제 프로그래머가 보는 레지스터 주소는 0x0001 이런 논리적 주소(Architecture Register file )이다 이를 프로그래머가 실제로 보지 못하는 물리 레지스터 파일(Physical Register File )과 메핑 한다 이러한 메핑에 대한 정보는 RAT(Register Alias table)에 저장된다 

Renaming 출처 : https://en.wikipedia.org/wiki/Register_renaming

 

  • Dispatch
    • 명령어가 실행하기 위해 대기하는 대기열 - 순서를 기다리는 Reservation Station : ROB(Reorder Buffer)
  • Issue
    • 대기열에 있는 명령어가 실행될 수 있는지 검증하고 실행하기 위한 장치 
  • Commit 
    • 명령어를 수행하며 사용한 자원을 반환

 

그럼 또 생각나는 것은 브라우저를 이용하면서 카카오톡도 쓰고 싶다. 

초창기에는 하나의 작업을 빨리 끝내고 다음 작업을 시작하자!라고 생각하여 CPU의 성능(clock, 면적)을 올리는 것에 집중했다. 하지만 한계에 다 달았고 그로 인해 Dual, Octa core 등의 다수의 core를 장착한 CPU가 사용되어 보편화되기 시작한다

다음 장에서는 멀티태스킹의 발전에 대해서 설명하기 위해 Multi-process, Multi-Threading에 대해서 설명하겠다

 

 

 

 

 

 

 

 

+ Recent posts