
해당 내용은 [CS 기술면접 1] 말이 트이는 컴퓨터 구조를 학습한 기록입니다.
목차
1. CPU와 레지스터의 역할
2. 인터럽트가 발생하는 이유와 동작 과정
3. CPU 성능 개선
* 해당 학습 글에서 다루지 않는 내용
해당 학습 글에선 CPU 성능 개선, 특히 명령어 실행 구조와 파이프라이닝 등을 중심으로 설명한다.
따라서 다음과 같은 내용은 다루지 않는다.
- 명령어의 형태 : 연산코드와 오퍼랜드의 내부 구성
- 명령어의 종류 : 데이터 전송, 산술논리연산, 제어 명령어 등
- 오퍼랜드 주소 지정 방식 : 즉시 주소 지정, 직접/간접 주소 지정, 레지스터 주소 지정 등
- 명령어 집합의 종류 : RISC, CISC와 같은 명령어 집합 구조
3. CPU 성능 개선
웹 어플리케이션의 성능을 이야기할 때 우리는 흔히 네트워크, 렌더링, Javascript 실행을 떠올린다.
하지만 그 모든 작업의 최종 실행 주체는 CPU다.
CPU가 명령어를 처리하는 방식부터, 구조적 개선 과정을 정리해보았다.
3-1. CPU가 처리하는 명령어 사이클
CPU는 프로그램을 실행할 때 명령어 단위로 작업을 수행한다.
이 명령어 하나는 내부적으로 다음과 같은 사이클을 거쳐 처리된다.
- Fetch (인출) : 메모리에서 명령어를 가져옴
- Decode (해독) : 명령어를 해석하여 어떤 연산을 수행할지 결정한다.
- Execute (실행) : 실제 연산을 수행한다.
- Memory Access (필요시) : 메모리 읽기 또는 쓰기 작업을 수행한다.
- Write Back (저장) : 연산 결과를 레지스터에 저장한다.
이를 통틀어 CPU 명령어 사이클이라 하며, 도식화를 하면 다음과 같다.

CPU 실행 중 인터럽트(Interrupt)가 발생하면, 현재 명령어 흐름을 중단하고
인터럽트 사이클을 통해 해당 이벤트를 처리한 후 이전 작업으로 복귀한다.
인터럽트의 개념과 처리 과정에 대해서는 이전 글에서 자세히 다룬 바 있다.
1. 컴퓨터 구조 : CPU (2)
해당 내용은 이것이 컴퓨터 과학이다 with CS 기술면접을 학습한 기록입니다. 목차1. CPU와 레지스터의 역할2. 인터럽트가 발생하는 이유와 동작 과정 3. CPU 성능 개선 2. 인터럽트가 발생하는 이유
jignonne.tistory.com
단순한 구조의 CPU에서는 하나의 명령어가 위의 모든 단계를 완전히 마친 후에야 다음 명령어를 처리할 수 있다.
이러한 방식에서는 각 단계마다 사용되지 않는 하드웨어 자원이 발생하게 되고, 이는 곧 비효율적인 성능 저하로 이어진다.
CPU 성능 개선의 핵심 목적은 바로 이러한 하드웨어 자원 낭비를 최소화하고 처리 효율을 높이는 것에 있다.
3-2. 파이프라이닝
파이프라이닝이란 명령어 처리 단계를 겹쳐서 병렬로 실행하는 기법이다.
앞서 살펴본 명령어 사이클의 각 단계를 분리하여, 서로 다른 명령어가 동시에 각 단계에서 처리되도록 구성한다.
각 공정이 독립적으로 동작하며 서로 다른 제품을 동시에 처리하듯, CPU 역시 각 단계가 서로 다른 명령어를 병렬로 수행한다.

이러한 구조를 통해 CPU는 한 명령어의 전체 처리 시간(latency)을 줄이기보다는,
단위 시간당 처리할 수 있는 명령어 수(throughput)를 증가시켜 성능 향상을 기대할 수 있다.
파이프라이닝 성능 분석
파이프라이닝의 단계 수를 k, 실행할 명령어의 수를 N,
각 파이프라인 단계가 1 클록 주기씩 소요된다고 가정하자.
이때 파이프라이닝을 적용한 전체 명령어 실행 시간 T는 다음과 같이 표현된다.
T = k + (N − 1)
이는 첫 번째 명령어가 모든 파이프라인 단계를 거치는 데 k 클록이 필요하고,
이후의 명령어들은 매 클록마다 하나씩 완료되기 때문이다.
한편, 파이프라이닝을 적용하지 않은 경우 전체 실행 시간은 다음과 같다.
T₀ = N × k
따라서 파이프라이닝에 의한 속도 향상 비율(Speedup)은 다음과 같이 표현할 수 있다.
Speedup = T₀ / T = (N × k) / (k + N − 1)
명령어의 개수 N이 충분히 커지는 경우, 위 식은 다음과 같이 수렴한다.
Speedup ≈ k
즉, 이상적인 상황에서 k단계 파이프라이닝은 최대 k배의 성능 향상을 기대할 수 있다.
결과적으로 파이프라이닝은 CPU의 클럭 속도를 증가시키지 않고도 성능을 개선할 수 있는 대표적인 기법이다.
3-3. 파이프라이닝의 한계와 해저드(Hazard)
파이프라이닝은 이상적인 상황에서는 효율적이지만, 현실에서는 여러 제약에 부딪힌다.
명령어 간의 의존성, 자원 충돌, 분기 명령 등의 이유로 파이프라인이 완벽하게 동장하기 않아
파이프라인이 멈추거나 잘못된 명령이 실행되기도 하는데,
이러한 문제가 바로 해저드(Hazard)이며, 크게 구조적 해저드, 데이터 해저드, 제어 해저드로 구분된다.
구조적 해저드(Structural Hazard)
구조적 해저드는 여러 명령어가 동시에 동일한 하드웨어 자원을 사용하려 할 때 발생한다.
자원 충돌로 인해 일부 명령어가 즉시 실행되지 못하고 지연되며,
이는 파이프라인의 효율을 저하시킨다.
| 클록 주기 | 1클록 | 2클록 | 3클록 | 4클록 | 5클록 | 6클록 | 7클록 |
| 명령어 1 | 명령어 인출 | 명령어 해독 | 명령어 실행 | 메모리 접근 | 결과 저장 | ||
| 명령어 2 | 명령어 인출 | 명령어 해독 | 명령어 실행 | 메모리 접근 | 결과 저장 | ||
| 명령어 3 | 명령어 인출 | 명령어 해독 | 명령어 실행 | 메모리 접근 | 결과 저장 | ||
| 명령어 4 | 명령어 인출 | 명령어 해독 | 명령어 실행 | 결과 저장 |
명령어 3과 명령어 4를 살펴보면,
특정 클록 주기에서 여러 명령어가 동시에 메모리 접근 단계에 진입하게 된다.
이로 인해 하나의 메모리 자원을 동시에 사용하려는 자원 충돌이 발생하고,
일부 명령어는 즉시 실행되지 못한 채 지연(stall) 된다.
해결 방법
- 하드웨어 자원 복제
- 동일한 자원을 여러 개로 구성하여 동시에 접근 가능하도록 한다. - 명령어 대기(stall)
- 한쪽 명령어를 잠시 대기시켜 자원 충돌을 해소한 뒤 순차적으로 실행한다.
데이터 해저드 (Data Hazard)
데이터 해저드는 이전 명령어의 실행 결과가 아직 준비되지 않았는데,
다음 명령어가 해당 결과 값을 사용하려 할 때 발생한다.
파이프라이닝 환경에서는 여러 명령어가 동시에 실행되므로,
레지스터에 결과가 저장되기 전에 그 값을 참조하려는 경우 잘못된 연산이 발생할 수 있다.
명령어 1: R1 = R2 + R3
명령어 2: R4 = R1 + R5
명령어 2는 연산에 필요한 R1 값을 사용해야 하지만,
해당 값은 명령어 1의 결과 저장 단계가 끝난 이후에야 유효해진다.
해결 방법
- stall 삽입
- 이전 명령어의 결과가 레지스터에 저장될 때까지
- 다음 명령어를 일시적으로 대기시켜 안전하게 실행한다. - Forwarding (Bypassing)
- 이전 명령어의 실행 결과를
- 레지스터 저장 단계 이전에 바로 다음 명령어로 전달한다.
- 불필요한 stall을 줄여 파이프라인 효율을 향상시킨다.
제어 해저드 (Contraol Hazard)
제어 해저드는 분기(branch)나 점프(jump) 명령어로 인해 다음에 실행할 명령어 주소를 확정할 수 없을 때 발생한다.
조건이 평가되기 전까지 분기 여부를 알 수 없기 때문에,
CPU는 일단 순차적으로 명령어를 인출하게 된다.
| 클록 주기 | 1클록 | 2클록 | 3클록 | 4클록 | 5클록 | 6클록 |
| 분기 명령 | 명령어 인출 | 명령어 해독 | 명령어 실행 | |||
| 명령어 A | 명령어 인출 | 명령어 해독 | ||||
| 명령어 B | 명령어 인출 | |||||
| ❌ flush | flush | |||||
| 분기 대상 | 명령어 인출 | 명령어 해독 | 명령어 실행 |
분기 결과가 실행 단계에서 확정되면,
이미 인출되어 있던 명령어 A와 B는 잘못된 경로의 명령어가 되며
이로 인해 파이프라인을 비우는 flush 현상이 발생한다.
해결 방법
- 분기 예측 (Branch Prediction)
- 다음에 실행할 명령어를 미리 예측하여 인출
- 예측 성공 시 성능 향상
- 예측 실패 시 flush 발생으로 성능 저하 - 지연 분기 (Delayed Branch)
- 분기 명령 직후의 한두 개 명령어를
- 분기 결과와 상관없이 먼저 실행하도록 설계
4. 슈퍼 스칼라 프로세서 (Superscalar Processor)
파이프라이닝의 한계를 극복하기 위해,
파이프라이닝 기법에 병렬 처리 구조를 결합한 형태가 바로 슈퍼스칼라 프로세서이다.
슈퍼스칼라 프로세서는 한 클록 사이클에 여러 개의 명령어를 동시에 실행할 수 있도록,
여러 개의 실행 유닛(Execution Unit)을 갖는 구조를 사용한다.
CPU는 명령어 간의 의존성(dependency)을 분석하여
서로 영향을 주지 않는 명령어들에 대해 병렬 실행 가능 여부를 판단하고,
동시에 여러 실행 유닛에 할당하여 처리한다.
파이프라이닝이
하나의 명령어를 여러 단계로 나누어 겹쳐 실행하는 방식이라면,
슈퍼스칼라 프로세서는
여러 개의 명령어 자체를 동시에 병렬로 실행하는 방식이다.
즉, 슈퍼스칼라 프로세서 구조에서는
파이프라인의 각 단계가 하나의 명령어만 처리하는 것이 아니라,
여러 명령어를 동시에 처리함으로써 명령어 수준 병렬성을 극대화한다.
슈퍼스칼라 구조 예시
: 4 단계 명령어 파이프라이닝 + 2 등급 슈퍼 스칼라 프로세서
| 클록 주기 | 1클록 | 2클록 | 3클록 | 4클록 | 5클록 | 6클록 | 7클록 |
| 명령어 1 | 명령어 인출 | 명령어 해독 | 오퍼랜드 인출 | 명령어 실행 | |||
| 명령어 2 | 명령어 인출 | 명령어 해독 | 오퍼랜드 인출 | 명령어 실행 | |||
| 명령어 3 | 명령어 인출 | 명령어 해독 | 오퍼랜드 인출 | 명령어 실행 | |||
| 명령어 4 | 명령어 인출 | 명령어 해독 | 오퍼랜드 인출 | 명령어 실행 | |||
| 명령어 5 | 명령어 인출 | 명령어 해독 | 오퍼랜드 인출 | 명령어 실행 | |||
| 명령어 6 | 명령어 인출 | 명령어 해독 | 오퍼랜드 인출 | 명령어 실행 | |||
| 명령어 7 | 명령어 인출 | 명령어 해독 | 오퍼랜드 인출 | 명령어 실행 | |||
| 명령어 8 | 명령어 인출 | 명령어 해독 | 오퍼랜드 인출 | 명령어 실행 |
'cs study > 컴퓨터 구조' 카테고리의 다른 글
| 1. 컴퓨터 구조 : 메모리 (2) 캐시 메모리 (0) | 2026.01.21 |
|---|---|
| 1. 컴퓨터 구조 : 메모리 (1) RAM (0) | 2026.01.20 |
| 1. 컴퓨터 구조 : CPU (2) (0) | 2025.11.25 |
| 1. 컴퓨터 구조 : CPU (1) (0) | 2025.11.24 |
| 1. 컴퓨터 구조의 이해 기초 (0) | 2025.11.20 |