차곡차곡 성 쌓기
article thumbnail

본 카테고리는 "혼자 공부하는 컴퓨터구조 + 운영체제 (강민철 저)" 책과 강의를 기반으로 작성하였습니다.


CPU 속도를 빠르게 하기 위해선  CPU가 쉬는 시간 없이 명령어를 처리하는 것이 매우 중요하다. 이를 쉽게 구현할 수 있는 방법이 바로 명령어 파이프 라인이다.

 

명령어 파이프 라인

하나의 명령어가 처리되는 과정을 비슷한 시간 간격으로 나누면 다음과 같이 4가지로 나눌 수 있다.

  1. 명령어 인출 (Instruction Fetch)
  2. 명령어 해석 (Instruction Decode)
  3. 명령어 실행 (Execute Instruction)
  4. 결과 저장 (Write Back)

CPU는 같은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행할 수 있다! 즉 병렬 처리가 가능하다.

파이프라인은 CPU의 처리 과정을 몇 단계로 나누어 각 단계를 병렬로 처리함으로써 전체 처리 속도를 향상시키는 기술이다. 각 파이프라인 단계는 서로 독립적으로 동작하기 때문에 병렬 처리가 가능하다. 

  1. 명령어 인출 (Instruction Fetch):
    • 명령어 인출은  프로그램 카운터(PC)가 가리키는 메모리 주소에서 명령어를 읽어오는 단계이다. 제어 유닛이 명령어를 가져오고, 명령어를 인스트럭션 레지스터(IR)에 저장한다.
  2. 명령어 해석 (Instruction Decode):
    • 명령어 해석은 IR에 저장된 명령어를 해독하는 단계이다. 제어 유닛명령어의 종류를 파악하고, 필요한 제어 신호를 생성하여 이후의 단계에 전달한다.
  3. 명령어 실행 (Execute Instruction):
    • 명령어 실행 단계에서는 ALU(산술 논리 장치)를 사용하여 명령어를 실행한다. 산술 연산, 논리 연산 등이 이 단계에서 수행된다.
  4. 결과 저장 (Write Back):
    • 명령어 실행에서 나온 결과는 레지스터나 메모리에 쓰여진다. 이를 "Write Back" 단계라고 한다. 

혼자 공부하는 컴퓨터 구조 + 운영체제 13강

 

김밥 공장처럼 생각을 하면 더 쉽다. 김에 펴진 밥이 컨테이너 벨트를 타고 이동한다. 직원 1앞에서 오면 직원 1이 단무지를 추가한다 (인출). 옆 칸으로 이동하다 직원 2앞에 오면 직원 2가 햄을 추가한다(해석). 이처럼 김밥을 무한정 생산하는 김밥 공장이 바로 컴퓨터라고 생각하면 되는 것이다. 김밥은 곧 명령어이고 추가 되는 재료들은 처리 과정이다. 

 

 

파이프라인 위험

명령어 파이프라인이 항상 이상적으로 실행될 수 있는 것이 아니다. 바로 동시에 명령어를 처리할 수 없는 경우이다.

크게 3가지 종류가 있다. 데이터 위험, 제어 위험, 구조적 위험이다.

 

▶︎ 데이터 위험

  •  명령어 간의 의존성 때문에 야기

    즉 명령어 2가 명령어 1의 결과를 가지고 처리해야 할 때 동시에 처리할 수 없다.

 

▶︎ 제어 위험

  • 프로그램 카운터의 갑작스러운 변화

   CPU가 실행하는 메모리 주소가 갑자기 점프, 인터럽트해서 흐름이 바뀌는 순간. 왜냐하면 일반적으로 명령들은 순차적으로 실행되기 때문에 갑자기 건너 뛰게 되면 이전의 작업들이 무의미 해진다.

 

▶︎ 구조적 위험

서로 다른 명령어가 같은 CPU 부품(ALU, 레지스터)를 쓰려고 할 때 발생

 

 

슈퍼 스칼라

CPU 내부에 여러 개의 명령어 파이프라인(스레드)을 포함한 구조

 

 즉 여러 개의 컨테이너 벨트가 있는 것이다. 이것의 개수를 하드웨어적 스레드라고 한다. 예를 들어 2코어 8스레드라면 한 코어 안에 4개의 컨테이너 벨트, 즉 4개의 명령어 파이프라인이 있는 것으로 한 코어에서 동시에 명령어 인출을 4번까지 할 수 있게 된다.

 

이론적으로 파이프라인 개수에 비례하여 처리 속도가 증가하나 BUT 이프 라인의 위험도의 증가로 인해 비례하여 증가하지 않는다.

 

 

 

비순차적 명령어 처리 (out-of-order execution, OoOE)

명령어들간 합법적인 새치기

파이프 라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 병렬 처리 기법이다.

 

혼자 공부하는 컴퓨터 구조 + 운영체제 13강

예를 들어 5개의 명령어가 있을 때 명령어 3이 명령어 1, 2의 연산 결과를 참조하는 연산이라면, 명령어 1, 2가 모두 처리될 때까지 기다릴 수 밖에 없다. 하지만 기다리게 되면 파이프 라인 중단이 일어난다. 이를 방지하고자 의존성이 없는 명령어의 순서를 바꿔 일찍 처리하도록 하는 것이다.

 

하지만 아무 명령어의 순서를 바꿀 수는 없고 의존성이 없는 명령어만 순서를 바꿀 수 있다. 즉 바껴도 실행 흐름에 영향이 없을 때 가능하다. 이는 CPU가 판단한다.

728x90
profile

차곡차곡 성 쌓기

@nagrang

포스팅이 좋았다면 "좋아요" 해주세요!