---
title: "파이프라인 해저드: 명령을 겹칠 때 생기는 세 가지 충돌"
author: "Lee"
published_at: "2026-10-01T22:37:02.250Z"
updated_at: "2026-09-30T09:48:43.923Z"
tags: ["컴퓨터공학","컴퓨터구조"]
canonical_url: "https://ariser.io/@writer_a1cd615ab19e/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%ED%95%B4%EC%A0%80%EB%93%9C-%EB%AA%85%EB%A0%B9%EC%9D%84-%EA%B2%B9%EC%B9%A0-%EB%95%8C-%EC%83%9D%EA%B8%B0%EB%8A%94-%EC%84%B8-%EA%B0%80%EC%A7%80-%EC%B6%A9%EB%8F%8C"
ai_assisted: false
---

# 파이프라인 해저드: 명령을 겹칠 때 생기는 세 가지 충돌

[원문](https://ariser.io/@writer_a1cd615ab19e/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%ED%95%B4%EC%A0%80%EB%93%9C-%EB%AA%85%EB%A0%B9%EC%9D%84-%EA%B2%B9%EC%B9%A0-%EB%95%8C-%EC%83%9D%EA%B8%B0%EB%8A%94-%EC%84%B8-%EA%B0%80%EC%A7%80-%EC%B6%A9%EB%8F%8C)

명령들의 실행 단계를 겹치면 언제나 매 사이클 유용한 결과를 만들 수 있을까. 그렇지 않다. 자원이 부족하거나 앞 결과가 아직 준비되지 않았거나 다음 실행 위치를 모르면 진행을 조절해야 한다. 파이프라인 해저드는 이런 이유로 원래 계획한 단계 겹침을 그대로 유지할 수 없는 상황이다. 구조적, 데이터, 제어 해저드로 나누면 필요한 해결 방식이 보인다.

![메모리 포트 경쟁, 앞 결과의 포워딩, 잘못된 분기 경로 폐기를 나란히 보여 주는 그림](/api/v1/media/83bb0920-664f-4777-931a-40ee50a13d42)

*자원·값·실행 경로의 충돌은 서로 다른 해결 장치를 요구한다.*

## 같은 자원을 동시에 원한다

구조적 해저드는 두 단계가 같은 하드웨어 자원을 동시에 필요로 할 때 생긴다. 설명용 CPU에서 명령 인출과 데이터 읽기가 단일 메모리 포트 하나를 사용한다면 같은 사이클에 둘을 수행하지 못할 수 있다. 한쪽을 기다리게 하거나, 자원을 복제하거나, 여러 접근을 허용하는 구조가 필요하다. 구조 선택은 면적·전력·성능 비용을 함께 바꾼다.

데이터 해저드는 명령 사이의 값 의존과 실행 시점 때문에 생긴다. A가 r1을 계산하고 B가 r1을 읽는다면 B는 A의 새 값을 사용해야 한다. 이전 값을 읽으면 프로그램 의미가 달라진다. 단순히 같은 레지스터 이름이 보인다는 사실과 실제 값 의존성은 구분해야 하며, 비순차 실행에서는 이름 재사용 때문에 생기는 추가 문제도 다룬다.

## 기다리지 않고 결과를 전달한다

포워딩은 결과가 레지스터에 최종 기록되기 전에, 필요한 다음 단계로 직접 전달하는 경로다. 앞 덧셈의 결과가 준비됐다면 다음 덧셈이 이를 받을 수 있다. 그러나 모든 의존을 없애지는 못한다. 앞 명령이 메모리에서 값을 읽는 로드이고 다음 명령이 즉시 그 값을 필요로 하면, 단순한 5단계 모델에서는 값이 준비되기까지 한 번 기다려야 할 수 있다.

`LOAD r1, [p]` 뒤에 `ADD r2, r1, r3`가 오는 경우를 보자. ADD의 계산 단계에 도착할 때 LOAD의 데이터가 아직 준비되지 않았다면 스톨이 필요하다. 기다린 뒤 올바른 값이 전달돼야 한다. [MIT의 데이터 해저드 수업](https://ocw.mit.edu/courses/6-004-computation-structures-spring-2017/pages/c15/c15s2/c15s2v3/)은 이런 의존과 전달 경로를 다룬다. 정확한 지연은 파이프라인 구조에 따라 달라진다.

## 다음 명령 주소가 불확실하다

제어 해저드는 분기나 점프 때문에 다음 실행 경로가 아직 확정되지 않을 때 나타난다. 결정을 기다리거나, 경로를 예측해 진행할 수 있다. 예측이 틀리면 잘못된 경로의 작업을 버리고 올바른 곳에서 다시 시작한다. 이때 버리는 플러시와 잠시 진행을 멈추는 스톨은 다른 동작이다.

해저드 처리에서 가장 중요한 조건은 정확성이다. 결과가 준비되지 않았는데 성능을 위해 읽는다면 잘못된 값으로 계산한다. 잘못된 경로의 결과를 그대로 최종 상태에 반영해도 의미가 깨진다. CPU의 제어 장치는 언제 기다리고 무엇을 전달하고 어떤 결과를 폐기할지 명령 의존과 실행 상태를 따라 판단해야 한다.

컴파일러와 개발자도 독립적인 연산을 적절히 배치해 대기 사이에 다른 일을 수행하게 도울 수 있다. 하지만 소스 순서를 임의로 바꿔도 된다는 뜻은 아니며, 값 의존성과 관찰 가능한 부수 효과를 보존해야 한다. 해저드는 파이프라인의 실패라기보다, 겹친 실행에서도 프로그램의 순서 의미를 유지하려고 처리해야 하는 제약이다.

### 참고 자료

- [MIT OCW — Data Hazards](https://ocw.mit.edu/courses/6-004-computation-structures-spring-2017/pages/c15/c15s2/c15s2v3/)
