Chapter 4. CPU의 작동 원리

2025. 3. 16. 23:25·독서/[ 혼자 공부하는 컴퓨터 구조 + 운영체제 ]

CPU는 크게 ALU, 제어 장치, 그리고 레지스터로 구성되어 있다.

 

ALU

ALU는 레지스터를 통해 피연산자, 제어 신호를 받아들여 연산을 수행하고, 연산 결과를 레지스터에 저장한다. 또한, 연산 결과에 대한 추가적인 상태 정보를 플래그로 나타내어 플래그 레지스터에 저장한다. ALU가 내보내는 대표적인 플래그는 다음과 같다.

 


제어장치

제어장치는 제어 신호를 내보내고 명령어를 해석하는 부품으로, 다음과 같은 정보들을 받아들인다.

 

클럭 신호

컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위이다.

 

명령어

CPU가 해석해야 할 명령어를 명령어 레지스터에 저장하고, 이를 해석하여 알맞은 제어 신호를 발생시킨다.

 

플래그

앞서 설명한 플래그 레지스터의 플래그 값을 받아들여 부품들을 제어할 때 참고한다.

 

제어 신호

CPU뿐만 아니라 입출력장치를 비롯한 CPU 외부 장치로 인해 발생된 제어 신호를 받아들인다.

또한, 제어장치가 내보내는 신호는 메모리나 입출력장치, 레지스터, ALU 등으로 전달된다.


레지스터

프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장된다. 따라서, CPU 안에는 각 역할에 맞는 다양한 레지스터들이 있으며 가장 알아야 할 레지스터는 다음과 같다.

 

프로그램 카운터(Progrma counter)

프로그램 카운터(PC) 레지스터는 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽을 명령어의 주소를 저장한다. 이는 명령어 포인터(Instruction Pointer)라고도 부른다.

 

명령어 레지스터(Instruction register)

해석할 명령어, 즉 방금 메모리에서 읽은 명령어를 저장하는 레지스터이다. 제어장치는 명령어 해당 레지스터의 값을 읽어 해석한 뒤, 제어 신호를 내보낸다.

 

메모리 주소 레지스터(Memeory address register)

메모리의 주소를 저장하는 레지스터로, CPU가 읽고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거친다.

 

메모리 버퍼 레지스터(Memeory buffer register)

메모리와 주고 받을 값(데이터와 명령어)을 저장하는 레지스터이다. 즉, 메모리에 쓰고 싶은 값이나 메모리부터 받은 값은 해당 레지스터를 거치며, 이때 데이터 버스를 이용하게 된다.

 

메모리에 저장된 프로그램을 실행하는 과정에서 위의 레지스터에 접근하는 순서는 다음과 같다.

프로그램 카운터 → 메모리 주소 레지스터 → 메모리 버퍼 레지스터 → 명령어 레지스터 → 제어 신호 발생

 

범용 레지스터(General purpose register)

이름 그대로 다양하고 일반적인 상황에서 자유롭게 사용하는 레지스터로, 데이터와 주소 모두 저장할 수 있는 레지스터이다.

 

플래그 레지스터(Flag register)

ALU 연산 결과에 따른 플래그를 저장하는 레지스터로, ALU의 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터이다.

 

특정 레지스터를 이용한 주소 지정 방식(1): 스택 주소 지정 방식(Stack addressing mode)

아직 설명하지 않은 스택 포인터를 활용하는 주소 지정 방식으로, 메모리 영역 안에 스택으로 활용되도록 정해져 있는 스택 영역에서 데이터와 명령어를 가져올 때 스택의 top의 주소를 저장하고 있는 스택 포인터의 값을 참조하여 가져온다.

 

특정 레지스터를 이용한 주소 지정 방식(2): 변위 주소 지정 방식(Displacement addressing mode)

명령어의 오퍼랜드 필드의 값과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식으로, 다음과 같이 연산 코드 필드, 레지스터 이름, 오퍼랜드 필드로 구성된 명령어로 사용한다. 이때 어떤 오퍼랜드 값과 어떤 레지스터를 사용하는지에 따라 상대 주소 지정 방식과 베이스 레지스터 주소 지정 방식 등으로 나뉜다.

 

상대 주소 지정 방식(Relative addressing mode)

오퍼랜드와 카운터의 값을 더해 유효 주소를 얻는 방식

 

베이스 레지스터 주소 지정 방식(Base-register addressing mode)

오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식


명령어 사이클과 인터럽트

CPU는 하나의 명령어를 처리하는 정형화된 흐름인 명령어 사이클에 따라 명령어를 처리한다. 간혹 이 사이클이 끊어지는 상황이 발생하지만 이를 인터럽트라고 한다.

 

명령어 사이클

메모리에 저장된 명령어를 실행하기 위해 CPU가 수행하는 과정은 다음과 같이 3단계로 나눠서 볼 수 있다.

- Fetch: 메모리에 있는 명령어를 CPU로 가져오는 단계
- Decode: 명령어를 CPU가 해석하는 단계
- Execution: 해석된 명령어를 수행하는 단계

이때 간접 주소 지정 방식과 같이 메모리 접근이 더 필요한 경우 간접 사이클을 추가로 거치게 된다.

이러한 CPU의 명령어 사이클을 잠시 중단하게 하는 것이 인터럽트이다. 인터럽트의 종류에는 크게 동기 인터럽트와 비동기 인터럽트가 있다.

 

동기 인터럽트(Synchoronous interrupts)

CPU에 의해 발생하는 인터럽트로, 명령어를 수행하다가 프로그래밍상의 오류와 같은 예상치 못한 상황에 발생하는 인터럽트로 예외(exception)이라고도 한다.

 

비동기 인터럽트(asynchoronous interrupts)

주로 입출력장치에 의해 발생하는 인터럽트로, CPU가 프린터와 같은 입출력장치에 작업을 부탁하면, 작업을 끝낸 프린터가 CPU에게 완료 알림으로 인터럽트를 보낸다. 이는 하드웨어 인터럽트라고도 할 수 있으며, CPU가 입출력 작업 도중에도 효율적을 명령어를 처리할 수 있도록 한다.

 

ex) 프린터 출력 명령을 했을 경우, 비동기 인터럽트가 없다면 주기적으로 CPU가 작업 완료를 확인해야 함. but, 비동기 인터럽트가 있다면 인터럽트가 발생할 때까지 다른 작업만을 수행 가능.

이때 비동기 인터럽트를 처리하는 순서는 다음과 같다.

- 입출력장치가 CPU에게 인터럽트 요청 신호를 보낸다.
- CPU는 실행 사이클이 끝난 뒤 항상 인터럽트 여부를 확인한다. 인터럽트 요청을 확인한 CPU가 인터럽트 플래그를 통해 인터럽트를 받아들일 수 있는지 확인한다.
- 인터럽트를 받아들이기 위해 현재까지의 작업을 스택 영역에 백업한다.
- 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 수행한다.
- 인터럽트 서비스 루틴이 끝난 뒤, 백업해 둔 작업을 이어서 수행한다.

이때 인터럽트 서비스 루틴(ISR(Interrupt service routine))은 인터럽트를 처리하기 위한 프로그램으로, 인터럽트 핸들러라고도 부른다. 이는 각 인터럽트가 발생했을 때 어떻게 동작해야 하는지에 대한 프로그램으로, 인터럽트 벡터를 통해 각 인터럽트를 식별하여 특정 인터럽트 서비스 루틴을 수행하게 된다.


예외의 종류

예외가 발생하면 CPU는 작업을 중단하고 예외를 처리한다. 예외는 크게 4가지로 나눌 수 있으며, 예외를 처리한 뒤 CPU가 본래의 작업으로 돌아왔을 때 어디서부터 다시 수행하느냐에 따라 폴트(fault)와 트랩(trap)으로 나눌 수 있다.

 

폴트(flaut)

폴트는 예외를 처리한 직후 예외가 발생한 명령어부터 다시 수행하는 예외이다.

 

트랩(trap)

트랩는 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 다시 수행하는 예외이다. 주로 디버깅할 때 사용한다.

 

중단(abort)

CPU가 프로그램을 강제로 중단시킬 수밖에 없는 심각한 오류를 발견했을 때 발생하는 예외이다.

 

소프트웨어 인터럽트

시스템 호출이 발생했을 때 나타나는 인터럽트이다.


참고 자료:

강민철. 『혼자 공부하는 컴퓨터 구조 + 운영체제』. 한빛미디어, 2022.

'독서 > [ 혼자 공부하는 컴퓨터 구조 + 운영체제 ]' 카테고리의 다른 글

Chapter 6. 메모리와 캐시메모리  (0) 2025.03.20
Chapter 5. CPU 성능 향상 기법  (0) 2025.03.19
Chapter 3. 명령어  (0) 2025.03.13
Chapter 2. 데이터  (0) 2025.03.10
Chapter 1. 컴퓨터 구조 시작하기  (0) 2025.03.09
'독서/[ 혼자 공부하는 컴퓨터 구조 + 운영체제 ]' 카테고리의 다른 글
  • Chapter 6. 메모리와 캐시메모리
  • Chapter 5. CPU 성능 향상 기법
  • Chapter 3. 명령어
  • Chapter 2. 데이터
coding-l7
coding-l7
  • coding-l7
    coding-l7rl0
    coding-l7
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 기타
      • 유니티
        • OfficeWorkerRunning
      • 프로그래밍 언어
        • C
        • C#
        • C++
      • CS
        • 컴퓨터 구조
        • 운영체제
      • 물리 기반 시뮬레이션
        • 기초
        • Cloth Simulation
        • Fluid Simulation
      • 코딩 테스트
        • 프로그래머스
        • 백준
      • 독서
        • [ 뇌를 자극하는 윈도우즈 시스템 프로그래밍 ]
        • [ 혼자 공부하는 컴퓨터 구조 + 운영체제 ]
        • [ CUDA 기반 GPU 병렬 처리 프로그래밍 ]
      • 영어
        • Basic Grammar In Use
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
    • 포트폴리오
  • 공지사항

  • 인기 글

  • 태그

    액체 시뮬레이션
    bilateral blur
    유체 시뮬레이션
    물리 기반 시뮬레이션
    position based dynamics
    OpenGL
    screen-space rendering
    파동 난류
    RAM
    그리드 기반 방법
    정수 승격
    screen space fluid rendering
    collision
    실수
    fluid simulation
    입자 기반 방법
    cloth simulation
    jump table
    컴퓨터 구조
    C언어
    surface turbulence
    상수
    narrow range filter screen-space fluid rendering
    Flip
    pbd
    시스템 프로그래밍
    wave simulation
    fluid implicit particle
    명령어
    GLSL
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
coding-l7
Chapter 4. CPU의 작동 원리
글쓰기
상단으로

티스토리툴바