ETC/컴퓨터 구조+운영체제

혼공학습단 12기 - CPU의 작동 원리, CPU의 성능 향상 기법

주눅 2024. 7. 15. 22:05

 

글을 조금 많~~이 늦게 올렸는데...

사실 지난 주는 다른 자격증 필기시험이 있었어서!!

주말까지 그걸 준비하느라 조금 늦었다 ^_^ㅠ

필기는 다행히 잘 붙었음.. 하핫 ~~ 🤘

 

1주차 숙제도 2주차까지 받아주셨으니까...

늦게나마 올려도 되는 거겠지

족장님... 되는 거죠...? 🥺 이젠 지각 안 할게요


숙제

1. 설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워 보세요. (125쪽 2번 문제)

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

드래그로 긁어보세요

 

 

2. 다음 그림은 멀티코어 CPU를 간략하게 도식화한 그림입니다.

빈칸에 알맞은 용어를 써 넣으세요. (155쪽 4번 문제)

01

이건 옆으로 넘겨보세요 ^_^v 


Chapter 04. CPU의 작동 원리

학습 목표 1. ALU와 제어장치에 대해 학습합니다.

학습 목표 2. 레지스터의 종류와 역할에 대해 학습합니다.

학습 목표 3. 명령어 사이클을 이해합니다.

학습 목표 4. 인터럽트의 개념을 이해합니다.

 

ALU이 받아들이는 정보

ALU는 레지스터를 통해 피연산자를 받아들이고,

제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들인다.

ALU는 이를 바탕으로 산술 연산, 논리 연산 등 다양한 연산을 수행한다.

 

ALU가 내보내는 정보

연산을 수행한 결괏값을 일시적으로 레지스터에 저장한다.

이와 함께 플래그를 내보내는데, 플래그Flag는 연산 결과에 대한 추가적인 상태 정보를 말한다.

ALU는 대표적으로 아래와 같은 플래그를 내보낸다.

이러한 플래그들은 플래그 레지스터에 저장된다.

 

플래그 종류 의미 사용 예시
부호 플래그 연산 결과의 부호를 나타냄. 1일 경우 결과가 음수
0일 경우 결과가 양수
제로 플래그 연산 결과가 0인지 그 여부를 나타냄. 1일 경우 연산 결과가 0
0일 경우 연산 결과가 0이 아님
캐리 플래그 연산 결과 올림수나 빌림수가 발생했는지를 나타냄. 1일 경우 올림수, 빌림수가 발생함
0일 경우 발생하지 않음
오버플로우* 플래그 오버플로우가 발생했는지를 나타냄. 1일 경우 오버플로우가 발생함
0일 경우 발생하지 않음
인터럽트 플래그 인터럽트가 가능한지를 나타냄. 1일 경우 인터럽트가 가능함
0일 경우 불가능
슈퍼바이저 플래그 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지를 나타냄. 1일 경우 커널 모드로 실행중,
0일 경우 사용자 모드로 실행중

*오버플로우Overflow : 연산 결과가 연산 결과를 담을 레지스터보다 큰 상황


 

제어장치

제어 신호를 내보내고, 명령어를 해석하는 역할을 한다.

제어 신호란 부품을 관리하고 작동시키기 위한 전기 신호다.

 

제어장치가 받아들이는 정보

 1) 클럭 신호

컴퓨터의 모든 부품은 클럭 신호에 맞춰 작동한다.

클럭clock이란, 컴퓨터의 모든 부품이 일사분란하게 움직일 수 있게 하는 시간 단위를 뜻한다.

 

2) 해석해야 할 명령어

CPU가 해석해야 할 명령어는 명령어 레지스터에 저장된다.

제어장치는 이 레지스터로부터 명령어를 받아들이고 해석한다.

 

3) 플래그의 값

플래그 레지스터 속 플래그의 값을 받아들인다.

제어장치는 이를 참고하여 새로운 제어 신호를 발생시킨다.

 

4) 제어 신호

제어 신호는 CPU 외부 장치도 발생시킬 수 있다.

제어 장치는 시스템버스(그중에서도 제어 버스)로 전달된 제어 신호를 받아들인다.

 

제어장치가 내보내는 정보

크게 두가지.

CPU 외부에 전달하는 제어 신호, CPU 내부에 전달하는 제어 신호가 있다.

 

1) CPU 외부에 전달하는 제어 신호

(=제어 버스로 내보내는 제어 신호)

제어장치가 메모리에 저장된 값을 읽거나, 새 값을 쓰기 위해 보내는 제어 신호와

입출력장치의 값을 읽거나 새 값을 쓰기 위해 보내는 제어 신호가 있다.

 

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

ALU가 수행할 연산을 지시하기 위해 보내는 제어 신호,

레지스터 간 데이터를 이동시키거나 레지스터의 명령어를 해석하기 위한 제어 신호를 보낸다.


 

우리가 알아야 할 레지스터는 총 여덟 개다.

이 레지스터들은 저마다의 역할이 있고, 그에 알맞은 내용을 저장한다.

 

프로그램 카운터PC; Program Counter

메모리에서 가져올 명령어의 주소를 저장한다.

명령어 포인터IP; Instruction Pointer라고 부르기도 한다.

 

명령어 레지스터IR; Instruction Register

메모리에서 방금 읽어들인 명령어(=해석할 명령어)저장한다.

제어장치는 IR 속의 명령어를 받아들이고 해석한 뒤 제어신호를 내보낸다.

 

메모리 주소 레지스터MAR; Memory Address Register

메모리의 주소를 저장하는 레지스터.

읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 MAR를 거치게 된다.

 

메모리 버퍼 레지스터MBR; Memory Buffer Register

데이터와 명령어를 저장하는 레지스터.

메모리에 쓰고 싶은 값, 메모리로부터 전달받은 값이 MBR을 거친다.

메모리 데이터 레지스터MDR; Memory Data Register라고도 부른다. 

 

범용 레지스터general purpose register

다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터.

데이터와 주소 모두를 저장할 수 있다.

일반적으로 CPU 안에는 여러 개의 범용 레지스터가 존재한다.

 

플래그 레지스터flag register

연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터. 

 

스택 주소 지정 방식

스택과 스택 포인터를 이용한 주소 지정 방식.

스택 포인터란, 스택의 꼭대기를 가리키는 레지스터로

가장 마지막으로 저장한 값의 위치를 저장한 레지스터를 뜻한다.

 

변위 주소 지정 방식displacement addressing mode

오퍼랜드 필드의 값과 특정 레지스터의 값을 더해 유효 주소를 얻어내는 방식.

크게 두 가지로 나뉜다.

 

1) 상대 주소 지정 방식 relative addressing mode

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

프로그래밍 언어의 if문과 유사하다.

분기하여 특정 주소의 코드를 실행할 때 주로 사용됨.

 

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

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

베이스 레지스터는 '기준', 오퍼랜드는 '기준으로부터 떨어진 거리'의 역할을 한다.

기준 주소로부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산한다.


 

CPU가 명령어를 처리하는 과정에는 정해진 흐름이 있고, 이 흐름을 반복하며 명령어들을 처리한다.

이렇게 명령어를 처리하는 정형화된 흐름명령어 사이클Instruction cycle이라고 한다.

그리고 이 흐름이 끊어지는 상황인터럽트Interrupt라고 한다.

 

명령어 사이클

프로그램 속 명령어들은 명령어 사이클이 반복되며 실행된다.

메모리에 있는 명령어를 CPU로 가져오는 단계를 인출 사이클fetch cycle,

CPU로 가져온 명령어를 실행하는 단계를 실행 사이클execution cycle이라고 한다.

명령어를 실행하기 위해 메모리에 한번 더 접근해야 하는 경우, 사이에 간접 사이클indirect cycle을 거친다.

 

이런 느낌

 

인터럽트

CPU가 수행 중인 작업은 방해를 받아 잠시 중단될 수 있다. 이러한 작업 방해 신호를 인터럽트라 한다.

인터럽트에는 크게 두 가지 종류가 있다.

 

동기 인터럽트synchronous interrupts

CPU에 의해 발생하는 인터럽트.

명령어를 수행하다 예상치 못한 상황에 마주했을 때 발생한다.

예외excpetion이라고 부르기도 한다.

 

비동기 인터럽트asynchronous interrupts

주로 입출력장치에 의해 발생하는 인터럽트.

CPU에게 작업을 부탁받은 입출력장치가 완료 알림을 보낼 때,

키보드, 마우스 같은 입출력 장치가 어떠한 입력을 받아들였을 때 인터럽트를 보낸다.

하드웨어 인터럽트라고 부르기도 한다.

 

+) 하드웨어 인터럽트의 처리 순서

모든 CPU는 인터럽트를 같은 방식으로 처리한다.

 

입출력장치가 CPU에 인터럽트 요청 신호를 보냄

CPU는 항상 실행 사이클이 끝나고 명령어를 인출하기 전, 인터럽트 여부를 체크

CPU가 인터럽트 요청을 확인하고 인터럽트 플래그를 통해
현재 인터럽트를 받아들일 수 있는지 그 여부를 확인함

받아들일 수 있다면 지금까지의 작업을 백업

CPU는 인터럽트 벡터를 참조하며 인터럽트 서비스 루틴을 실행

인터럽트 서비스 루틴이 끝나면, ④에서 백업해 둔 작업으로 복귀


 

인터럽트 요청 신호

인터럽트는 CPU의 정상 흐름을 끊는 행위이기 때문에,

인터럽트 하기 전 먼저 인터럽트 요청을 보내야 한다. 이를 인터럽트 요청 신호라 한다.

 

인터럽트 요청을 받아들이기 위해선

플래그 레지스터의 인터럽트 플래그interrupt flag가 활성화되어 있어야 한다.

인터럽트 플래그가 활성화된 상태라면 CPU는 요청을 받아들이고 인터럽트를 처리한다.

 

CPU가 중요한 작업을 처리하는 중이거나, 방해를 받지 않아야 할 때 비활성화된다.

인터럽트 플래그가 비활성화된 상태라면 인터럽트 요청을 무시한다.

 

하지만 모든 인터럽트를 인터럽트 플래그로 통제할 수는 없음.

하드웨어 인터럽트는 막을 수 있는 인터럽트maskavle interrupt(인터럽트 플래그로 통제 가능)

막을 수 없는 인터럽트non-maskable intterupt(우선순위가 가장 높음. 정전, 하드웨어 고장 등)로 나눌 수 있다.

 

인터럽트 서비스 루틴ISR; Interrupt Service Routine

인터럽트 핸들러Intterupt handler라고 부르기도 한다.

CPU는 인터럽트 요청을 받아들인 후 ISR을 실행하는데, 이는 어떤 인터럽트가 발생했을 때

해당 인터럽트를 어떻게 처리하고 작동할지에 대한 정보가 담긴 프로그램이다.

메모리에는 여러 가지 인터럽트 서비스 루틴이 저장되어 있다.

(인터럽트를 처리하는 방식이 입출력장치에 따라 다르기 때문)

 

CPU는 여러가지 ISR를 구분하기 위해 인터럽트 벡터Interrupt vector를 사용한다.

CPU는 요청을 보낸 대상으로부터 인터럽트 벡터를 함께 전달받는데,

인터럽트 벡터는 인터럽트 서비스 루틴을 식별하기 위한 정보로 벡터를 알면 서비스 루틴의 시작 주소를 알 수 있다.

이를 통해 특정 서비스 루틴을 처음부터 실행할 수 있게 된다.

 

인터럽트를 포함한 CPU의 명령어 사이클

Chapter 05. CPU 성능 향상 기법

학습 목표 1. 빠른 CPU를 위한 설계 기법을 학습합니다.

학습 목표 2. 빠른 CPU를 위한 명령어 병렬 처리 기법을 학습합니다.

학습 목표 3. RISC와 CISC의 차이에 대해 이해합니다.

 

클럭

클럭 속도는 헤르츠(Hz) 단위로 측정한다.

클럭 속도가 높은 CPU는 일반적으로 성능이 좋으며, 클럭 속도가 CPU 속도 단위로 간주되기도 한다.

 

강제로 클럭 속도를 최대로 끌어올리는 방법을 오버클럭킹overclocking이라고 한다.

 

코어와 멀티코어

코어CPU 내에서 명령어를 실행하는 부품을 뜻함. 한 CPU에 코어가 여러 개 있을 수 있다.

코어를 여러 개 포함하고 있는 CPU를 멀티 코어multi-core CPU, 혹은 멀티코어 프로세서라고 한다.

 

스레드와 멀티스레드

1) 하드웨어적 스레드

이 경우 스레드는 '하나의 코어가 동시에 처리하는 명령어의 단위'를 의미한다.

 

아래 그림처럼 명령어를 실행하는 부품이 총 두 개,

한 번에 네 개의 명령어를 처리할 수 있는 CPU는 '2코어 4스레드 CPU'가 된다.

 

이처럼 하나의 코어로 여러 개의 명령어를 동시에 처리할 수 있는 CPU를

멀티스레드multithread 프로세서 혹은 멀티스레드 CPU라고 한다.

+) 인텔의 멀티스레드 기술은 '하이퍼스레딩hyper-threading'이라고 한다.

 

2) 소프트웨어적 스레드

여기서 스레드는 '하나의 프로그램에서 독립적으로 실행되는 단위'를 뜻한다.

프로그램은 프로그램의 여러 부분이 동시에 실행되기도 한다. ←소프트웨어적 멀티스레드

 


 

명령어 병렬 처리 기법ILP; Instruction-Level Parallelism

명령어를 동시에 처리하여 CPU를 쉬지 않게끔 작동시키는 방법.

총 세 가지 종류가 있다.

 

1) 명령어 파이프라이닝Instruction pipelining

명령어 처리 과정은 다음과 같이 요약할 수 있다.

명령어 인출→명령어 해석 →명령어 실행 →결과 저장

 

같은 단계가 겹치지만 않으면 CPU는 아래 그림과 같이 각 단계를 동시에 실행할 수 있다.

  t0 t1 t2 t3 t4 t5
명령어1 인출 해석 실행 저장    
명령어2   인출 해석 실행 저장  
명령어3     인출 해석 실행 저장
명령어4       인출 해석 실행
명령어5         인출 해석

 

이처럼 명령어를 명령어 파이프라인instruction pipeline에 넣고 동시에 처리하는 기법을

명령어 파이프라이닝이라고 한다.

 

하지만 명령어 파이프라이닝이 항상 성능 향상에 도움이 되는 것은 아니다.

성능 향상에 실패하는 경우를 파이프라인 위험pipeline hazard라고 부른다.

크게 세 가지로 나뉜다.

 

1-1) 데이터 위험data hazard

명령어 간의 데이터 의존성에 의해 발생한다.

데이터 의존적인 두 명령어를 동시에 실행하려고 하면

파이프라인이 제대로 작동하지 않는 것을 뜻한다.

 

1-2) 제어 위험control hazard

분기 등으로 인한 프로그램 카운터의 갑작스러운 변화에 의해 발생한다.

이를 위해 분기 예측branch prediction이라는 기술을 사용하기도 한다.

분기 예측은 프로그램이 어디로 분기할지를 미리 예측한 후, 그 주소를 인출하는 기술이다.

 

1-3) 구조적 위험structural hazard

명령어를 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 CPU를 사용하려고 할 때 발생한다.

자원 위험resource hazard이라고도 한다.


 

2) 슈퍼스칼라Superscalar

오늘날 대부분의 CPU는 여러 개의 파이프라인을 사용한다.

CPU 내부에 여러 개의 파이프라인을 포함한 구조슈퍼스칼라라고 한다.

 

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

명령어들을 순차적으로 처리하지 않는 기법.

파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는

명령어 병렬 처리 기법이다.


 

명령어 집합Instruction set

CPU가 이해할 수 있는 명령어의 모음을 명령어 집합,

또는 명령어 집합 구조ISA; Instruction Set Architecture이라고 한다.

CPU마다 ISA가 다를 수 있다.

 

크게 CISC와 RISC 두 가지 종류가 있다.

 

1) CISC

Complex Instruction Computer의 약자.

'복잡한 명령어 집합을 활용하는 컴퓨터'를 의미한다.

 

CISC는 다양하고 강력한 명령어 집합을 활용하기 때문에,

명령어의 형태와 크기가 다양한 가변 길이 명령어를 사용한다. 

이는 적은 수의 명령어로 프로그램을 실행시킬 수 있음을 의미한다.

메모리 공간을 절약할 수 있다는 장점이 있다.

 

하지만, 명령어가 복잡한 탓에 명령어의 크기와

실행되기까지의 시간이 일정하지 못하다는 단점이 있다.

명령어 하나를 실행하는 데에 여러 클럭 주기를 필요로 한다.

파이프라이닝이 어렵다.

 

2) RISC

Reduced Instruction Set Computer의 약자.

CISC에 비해 명령어의 종류가 적고, 짧고 규격화된 고정 길이 명령어를 사용하며,

1클럭 내외로 명령어가 실행된다는 특징이 있다.

→ CISC보다 파이프라이닝에 유리하다는 장점이 있다.

 

하지만 CISC보다 사용 가능한 명령어가 적기 때문에

RISC는 CISC보다 더 많은 명령으로 프로그램을 실행시킨다.

CISC RISC
복잡하고 다양한 명령어 단순하고 적은 명령어
가변 길이 명령어 고정 길이 명령어
다양한 주소 지정 방식 적은 주소 지정 방식
프로그램을 이루는 명령어의 수가 적음 프로그램을 이루는 명령어의 수가 많음
여러 클럭에 거쳐 명령어 수행 한 클럭 내외로 명령어 수행
파이프라이닝 어려움 파이프라이닝 쉬움