[혼공컴운 12기] week2 CPU의 작동 원리, CPU 성능 향상 기법

지애·2024년 7월 14일
1

혼공컴운

목록 보기
2/7

✏️ 2주차 진도: Chapter 04 ~ 05

  • 기본 숙제(필수): p. 125의 확인 문제 2번, p. 155의 확인 문제 4번 풀고 인증하기
  • 추가 숙제(선택): Ch.05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기

Chapter 04 CPU의 작동 원리

04-1 ALU와 제어장치

ALU

CPU의 구성 요소인 ALU라는 친구에 대해서 알아보자.
ALU는 CPU 내부에서 계산을 담당한다.

  • ALU가 받아들이는 정보
    레지스터를 통해 피연산자를 받고, 제어장치로부터 제어 신호(수행할 연산)을 받아들인다.

  • ALU가 내보내는 정보
    연산을 수행한 결괏값(숫자, 문자, 메모리 주소)플래그(연산 경과에 대한 추가적인 정보)를 내보낸다.
    결괏값은 바로 메모리에 저장되지 않고 일시적으로 레지스터에 저장된다.

    CPU가 메모리에 접근하는 속도 <<<<<< CPU가 레지스터에 접근하는 속도이기 때문에 프로그램 실행 속도를 높이기 위해 레지스터에 저장하는 것!

ALU가 내보내는 대표적인 플래그

  • 부호 플래그 : 1일 경우 음수, 0일 경우 양수
  • 제로 플래그 : 1일 경우 0, 0일 경우 0이 아님
  • 캐리 플래그 : 1일 경우 올림수나 빌림수가 발생, 0일 경우 발생X
  • 오버플로우 플래그 : 1일 경우 오버플로우 발생, 0일 경우 발생X
  • 인터럽트 플래그 : 1일 경우 인터럽트 가능, 0일 경우 불가능
  • 슈퍼바이저 플래그 : 1일 경우 커널 모드로 실행 중, 0일 경우 사용자 모드로 실행 중

플래그는 플래그 레지스터에 저장된다.

제어장치

제어장치는 제어 신호를 내보내고 명령어를 해석하는 부품이다.

  • 제어장치가 받아들이는 정보
    클럭 신호(clock) : 컴퓨터의 부품이 클럭 신호에 맞춰서 작동함
    해석해야 할 명령어 : 명령어 레지스터로부터 받아들임
    플래그 : 플래그 레지스터로부터 받아들임
    제어 신호 : 시스템 버스 중 제어 버스로부터 외부에서 전달된 제어 신호를 받아들임

  • 제어장치가 내보내는 정보
    CPU 외부에 전달하는 제어 신호

    • 메모리에 전달
    • 입출력 장치에 전달

    CPU 내부에 전달하는 제어 신호

    • ALU에 전달
    • 레지스터에 전달

04-2 레지스터

레지스터 종류

  • 프로그램 카운터, PC (명령어 포인터, IP) : 메모리에서 가져올 명령어의 주소를 저장, PC가 꾸준히 증가하기 때문에 CPU가 메모리 속 프로그램을 순차적으로 읽을 수 있는 것!
  • 명령어 레지스터(IR) : 해석할 명령어를 저장
  • 메모리 주소 레지스터(MAR) : 메모리의 주소를 저장, 주소 버스로 보낼 값을 저장
  • 메모리 버퍼 레지스터(MBR) : 메모리에 쓰고 싶은 값이나 메모리로부터 전달받을 값을 저장, 데이터 버스로 주고 받을 값을 저장
  • 범용 레지스터 : 자유롭게 사용 가능한 레지스터
  • 플래그 래지스터 : 플래그를 저장
  • 스택 포인터 : 스택의 top을 가리키는 레지스터
  • 베이스 레지스터 :

스택 주소 지정 방식

스택과 스택 포인터를 이용한 주소 지정 방식
스택 포인터가 top을 가리키게 하여 스택에 데이터를 저장하거나 꺼낼 때 사용
스택은 메모리 안의 스택 영역에 있음

변위 주소 지정 방식

오퍼랜드 필드의 값(변위)와 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식

  • 변위 주소 지정 방식을 사용하는 명령어는 연산 코드와 오퍼랜드 코드 외에도 레지스터 필드가 추가로 있다.

  • 상대 주소 지정 방식
    오퍼랜드와 프로그램 카운터의 값(읽어들일 명령어의 주소)을 더하여 유효 주소를 얻음

  • 베이스 레지스터 주소 지정 방식
    오퍼랜드와 베이스 레지스터의 값(기준 주소)을 더하여 유효 주소를 얻음

04-3 명령어 사이클과 인터럽트

명령어 사이클

하나의 명령어를 처리하는 정형화된 흐름
인출 사이클과 실행 사이클이 반복된다.
(인터럽트 사이클과 간접 사이클이 중간에 끼어있는 경우도 있다.)

  • 인출 사이클
    메모리에 있는 명령어를 CPU로 가지고 오는 단계

  • 실행 사이클
    CPU로 가져온 명령어를 실행하는 단계

  • 간접 사이클
    명령어를 인출하여 CPU로 가져와도 곧바로 실행할 수 없는 경우.
    메모리 접근이 더 필요한 경우(ex. 간접 주소 지정 방식)

인터럽트

CPU의 작업을 잠시 중단시키는 신호

  • 동기 인터럽트(예외, exception)
    CPU에 의해 발생하는 인터럽트
    CPU가 명령어들을 수행하다가 예상치 못한 상황에 마주쳤을 때 발생하는 인터럽트

  • 비동기 인터럽트(하드웨어 인터럽트)
    주로 입출력장치에 의해 발생하는 인터럽트
    작업을 끝낸 입출력장치는 CPU에 인터럽트를 보낸다.

하드웨어 인터럽트 처리 순서
1. 입출력장치가 CPU에 인터럽트 요청 신호를 보낸다.

  • 인터럽트 하기 전에 CPU에게 보내는 신호
  1. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
  2. CPU가 인터럽트 요청을 확인하면 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는 상황인지 확인한다.
  • 인터럽트 플래그가 활성화되어 있을 경우에 인터럽트 요청 수용
  • 하지만 정전이나 하드웨어 고장으로 인한 인터럽트일 경우, 우선순위가 가장 높아서 인터럽트 플래그에 상관없이 무조건 받아들인다.
  1. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 스택에 백업한다.
  2. CPU는 인터럽트 벡터를 참조해서 인터럽트 서비스 루틴(ISR, 인터럽트 핸들러)을 실행한다.
  • 인터럽트 벡터: 입출력장치들의 인터럽트 서비스 루틴을 구분하기 위한 것. 인터럽트 서비스 루틴의 시작주소를 알 수 있다. 인터럽트 벡터는 인터럽트 요청을 보낸 대상으로 부터 전달받는다.
  • 인터럽트 서비스 루틴: 인터럽트를 처리하기 위한 프로그램
  1. 인터럽트 서비스 루틴 실행이 끝나면 백업해 둔 작업을 복구해서 실행을 재개한다.

Chapter 05 CPU 성능 향상 기법

05-1 빠른 CPU를 위한 설계 기법

클럭

클럭 속도가 높아지면 CPU는 명령어 사이클을 더 빠르게 반복하므로, 클럭 속도가 높은 CPU는 일반적으로 성능이 좋다. 그래서 클럭 속도가 CPU 속도 단위로 간주되기도 한다.
클럭 속도는 헤르츠(Hz) 단위로 측정한다. (1초에 클럭 한 번 반복 -> 1Hz)
클럭 속도는 일정하지 않다. 고성능이 필요한 순간에는 간적으로 클럭 속도를 높일 수 있는데, 너무 많이 높일 경우에는 발열 문제가 심각해진다.

코어

명령어를 실행하는 부품, 작은 개념의 CPU라고 볼 수 있다
-> CPU는 명령어를 실행하는 부품인 코어를 여러 개 포함하는 부품

멀티 코어

코어를 여러 개 포함하고 있는 CPU
명령어를 실행하는 부품인 코어가 많을 수록 CPU의 처리 속도는 빨라짐 -> 하지만, 코어가 많다고 무조건 성능이 좋아지는 것은 아님. 코어마다 처리할 명령어를 얼마나 적절하게 분배하느냐에 따라 성능이 달라지는 것!

스레드

  • 하드웨어적 스레드, 논리 프로세서 (CPU에서 사용하는 개념)
    하나의 코어에서 동시에 몇 개의 명령어를 처리할 수 있는가?

    한 코어 당 2개의 명령어를 동시에 처리할 수 있고(2개의 하드웨어 스레드), 그러한 코어가 2개 있으면 2코어 4스레드 CPU

  • 소프트웨어적 스레드 (프로그램에서 사용하는 개념)
    하나의 프로그램에서 독립적으로 실행되는 단위
    여기서 독립적이란? 동시에 실행될 수 있는 부분을 말함

멀티 스레드

하나의 코어로 여러 명령어를 동시에 처리하는 것

  • 멀티스레드 프로세서
    하나의 명령어를 처리하기 위해 꼭 필요한 레지스터를 여러 개 가지고 있으면 여러 개의 명령을 동시에 처리할 수 있다.

05-2 명령어 병렬 처리 기법

CPU를 효율적으로 작동시키는 방법

명령어 파이프라인

명령어 처리 과정 중 같은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행할 수 있다.(성능 증가) -> 마치 공장 생산 라인 처럼!

파이프라인 위험

  • 데이터 위험
    명령어 간 데이터 의존성에 의해 발생한다. 이전 명령어를 실행한 결과를 다음 명령에서 사용할 때 발생한다.

  • 제어 위험
    분기 등으로 인한 프로그램 카운터의 갑작스러운 변화에 의해 발생한다. PC의 값이 갑자기 변한다면, 미리 처리 중이었던 명령어들은 아무 쓸모가 없어지기 때문이다. -> 이 위험을 완화하기 위해 분기 예측을 한다.

  • 구조적 위험(자원 위험)
    명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생한다.

슈퍼스칼라

CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조.
매 클럭 주기마다 동시에 여러 명령어를 인출, 해석, 실행할 수 있있는 프로세서에서 가능한 구조이다. (ex. 멀티스레드 프로세서)

비순차적 명령어 처리(OoOE, Out-of-order execution)

오늘날 CPU 성능 향상에 크게 기여한 기법이자 대부분의 CPU가 차용하는 기법
명령어들을 순차적으로 실행하지 않는 기법
데이터 의존성이 전혀 없는(순서를 바꿔 처리해도 무방한) 명령어를 먼저 실행한다.

05-3 CISC와 RISC

명령어 집합 구조(ISA, Instruction Set Architecture)

CPU가 이해할 수 있는 명령어들의 모음이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속
CPU마다 ISA가 다를 수 있다. -> CPU마다 이해할 수 있는 명령어가 다를 수 있다.
ISA가 다르면 제어장치가 명령어를 해석하는 방식, 사용되는 레지스터의 종류와 개수, 메모리 관리 방법 등 많은 것이 달라진다.

CISC(Complex Instruction Set Computer)

명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다.
-> 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있다. 따라서 컴파일된 실행 파일의 크기가 작다.
-> 하지만 활용하는 명령어가 매우 복잡하고 다양한 기능을 제공하기에 명령어의 크기와 실행되기까지의 시간이 일정하지 않다. 그리고 복잡한 명령어 때문에 명령어 하나를 실행하는 데에 여러 클럭 주기를 필요로 한다. => 파이프라인을 구현하는 데 어려움. 실제로는 거의 자주 쓰이는 명령어만 쓰임.

RISC(Reduced Instruction Set Computer)

CISC에 비해 명령어의 종류가 적다.
고정 길이 명령어를 활용한다.
-> 명령어가 규격화되어 있고, 하나의 명령어가 1클럭 내외로 실행되기 때문에 RISC 명령어 집합은 명령어 파이프라이닝에 최적화되어 있다. 또한, 메모리에 직접 접근하는 명령어를 load, store 두 개로 제한할 만큼 메모리 접근을 단순화하고 최소화를 추구한다. 대신 레지스터를 적극 활용한다.
-> 하지만 사용 가능한 명령어 개수가 CISC보다 적으므로, CISC보다 많은 명령으로 프로그램을 작동시킬 수 밖에 없다.`

✏️ 기본 숙제

p. 125의 확인 문제 2번

설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워 보세요.

플래그 레지스터 : 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터
프로그램 카운터 : 메모리에서 가져올 명령어의 주소를 저장하는 레지스터
범용 레지스터 : 데이터와 주소를 모두 저장할 수 있는 레지스터
명령어 레지스터 : 해석할 명령어를 저장하는 레지스터

p. 155의 확인 문제 4번

다음 그림은 멀티코어 CPU를 간략하게 도식화 한 그림입니다. 빈칸에 알맞은 용어를 써 넣으세요. (빈 칸은 명령어를 처리하는 부분을 가리키고 있음)

답: 코어

📖추가 숙제

Ch.05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기

위쪽에 정리

profile
차근차근

0개의 댓글