Skip to main content

SSAFY CS 스터디: 이취컴 Chapter 2-3 정리

Chapter 02 컴퓨터 구조 - 3 CPU

p.66~89


레지스터

CPU 안에 있는 임시 저장장치

프로그램 카운터 (PC)

메모리에서 다음으로 읽어들일 명령어 주소를 저장하는 레지스터
일반적으로 1씩 증가하여, 프로그램을 순차적으로 읽어들이게 된다.
조건문이나 리턴문을 만나면, 비순차적으로 임의의 값이 되기도 한다.

IP라고 부르기도 해용

PC를 명령어 포인터(Instruction Pointer)라고 부르는 CPU도 있다(!)

명령어 레지스터

메모리에서 방금 읽어들인 명령어를 저장하는 레지스터
CPU의 제어장치가 이곳의 명령어를 해석해서 ALU로 연산할지 다른 부품으로 제어 신호를 보낼지 결정

범용 레지스터

다양하고 일반적으로 사용할 수 있는 레지스터
데이터, 명령어, 주소 저장 가능

플래그 레지스터

연산 결과 또는 CPU 상태 관련 플래그를 저장하는 레지스터
플래그: 명령어 처리 과정에서 반드시 참조해야 할 상태 정보를 의미하는 비트

  • 부호 플래그: 연산 결과의 부호. 1이면 음수
  • 제로 플래그: 연산 결과가 0인지의 여부. 1이면 0
  • 캐리 플래그: 연산 결과에 올림, 빌림수 발생 여부. 1이면 발생
  • 오버플로우 플래그: 오버플로우 발생 여부. 1이면 발생
  • 인터럽트 플래그: 인터럽트 가능 여부. 1이면 가능
  • 슈퍼바이저 플래그: 커널 모드/사용자 모드 여부. 1이면 커널 모드

스택 포인터

메모리 내 스택 영역의 최상단 주소를 가리키는 레지스터


인터럽트

CPU의 작업을 방해하는 신호
인터럽트는 임의로 발생시키거나, 잘못된 프로그램으로 발생하기도 한다.
효율적인 입출력을 위해 사용되기도 한다.

폴링: 작업 완료 여부를 주기적으로 계속 확인하는 방법. 인터럽트와 대비되는 개념.

1️⃣ 동기 인터럽트

  • CPU에 의해 발생하는 인터럽트
  • 프로그램 오류와 같은 예외적인 상황에서 발생 👉 예외라고도 부르는 이유
  • 폴트, 트랩, 중단, 소프트웨어 인터럽트(시스템 콜)가 이에 해당
폴트와 트랩의 차이

CPU가 인터럽트 실행 후 복귀했을 때,
예외가 발생한 명령어부터 실행하는지(폴트), 아니면
그 다음 명령어부터 실행하는지(트랩)에 따라 폴트와 트랩으로 구분된다.

  • 페이지 폴트: 명령어 실행을 위해 필요한 데이터가 보조기억장치에 있어서 CPU가 폴트를 발생시키고, 데이터를 메모리로 가져온 후 예외가 발생한 명령어부터 재실행
  • 브레이크 포인트: 디버깅에서 사용. 트랩의 대표적인 예시
  • 중단(Abort): 프로그램을 강제 중단해야 할 급의 심각한 오류 상황 시 발생

2️⃣ 비동기 인터럽트

  • 입출력장치에 의해 발생하는 인터럽트. 장치의 작업 알림 역할을 함
  • 하드웨어 인터럽트라고도 함.

2️⃣*️⃣ 하드웨어 인터럽트

CPU는 효율적인 명령어 처리를 위해 하드웨어 인터럽트를 사용한다.
하드웨어 인터럽트를 통해, 입출력장치가 작업을 수행하는 동안 CPU는 다른 작업을 수행할 수 있다.

CPU의 인터럽트 처리 과정
  1. 입출력장치가 CPU에 인터럽트 요청 신호
  2. CPU가 명령어 인출 전 항상 인터럽트 여부 확인
  3. CPU의 인터럽트 요청 확인, 인터럽트 플래그 참조하여 인터럽트 처리 가능 여부 확인
  4. 가능하면 지금까지의 작업 백업
  5. CPU가 인터럽트 백터 참조하여 인터럽트 서비스 루틴 실행
  6. 인터럽트 서비스 루틴 끝나면 백업했던 작업 마저 실행
무적 인터럽트

인터럽트 플래그로도 막을 수 없는 하드웨어 인터럽트가 있다.
정전이나 하드웨어 고장으로 인한 인터럽트가 이에 해당한다.

인터럽트 서비스 루틴: 인터럽트를 처리하기 위한 프로그램. 인터럽트 핸들러라고도 함.
👉 본질적으로 함수 실행과 유사하다.

메모리에 여러개의 인터럽트 서비스 루틴이 저장되어 있음.
👉 각 루틴을 CPU가 구분하기 위해 인터럽트 벡터 라는 식별 정보 사용(서비스 시작 주소)
👉 하드웨어 인터럽트 요청을 보낸 대상으로부터 CPU가 버스로 인터럽트 벡터 전달받음

기존 실행하던 프로그램 작업 내역(ex. PC)의 백업은 스택 메모리에 한다.

인터럽트까지 포함한 CPU 명령어 사이클


CPU 성능 향상을 위한 설계

클럭

헤르츠(Hz) 단위로 측정됨 -> 1초에 클럭이 몇 번 반복되는지를 나타냄.
현대에는 GHz 단위로 측정하는 것이 일반적이다.

멀티코어와 멀티스레드

  • 코어: CPU 내에서 명령어를 읽어들이고, 해석하고, 실행하는 부품
명령어를 읽어들이고, 해석하고, 실행하는 부품은 CPU 라며?

맞음 ㅇㅇ 다만 현대에서 발전해서 정의가 그리 옮겨지게 된거

  • 하드웨어 스레드: 하나의 코어가 동시에 처리하는 명령어 단위

    • 프로그램 입장에서는 4스레드가 4개의 CPU 처럼 보인다 -> 하드웨어 스레드를 논리 프로세서라고도 하는 이유
  • 소프트웨어 스레드: 하나의 프로그램에서 독립적으로 실행되는 단위

괜히 하드웨어, 소프트웨어 스레드 정의 나눈게 아님

1코어 1스레드 CPU도 멀티스레드 프로그램 실행 가능함

  • 병렬성: 작업을 물리적으로 동시에 처리하는 것 👉 하드웨어 스레드는 물리적 실행 단위이므로 병렬성을 보임
  • 동시성: 동시에 작업을 처리하는 것처럼 보이는 것 👉 소프트웨어 스레드는 논리적 실행 단위이므로 동시성을 보임

싸피컴의 CPU 스펙은?

클럭은 마우스를 오지게 움직여서 순간적으로 튄거고
코어는 8코어, 스레드는 16스레드임!


파이프라이닝을 통한 명령어 병렬 처리

명령어 병렬 처리 기법(ILP): 여러 명령어를 동시에 처리하여 CPU 성능 높이는 기법. 현대 CPU에서 빠질 수 없는 핵심 기술이다.

명령어 파이프라이닝

CPU는 인출, 해석, 실행, 저장을 반복한다.
여기서 겹치는 것만 없으면 하나의 명령어를 인출하는 동안 다른 명령어를 실행하는 등, 병렬처리가 가능하다.
명령어 파이프라이닝은 명령어 병렬 처리 기법 中 하나로, 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법이다.

슈퍼스칼라

현대 CPU는 대부분 여러개의 파이프라인을 사용한다.
이러한 복수 파이프라인 구조를 슈퍼스칼라 라고 한다.

파이프라이닝에서의 CISC와 RISC 차이

  • CISC: 다채로운 기능, 복잡한 명령어 지원 -> 적은 수의 명령어로 실행 가능
  • RISC: 짧고 규격화된 명령어, 1클럭 내외로 실행되는 명령어 지향 -> 더 많은 명령어 필요

CISC는 RISC에 비해 명령어 수행시간이 들쭉날쭉해서, 파이프라이닝이 비효율적일 수 있다.
반면에 RISC는 파이프라이닝에 최적화되어 있다.

파이프라인 위험

파이프라이닝이 실패하여 성능 향상이 이루어지지 않는 것.

  • 데이터 위험: 명령어 간의 데이터 의존성에 의해 발생
  • 제어 위험: 프로그램 카운터의 갑작스러운 변화로 발생 (ex. JMP, 인터럽트)
  • 구조적 위험: 서로 다른 명령어가 동일 ALU, 레지스터 등을 사용하려고 할 때 발생 (👉 자원 위험이라고도 함)