본문 바로가기
도서/혼공컴운

[혼공컴운] 2주차_CPU 작동 원리, CPU 성능 향상 기법

by ahrelee 2024. 7. 10.
2주차 
7/8 ~ 7/14
진도 Chapter 04 ~ 05
기본 숙제(필수) p. 125의 확인 문제 2번, p. 155의 확인 문제 4번 풀고 인증하기
추가 숙제(선택) Ch.05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기

 

04. CPU의 작동 원리

04-1. ALU와 제어장치

1) ALU

  • 받아들이는 정보
    • 계산을 하기 위한 정보
    • 피연산자와 제어 신호(수행할 연산에 대한 정보)가 필요
  • 내보내는 정보
    • 연산을 수행한 결과: 일시적으로 레지스터에 저장
    • 플래그: 부호, 제로, 캐리, 오버플로우, 인터럽트, 슈퍼바이저

 

2) 제어장치

  • 제어 신호를 내보내고, 명령어를 해석하는 부품
  • 제어 신호: 컴퓨터 부품을 관리하기 위한 전기 신호의 일종 
  • 받아들이는 정보
    • 클럭 신호: 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위
    • 해석해야 할 명령어(in 명령어 레지스터) 
    • 플래그 값(in 플래그 레지스터)
    • 제어 신호(in 제어 버스)
  • 내보내는 정보
    • CPU 외부에 전달하는 제어 신호:  to 메모리, 입출력장치 등 제어 버스
    • CPU 내부에 전달하는 제어 신호: to 레지스터, ALU 등 
더보기

p. 110 1번 

ALU가 연산한 결과가 101(2)이고, 부호 플래그가 1일 때, 이를 십진수로 변환한다면?

101(2)는 부호 플래그가 1이므로, 음수이다. 따라서, 이는 011(2)의 2의 보수를 취해서 나타낸 수 임을 알 수 있다.

따라서, 십진수로 변환한 결과는 -3이다.

 

04-2. 레지스터

1) 반드시 알아야 할 레지스터

  • 프로그램 카운터(PC; 명령어 포인터, IP): 메모리에서 읽어 들일 명령어의 주소를 저장
  • 명령어 레지스터(IR): 해석할 명령어, 메모리에서 방금 읽어 들인 명령어를 저장
  • 메모리 주소 레지스터(MAR): 메모리의 주소를 저장
  • 메모리 버퍼 레지스터(MBR; 메모리 데이터 레지스터, MDR): 메모리와 주고받을 데이터와 명령어를 저장
  • 플래그 레지스터: ALU 연산 결과 or CPU 상태에 대한 부가적인 정보 
  • 범용 레지스터: 데이터와 주소 모두 저장 가능
  • 스택 포인터: 스택 주소 지정 방식에 사용, 스택 꼭대기(마지막으로 저장한 값의 위치)를 가리키는 레지스터 
  • 베이스 레지스터: 변위 주소 지정 방식에 사용

 

2) 레지스터의 작동 과정

 

프로그램 카운터

-> 메모리 주소 레지스터

-> 주소 버스 and 제어 버스 -> 메모리 접근

-> 데이터 버스

-> 메모리 버퍼 레지스터

-> 명령어 레지스터

-> 프로그램 카운터 1 증가

-> 차례대로 실행

 

* 프로그램 카운터 작동 방식?

https://velog.io/@wejaan/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-stack-pointer-and-program-counter

 

3) 스택 주소 지정 방식

  • 스택과 스택 포인터를 이용한 주소 지정 방식
  • 스택은 메모리 안의 '스택 영역'에 위치

 

4) 변위 주소 지정 방식

  • 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 구하는 주소 지정 방식
  • 명령어 = 연산 코드 + 레지스터 + 오퍼랜드
  • 상대 주소 지정 방식
    • 오퍼랜드와 프로그램 카운터의 값을 더하여 유효주소를 얻는 방식
  • 베이스 레지스터 주소 지정 방식
    • 베이스 레지스터 == 기준 주소
    • 오퍼랜드 == 기준 주소로부터 떨어진 거리 

 

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

1) 명령어 사이클

  • CPU가 하나의 명령어를 처리하는 일정한 주기(정해진 흐름)
  • 인출 사이클: 메모리의 명령어를 CPU로 가지고 오는 단계
  • 실행 사이클: 가지고 온 명령어를 실행하는 단계, 제어 장치가 명령어를 해석하고, 제어 신호를 발생시킴.
  • 간접 사이클:  명령어가 간접 주소 지정 방식을 사용할 때 발생하는 추가적인 단계

 

2) 인터럽트

  • CPU의 작업을 방해하고, 즉각적인 주의를 필요로 하는 이벤트가 발생했음을 알리는 신호

(1) 동기 인터럽트(예외)

  • CPU에 의해 발생하는 인터럽트
  • 예외 상황에 주로 발생
  • ex. CPU가 실행하는 프로그램 상의 오류(잘못된 명령어, 0으로 나누기, 잘못된 메모리 접근 등)

(2) 비동기 인터럽트(하드웨어 인터럽트)

  • 주로 입출력장치에 의해 발생하는 인터럽트
  • 하드웨어 인터럽트

(3) 하드웨어 인터럽트 처리 순서

  • 입출력 장치: CPU로 인터럽트 요청 신호 발생
    • 인터럽트 요청 신호: 하드웨어가 CPU의 작업을 일시적으로 중단하고, 인터럽트 처리를 요구하는 신호
  • CPU: 인터럽트 여부 수신 시, 인터럽트 플래그 확인
    • 인터럽트 플래그: 인터럽트의 허용 여부를 제어하기 위한 플래그
  • CPU: 인터럽트 수용 가능 시, 작업 백업 후 인터럽트 벡터 참조하여 인터럽트 서비스 루틴 실행
    • 인터럽트 발생 시, 현재 작업 내용은 스택에 백업
    • 인터럽트 벡터: 인터럽트 서비스 루틴의 시작 주소를 포함하는 인터럽트 서비스 루틴을 식별하기 위한 정보. 인터럽트 요청을 보낸 대상으로부터 데이터 버스를 통해 인터럽트 벡터를 전달 받고, 이를 통해 특정 인터럽트 서비스 루틴을 처음부터 실행할 수 있음.
    • 인터럽트 서비스 루틴(인터럽트 핸들러): 인터럽트를 처리하기 위한 프로그램
  • 백업 작업 복구하여 실행 재개
    • 인터럽트 처리 후, 스택에 저장해 둔 값을 복구하여 작업 재개

(4) 인터럽트의 종류

  • 막을 수 있는 인터럽트: 인터럽트 플래그가 불가능으로 설정되어 있어 무시할 수 있는 인터럽트
  • 막을 수 없는 인터럽트: 우선순위가 가장 높음. 정전이나 하드웨어 고장으로 인한 인터럽트 등.

 

04-4. 예외의 종류

1) 예외의 종류

  • CPU가 작업을 복구해서 실행을 재개할 때 어떤 명령어부터 실행하느냐에 따라 폴트와 트랩으로 나뉨.
  • 폴트: 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개
  • 트랩: 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개(ex. 디버깅)
  • 중단: CPU가 심각한 오류를 발견하여 실행 중인 프로그램을 강제로 중단시킬 수밖에 없을 때 발생하는 예외
  • 소프트웨어 인터럽트: 시스템 호출 발생 시 발생

 

05. CPU 성능 향상 기법

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

1) 클럭

 

(1) 클럭

  • 컴퓨터 하드웨어에서 신호를 발생시키는 타이밍 장치

(2) 클럭 속도

  • 헤르츠(Hz) 단위로 측정
  • 클럭 속도가 높은 CPU는 빠르게 동작

(3) 오버클럭킹(overclocking)

  • 고성능을 요하는 순간에 최대 클럭 속도를 강제로 끌어올리는 기법 

 

2) 코어와 멀티코어

 

(1) 코어(core)

  • 명령어를 실행하는 부품

(2) 멀티코어

  • 멀티코어 CPU(멀티코어 프로세서): 코어를 여러 개(2개 이상) 포함하고 있는 CPU

(3) CPU의 종류

코어 수 프로세서 명칭
1 싱글코어
2 듀얼코어
3 트리플코어
4 쿼드코어
6 헥사코어
8 옥타코어
10 데카코어
12 도데카코어

 

 

3) 스레드와 멀티스레드

 

(1) 스레드

  • 실행 흐름 단위
  • 1코어 1스레드 CPU가 여러 스레드로 만들어진 프로그램을 실행할 수 있음.: 각 스레드는 작은 시간 단위로 번갈아가며 CPU를 할당받아 실행하므로 마치 여러 스레드가 동시에 실행되는 것처럼 보임.

(2) 하드웨어적 스레드

  • CPU에서 사용되는 스레드
  • 하나의 코어가 동시에 처리하는 명령어 단위
  • 논리 프로세서라고도 부름.
  • 하이퍼스레딩: 인텔의 멀티스레드 기술

(3) 소프트웨어적 스레드

  • 프로그램에서 사용되는 스레드
  • 하나의 프로그램에서 독립적으로 실행되는 단위

(4) 멀티스레드 프로세서(멀티스레드 CPU)

  • 하나의 코어로 여러 명령어를 동시에 처리
  • 멀티스레드 프로세서를 실제로 설계하는 것은 매우 복잡하지만, 가장 큰 핵심은 레지스터의 개수

* 1코어 1스레드 CPU도 여러 소프트웨어적 스레드를 만들 수 있다

 

(5) 논리 프로세서

  • CPU 내부의 논리 회로로, 연산과 제어 담당
  • 레지스터의 개수와 밀접한 관계

 

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

  • 명령어 병렬 처리 기법(ILP): CPU에서 명령어들을 동시에 처리하여 전체적인 성능을 향상시키는 기법

1) 명령어 파이프라인

 

(1) 명령어 처리 과정

  • 명령어 인출 -> 명령어 해석 -> 명령어 실행 -> 메모리 접근 -> 결과 저장
  • 같은 단계가 아니라면 CPU는 각 단계를 동시에 실행할 수 있음.

(2) 명령어 파이프라이닝

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

(3) 파이프라인 위험

  • 데이터 위험
    • 명령어 간 데이터 의존성에 의해 발생
    • 명령어 1 즉, R1에 R2 + R3 결괏값이 저장되어야 명령어 2를 수행할 수 있음.
명령어 1 : R1 <- R2 + R3 // R2 레지스터 값과 R3 레지스터 값을 더한 값을 R1 레지스터에 저장
명령어 2 : R4 <- R1 + R5 // R1 레지스터 값과 R5 레지스터 값을 더한 값을 R4 레지스터에 저장

 

  • 제어 위험
    • 분기 명령어 등에 의해 발생
    • 프로그램 카운터의 갑작스러운 변화로 미리 처리 중이었던 명령어가 쓸모 없어짐.
    • 이를 위해 분기 예측이라는 기술을 사용함.
    • 분기예측: 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출
  • 구조적 위험(자원 위험)
    • 하드웨어 리소스를 공유하는 것으로 인해 발생
    • 명령어들을 동시에 실행하는 과정에서 서로 다른 명령어가 같은 CPU 부품(ALU, 레지스터)을 사용하려고 할 때 발생

 

2) 슈퍼스칼라

  • CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조
  • 슈퍼스칼라 프로세서(슈퍼스칼라 CPU): 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU
  • 이론적으로 파이프 라인 개수에 비례해서 처리 속도가 증가하나, 그에 따라 파이프라인 위험도도 증가하여 파이프라인 개수에 비례하여 처리 속도가 증가하진 않음.

 

3) 비순차적 명령어 처리(OoOE)

  • 명령어를 프로그램에서 정의된 순서대로 처리하는 대신, 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인의 전체 성능을 최적화하는 기법

 

05-3. CISC와 RISC

1) 명령어 집합(명령어 집합 구조, ISA)

 

  • CPU가 이해하고 처리할 수 있는 명령어들의 전체 집합(하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속)
  • ex. 인텔: x86 or x86-64 ISA, 애플: ARM ISA
  • 같은 소스 코드를 컴파일 하더라도 CPU에 따라 나오는 기계어/어셈블리어의 종류가 다를 수 있다.

14강. 명령어 집합 구조, CISC와 RISC / https://www.youtube.com/watch?v=lJwIERMo_N4

 

 2) CISC

  • Complex Instruction Set Computer(복잡한 명령어 집합 컴퓨터)의 약자
  • ex. x86, x86-64
  • 다양하고 강력한 기능의 명령어를 제공하는 컴퓨터 아키텍처
  • 상대적으로 적은 후의 명령어로도 프로그램을 실행할 수 있음.
  • 가변 길이 명령어(명령어의 길이가 가변적이며, 여러 형식의 명령어를 지원)를 활용
  • 메모리를 아낄 수 있다는 장점이 있어 과거에 인기가 높았음.
  • 명령어가 복잡하고 다양하게 구성되어 있어 파이프라이닝을 구현하기 어려움. (치명적인 단점)
  • 한 명령어를 실행하는 데 여러 클럭 주기가 필요하므로 명령어 수행 시간이 길고, 실행 속도가 다양

 

3) RISC

  • Reduced Instruction Set Computer(간소화된 명령어 집합 컴퓨터)의 약자
  • 짧고 규격화된 명령어로 CISC에 비해 명령어의 종류가 적음.
  • 메모리 접근을 최소화하는 대신 레지스터를 더욱 효율적으로 활용하여 성능을 향상
  • ex. 메모리에 직접 접근하는 명령어: load, store 두 개로 제한 -> 대신, 레지스터를 십분 활용
  • 고정 길이 명령어: 명령어의 길이가 고정되어 있어 해석과 실행이 간편
  • 대부분의 명령어가 하나의 클럭 사이클 내에 실행되도록 설계되어 있어 빠른 실행 속도를 제공
  • 높은 성능과 파이프라이닝 구현 용이성

 

4) CISC와 RISC의 차이

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

 

 

기본 숙제(필수)

[p. 125의 확인 문제 2번]

더보기

4. 레지스터에 대한 설명으로 옳은 것을 고르세요.


1) 산술 연산과 논리 연산을 수행하는 부품입니다. : ALU

2) 제어 신호를 발생시킵니다. : 제어 장치

3) 명령어를 해석합니다. : 제어 장치

4) CPU 내에 있는 작은 임시 저장 장치입니다. : 레지스터

 

[p. 155의 확인 문제 4번]

더보기

4. 멀티코어 CPU를 간략하게 도식화한 그림에 알맞은 용어를 써 넣기

 

CPU
(            )                                    (            )

 

코어

 

추가 숙제(선택)

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

 

더보기

1) 코어와 멀티코어

 

(1) 코어(core)

  • 명령어를 실행하는 부품

(2) 멀티코어

  • 멀티코어 CPU(멀티코어 프로세서): 코어를 여러 개 포함하고 있는 CPU

2) 스레드와 멀티스레드

 

(1) 스레드

  • 실행 흐름 단위
  • 1코어 1스레드 CPU가 여러 스레드로 만들어진 프로그램을 실행할 수 있음.: 각 스레드는 작은 시간 단위로 번갈아가며 CPU를 할당받아 실행하므로 마치 여러 스레드가 동시에 실행되는 것처럼 보임.

(2) 하드웨어적 스레드

  • CPU에서 사용되는 스레드
  • 하나의 코어가 동시에 처리하는 명령어 단위
  • 하이퍼스레딩: 인텔의 멀티스레드 기술

(3) 소프트웨어적 스레드

  • 프로그램에서 사용되는 스레드
  • 하나의 프로그램에서 독립적으로 실행되는 단위

(4) 멀티스레드 프로세서(멀티스레드 CPU)

  • 하나의 코어로 여러 명령어를 동시에 처리
  • 멀티스레드 프로세서를 실제로 설계하는 것은 매우 복잡하지만, 가장 큰 핵심은 레지스터의 개수

(5) 논리 프로세서

  • CPU 내부의 논리 회로로, 연산과 제어 담당
  • 레지스터의 개수와 밀접한 관계

 

[참고자료]

- 강민철.『혼자 공부하는 컴퓨터구조+운영체제』. 한빛미디어. pp. 102-175.
- "[컴퓨터 공학 기초 강의] 혼자 공부하는 컴퓨터 구조+운영체제." YouTube, 한빛미디어, 2023.07.04., https://www.youtube.com/watch?v=bls_GjX-4U8&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=1&t=4s

- kangtegong. "Self-Learning CS." GitHub, 2024, https://github.com/kangtegong/self-learning-cs

 

 


 

2주 차 공부 완료!

 

이번 주는 한주의 시작에 힘든 일이 있었고, 다른 할 일이 많아서 진도가 조금 느렸다.

한 번 밀리니까 루틴이 깨져서 진도를 되찾기 힘들었지만, 일요일까지 꼭 끝내려고 노력했다.

 

영상 보면서 공부하는 것은 재미있는데,

글로 정리하려고 하니 생각보다 시간 투자를 많이 해야해서 앞으로는 좀 간단하게 정리하는 게 나을지 고민된다.

 

이번주에는 CPU를 구성하는 각 부품과 CPU 성능 향상 기법에 대해 공부했다.

시스템 프로그래밍 수업을 들으면서 어셈블리어를 조금 공부했었는데,

프로그램 작성하면서 레지스터는 많이 봤지만, 레지스터의 정확한 작동 원리는 몰랐었다.

CPU, 버스, 메모리 사이의 동작 과정을 그림을 통해 확실하게 알 수 있었고,

명령어 집합 공부 중 똑같은 코드도 명령어가 달라서 어셈블리어가 다르다는 사실도 알게 되었다.

 

명령어 사이클과 인터럽트에 대한 공부도 큰 도움이 되었다.

역시, 단어만 적당히 알고 있는 건 참 애매한 일이라는 생각이 들었다.

최근에 가상 머신 공부하면서 지금 사용하고 있는 컴퓨터의 코어와 논리 프로세서를 살펴보았었는데

코어, 스레드에 대한 설명을 통해 그 차이를 확실하게 알 수 있었다.

 

지금은 리눅스의 파이프 동작을 구현하는 과제를 하는 중인데,

명령어 파이프라인에 대한 설명을 봐서 반가웠다.

 

이제는 밀리지 말고 진도 잘 나가야겠다.

완주까지 파이팅!