컴퓨터 공학에서 비순차적 명령어 처리 또는 비순차적 실행(out-of-order execution, 줄여서 OoOE, dynamic execution)은 고성능 마이크로프로세서가 특정한 종류의 지연으로 인해 낭비될 수 있는 명령 사이클을 이용하는 패러다임이다. 명령 실행 효율을 높이기 위해 순서에 따라 처리하지 않는 기법이며 수많은 프로세서가 채용하고 있다.
프로그래머는 프로그램을 짤 때 자신이 만든 코드가 차례대로 (분기문이 없다면 위에서 아래로) 실행될 것으로 믿는다. 순차 프로세서는 이 순서를 그대로 지켜가며 실행한다. 그러나 어떤 메모리 로드 명령어가 캐시 미스를 겪고 있다고 가정해 보자. 만약 이를 뒤따르는 명령어 가운데 이 로드 명령어와 상관이 없는 것이라면 분명 미리 실행할 수 있을 것이다. 또, 싱글 스레드 프로그램이라도 분명 동시에 처리할 수 있는 명령어가 있다. 이것을 명령어 수준 병렬성(Instruction Level Parallelism, ILP)이라 부른다. 비순차 프로세서는 하드웨어가 직접 실시간으로 ILP를 찾아 명령어 처리율을 극적으로 높인다. 보통 비순차 프로세서는 수퍼스케일러 프로세서 형태로 작성된다. 그래야 동시에 두 개 이상의 병렬로 실행가능한 명령어를 효과적으로 처리할 수 있기 때문이다. 이 명령어 수준 병렬성은 코드 상에 적혀진 순서가 아닌 데이터 혹은 제어의 흐름으로 제약된다. 이를 의존성이라 부르며 대표적으로 데이터 의존성, 컨트롤 의존성, 메모리 의존성이 있다. 요약하면 비순차 프로세서는 데이터 흐름을 찾아 처리하는 프로세서로 볼 수 있다. 그러나 하드웨어의 제약으로 ILP를 찾을 수 있는 범위가 제약적이다. 이 범위를 보통 명령어 윈도(Instruction Window)라 부르기도 한다. 현대 프로세서는 약 100여개 이상의 명령어 속에서 ILP를 찾아 비순차 실행을 한다.
옛 프로세서에서는 다음과 같은 단계로 명령어를 실행하였다.
새로운 패러다임은 명령어와 실행 결과를 일시적으로 모아 두는 장소를 만들어 명령어 실행 과정을 다음과 같이 나눈다.:
비순차 프로세서에서 유의해야할 점은 명령어 인출 단계와 맨 마지막 명령어 완료 단계는 반드시 순차적으로 이루어진다는 점이다. 이것은 프로그래머와의 약속이다. 명령어가 뒤죽박죽 완료된다면 프로그래머가 작업하기에 매우 어려울 것이다. 명령어 완료를 순차적으로 하기 위해 필요한 장치가 리오더 버퍼이다.
이 밖에도 비순차 프로세서는 보통 순차 프로세서에서 겪지 않는 WAR/WAW 위험이 발생한다. 이 문제를 해결하기 위해 레지스터 리네이밍(register renaming)이라는 기법을 이용한다.