로그인 입점하기
← 가이드 목록
시작하기

Out-of-Order Execution이란? CPU가 명령어를 순서대로만 실행하지 않는 이유 쉽게 이해하기

Out-of-Order Execution은 CPU가 의존하지 않는 명령어를 먼저 처리해 대기 시간을 줄이는 기술입니다. Commit·ILP·Branch Prediction·Cache Miss까지 초보 기준으로 정리합니다.

Out-of-Order Execution이란? CPU가 명령어를 순서대로만 실행하지 않는 이유 쉽게 이해하기

프로그램은 위에서 아래로 쓰이지만, 현대 CPU는 A가 메모리를 기다리는 동안 A와 무관한 B·C를 먼저 돌릴 수 있습니다. 이처럼 프로그램에 적힌 순서를 무조건 기다리지 않고, 의존하지 않는 명령어 중 실행 가능한 작업을 앞서 처리하는 기술Out-of-Order Execution(아웃 오브 오더 익스큐션, 비순차 실행)이라고 합니다.

스테이크가 익는 동안
샐러드·음료를 먼저 준비한다

실행은 비순차 · 결과는 순차

내부 계산 순서가 B→C→A여도, 프로그램이 관찰하는 결과는 원래 A→B→C처럼 보여야 합니다. 계산은 먼저 해도 최종 반영은 순서를 지키는 과정을 Retirement / Commit으로 설명합니다. 예외가 났을 때도 「순서대로 실행한 상태」처럼 보이게 하는 것이 Precise Exception 관점입니다.

A 메모리 대기 중 C·D를 먼저 실행한 뒤 순서대로 Commit
실행은 앞당기고, Commit은 프로그램 순서를 유지한다

Dependency · ILP · Latency Hiding

B가 A가 만든 값을 쓰면 B를 먼저 돌릴 수 없습니다 — Data Dependency(RAW 등). 독립 작업만 재배치합니다. Core 안에서 명령을 겹쳐 처리하는 것이 ILP이고, OoO는 ILP를 높이는 대표 기술입니다. Cache Miss로 메모리를 기다리는 동안 다른 계산을 돌리면 대기 일부를 숨깁니다(Latency Hiding). Miss 비용이 사라지지는 않고, A→B→C처럼 긴 Dependency Chain이면 먼저 할 일이 없습니다.

ROB · Renaming · Speculative

Reorder Buffer는 먼저 끝난 결과를 잠시 보관했다가 원래 순서로 Commit합니다. Register Renaming은 같은 논리 레지스터 이름 때문에 생기는 가짜 의존성을 줄입니다. Branch Prediction으로 고른 경로도 OoO로 돌릴 수 있고, 틀리면 Commit 전 작업을 버립니다. Speculative Execution은 「실행할지 아직 미확정」인 경로까지 미리 돌리는 축이고, OoO는 「반드시 실행할 명령」 중 가능한 것을 먼저 처리하는 축입니다. Spectre류는 별도 보안 주제입니다.

Superscalar · IPC · MLP

한 Core에 실행 장치가 여러 개인 Superscalar 구조와 OoO는 잘 맞습니다. Cycle당 유효 명령 수(IPC)는 Miss·Misprediction·의존성·대역폭 등에도 영향받습니다. 여러 메모리 요청을 겹치는 것이 MLP입니다. Linked List처럼 다음 주소가 이전 Load 결과에 묶이면 Prefetch·MLP가 어렵고, 배열은 연속이라 유리할 수 있습니다.

멀티스레드 · Memory Ordering

Load/Store 재배치와 Cache 때문에, 다른 Thread가 소스 코드 순서로 값을 본다고 가정하면 안 되는 환경이 있습니다 — Memory Ordering. Atomic·Lock·Memory Barrier(Fence)로 필요한 순서를 보장합니다. 일반 JS 웹코드에서 CPU Fence를 직접 쓸 일은 거의 없고, 언어 추상화를 씁니다. Race Condition의 본질은 동기화 없는 공유 상태이며, OoO만의 문제는 아닙니다. Compiler Reordering과 CPU OoO는 다른 단계입니다. 동시성·Context Switching·Resource Contention과도 함께 봅니다.

웹에서는? · SMT · 한계

CRUD·홈페이지에서는 DB·네트워크가 훨씬 큰 병목인 경우가 많습니다. 게임·압축·DB 엔진·고성능 서버처럼 CPU Bound일 때 Profiling이 의미가 있습니다. Wall Time 대비 CPU Time을 먼저 보고, 모니터링·Hardware Counter로 Miss·Branch·IPC를 봅니다. SMT/Hyper-Threading은 다른 Hardware Thread에서 일을 찾아 장치를 채우고, OoO는 같은 Thread 안에서 찾습니다. 의존성이 강하거나 Miss·Misprediction이 많으면 OoO도 한계에 닿습니다. In-Order CPU는 구조가 단순하고, OoO는 성능 대신 복잡성·전력 비용이 있습니다.

자주 묻는 질문

Out-of-Order Execution이란?

의존성이 없는 명령어 중 실행 가능한 작업을 프로그램 순서와 다르게 먼저 처리하는 CPU 기술입니다.

결과가 틀어지나?

정상적인 동작에서는 Commit이 프로그램 순서를 유지해 의미가 깨지지 않습니다.

모든 명령을 마음대로?

아닙니다. 앞 결과가 필요한 의존성이 있으면 기다려야 합니다.

Speculative과 같나?

아닙니다. OoO는 실행할 명령 중 가능한 것을 먼저, Speculative은 미확정 경로까지 미리 실행합니다.

SEO와 관련있나?

SEO 전용 개념은 아닙니다. 일반 홈페이지 검색 노출과 직접 관계는 거의 없습니다.

정리

Out-of-Order Execution = 앞 명령이 막혀도 독립적인 뒤 명령을 먼저 처리하는 기술입니다. 「순서는 적혀 있지만 할 수 있는 일부터」이며, 결과는 순서대로 Commit합니다. Memory·Cache Miss 대기를 일부 숨기고 ILP·IPC를 돕지만, 의존 사슬이 길면 한계가 있습니다. 그런데 앞으로 쓸 데이터를 미리 안다면 기다리는 시간 자체를 줄일 수 있습니다. 배열을 순서대로 읽을 때 다음 칸을 미리 Cache로 가져오는 것처럼, 앞으로 사용할 가능성이 높은 데이터를 미리 예측해 Cache로 가져오는 기술Prefetching(프리페칭, 미리 가져오기)이라고 합니다.