IT

혼공단 2주차 정리: CPU 작동 원리와 성능 향상 기법 #혼공컴운 #혼자 공부하는 컴퓨터 구조+운영체제

BoBooBoo 2023. 1. 15. 23:49
반응형

 

책 목차

Chapter 04. CPU 작동 원리

  1. ALU와 제어장치
  2. 레지스터
  3. 명령어 사이클과 인터럽트

Chapter 05. CPU 성능 향상 기법

  1. 빠른 CPU를 위한 설계 기법
  2. 명령어 병렬 처리 기법
  3. CISC와 RISC

 

유투브 목차

8강. C언어의 컴파일 과정(추가 강의)

9강. CPU의 내부 구성 - ALU와 제어장치

10강. CPU의 내부 구성 - 레지스터

11강. 명령어 사이클과 인터럽트

12강. 빠른 CPU를 위한 설계 기법

 

 

문제 및 과제

p. 125 의 확인 문제 2 번

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

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

 

p. 155 의 확인 문제 4 번

다음 그림은 멀티코어 CPU를 간략하게 도식화한 그림입니다 빈칸에 알맞은 용어를 써 넣으세요.

[ 그림 생략]

코어 :

코어는 CPU 내에서 명령어를 처리하는 부품이고, CPU 는 이 코어를 여러 개 가질 수 있습니다. 이와 같은 CPU 를 멀티 코어 CPU 라고 부릅니다. 

 

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

아래 내용 중 12강 부분에 자세하게 정리!

 


 

C 언어 컴파일 과정 ( xxx.c -> xxx.exe )

전처리기 (Preprocessor)

  • 본격적으로 컴파일 하기 전에 처리할 작업
  • 외부에 선언된 다양한 소스 코드나 라이브러리 포함 (e.g. #include)
  • 프로그래밍의 편의를 위해 작성된 매크로 변환 (e.g. #define)
  • 컴파일할 영역 명시 (e.g. #if, #ifdef)
# 전처리가 된 .i 파일 생성
gcc -E hongong.c -o hongong.i
vi hongong.i

 

컴파일러 (Compiler)

  • 전처리가 완료된 파일도 여전히 소스 코드이기 때문에 저급 언어 (어셈플리어) 로 변환
# 컴파일해서 어셈블리어 파일로 변환
gcc -S hongong.i -o hongong.s
vi hongong.s

 

어셈블러 (Assembler)

  • 어셈블리어로 작성된 파일을 목적 코드 (Object file) 로 변경
gcc -o hongong.o hongong.s

 

링커 (Linker)

  • 여러 가지의 목적 파일을 실행 파일로 linking 하는 과정
  • 목적 파일과 실행 파일은 모두 기계어로 되어 있긴 함

 


 

 

ALU

ALU 가 받아들이는 정보과 결괏값

 

  • 피연산자와 제어신호를 받아들여서 계산(연산) 수행 후 결과를 레지스터에 저장하고 부가 정보는 플래그 레지스터에 저장
  • 예를 들면, 2의 보수로 음수를 표현하기 위해 필요한 플래그는 플레그 레지스터에 저장됨
  • 연산 결과가 결과를 담을 레지스터에 비해 너무 크면 플래그 레지스터 중 하나인 오버플로우 플래그에 저장

 

플래그의 종류

 

제어장치

  • 제어 신호 발생 및 명령어를 해석하는 장치
  • 클럭: 컴퓨터의 모든 부품들이 일사부불란하게 움지일 수 있게하는 시간 단위인 제어 신호

 

  • 해석할 명령어를 명령어 레지스터로부터 받아들임
  • 플레그 레지스터로부터 플래그 값도 함께 받아들임

플래그 값과 해석할 명령어 그리고 제어버 스로부터 제어 신호를를 받아 들임

 

  • CPU 내부인 레지스터와 ALU 로 제어신호를 보내는데, 레지스터가 어떤 행동을 할지,  ALU 가 어떤 연산을 수행할 지를 지시하기 위한 신호를 보냄
  • CPU 외부로는 메모리와 입출력 장치로 보내는데, 메모리에 어떤 값을 쓸지, 입출력 장치를 쓰거나 읽거나 테스트하라는 지시를 위한 신호를 보냄

 

 

레지스터

  • ALU 와 제어 장치는 프로그래머가 직접 다룰 일이 많지 않으나 상대적으로 레지스터는 직접 다룰 가능성이 높음
  • CPU 내부에는 다양한 역할을 가진 레지스터들이 있음
  • CPU 마다 레지스터의 종류가 갯수가 다르지만 대부분이 공통적으로 가지고 있는 레지스터들이 있음

 

1. 프로그램 카운터 (Program Counter)

  • 메모리에 가져올 명령어의 주소
  • 명령어 포인터 (Instruction Pointer) 라고 부르는 CPU 도 있음
  • 프로그램 카운터의 값이 바뀌는 것이 곧 프로그램이 실행되는 원리로 볼 수 있음

 

2. 명령어 레지스터

  • 해석할 명령어로 방금 메모리에서 읽어 온 명령어

 

3. 메모리 주소 레지스터

  • CPU가 읽어 들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터로 메모리의 주소를 저장
  • 이때 프로그램 카운터를 증가 시킴 (프로그램이 순차적으로 실행되는 원리)
  • 특정 메모리 주소로 실행 흐름을 이동하는 명령어를 실행할 때는 바뀔수도 있음 (e.g. JUMP, CONDITIONAL JUMP, CALL, RET 혹은 인터럽트 등)

 

4. 메모리 버퍼 레지스터

  • CPU가 데이터 버스로 주고 받을 때 거치는 레지스터

 

5. 플래그 레지스터

  • 연산 결과 또는 CPU 상태에 대한 부가적인 정보

 

6. 범용 레지스터

  • 다양하고 일반적인 상황에서 자유롭게 사용
  • 일반적으로 여러 개 있으며 주소, 명령어 등 아무거나 담음

 

7. 스택 포인터

  • 특정 레지스터를 이용한 주소 지정에 사용
  • 스택 주소 지정 방식에서 스택 포인터는 스택의 값이 어디 까지 차 있는지 저장

 

스택 주소 지정 방식

 

8. 베이스 레지스터

  • 주소 지정에 사용
  • 오퍼랜드의 필드 값(변위)와 특정 레지스터의 값 (예, 프로그램 카운터 혹은 베이스 레지스터) 을 더하여 유효주소를 얻는 변위 주소 지정 방식에서 사용

 

변위 주소 지정 방식
변위 주소 지정 방식에서 사용

 

(1) 상대 주소 지정 방식

  • 오퍼랜드 필드의 값 (변위) 과 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식

 

상대 주소 지정 방식

 

(2) 베이스 레지스터 주소 지정 방식

  • 오퍼랜드 필드의 값 (변위) 과 베이스 레지스터의 값 (기준) 을 더하여 유효 주소를 얻는 방식

베이스 레지스터 주소 지정 방식

 


 

CPU 는 메모리에 들어 있는 정해진 흐름 (명령어 사이클) 대로 처리하게 되어 있음

간혹 정해진 흐름을 끊는 것들이 있는데, 이를 인터럽트라고 함

 

메모리에 저장된 명령어를 실행하려면?

  • 먼저 메모리에서 CPU 로 가져옴 (인출 사이클)
  • 가져와서 실행 (실행 사이클)
  • 일반적으로 일출과 실행을 반복하는 방식

 

인출해도 바로 실행이 어려운 경우가 있음 (e.g. 간접 주소 지정 방식)

메모리에 추가로 접근하기 위한 간접 사이클을 동작하게 됨

 

인터럽트, Interrupt

  • CPU 가 얼른 처리해야 할 다른 작업이 생겼을 때 발생
  • 동기 인터럽트 (예외) 와 비동기 인터럽트 (하드웨어 인터럽트) 가 있음

 

동기 인터럽트 (예외, Exception)

  • CPU 가 예기치 못한 상황을 접했을 때 발생
  • 폴트, 트랩, 중단, 소프트웨어 인터럽트 ...

비동기 인터럽트 (HW Interrupt)

  • 주로 입출력장치에 의해 발생
  • 문제라기 보다는 알림의 역할
  • 프린터, 키보드 입력, 마우스 클릭 등

 

 

  • 입출력 작업 도중에 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트 사용
  • 입출력 장치는 일반적으로 CPU 에 비해 많이 느리다
  • 인터럽트가 없으면 CPU 가 계속 완료 여부를 확인해야 하기 때문에 알림을 기다리고 일을 함

 

인터럽트 처리 순서

 

CPU 가 인터럽트 요청을 받아들이려면?

  • 인터럽트 플래그를 보고 받아들일 수 있는 상태인지 확인부터 하고 받아 들임 (maskable Interrupt)
  • 긴급한 인터럽트의 경우 막을 수 없는 것도 있음 (Non-maskable Interrupt)

 

인터럽트 서비스 루틴

  • 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리할 지를 위한 프로그램
  • (ex) 키보드가 인터럽트 요청을 보내면 ~~하게 행동하기
  • 메모리에 저장되어 있으며 인터럽트가 발생되면 해당 메모리가 호출되면서 실행
  • 인터럽트 벡터를 보면 인터럽트 서비스 루틴의 시작점을 확인할 수 있음

 

 

 

CPU 의 속도를 빠르게 만드는 방법...

  1. 컴퓨터 부품들은 클럭 신호에 맞춰 일사불란하게 움직인다.
  2. CPU 는 명령어 사이클이라는 정해진 흐름에 맞춰 명령어를 실행한다.

 

그럼 클럭 속도를 빠르게 하면 되나? YES

  • 클럭 속도는 헤르츠 (Hz) 로 표현하며 1초에 클럭이 반복되는 횟수를 의미함

 

그럼 무조건 빠르게 하면 되는거 아닌가? NO

필요 이상으로 클럭을 높이면 발열이 심해짐

 

그럼 어떻게 할까? (1) 코어 수 늘리기 (2) 스레드 수 늘리기

 

코어, Core

  • 코어는 명령어를 실행하는 부품으로 여러 개가 존재할 수 있음
  • 멀티코어 프로세서는 여러 개의 코어를 포함하고 있는 CPU
  • 코어 수를 무한정 늘리면 속도가 빨라지나? NO. 반드시 비례하는 것은 아니다

 

멀티 코어 프로세서

 

스레드, Thread

  • 실행 흐름의 단위로 하드웨어적 스레드, 소프트웨어적 스레드로 나눌 수 있음

하드웨어 스레드

  • 하나의 코어가 동시에 처리하는 명령어 단위로 1코어 1스레드는 CPU 는 하나의 코어가 하나의 명령어를 한번에 처리하는 것을 의미하며 2코어 4스레드는 2 개의 코어가 각각 2 개의 명령어를 동시에 처리할 수 있음을 의미하며 이런 종류의 CPU 를 멀티 스레드 프로세서, 멀티 스레드 CPU 라고 함
  • 핵심은 레지스터로 하나의 코어 내 얼마나 많은 레지스터 세트가 있으냐에 따라 얼마나 많은 명령어를 동시에 처리할 수 있을지가 결정됨
  • 논리 프로세서라고도 부름

 

소프트웨어 스레드

  • 하나의 프로그램에서 독립적으로 실행되는 단위로 하드웨어적 스레드가 1개라도 여러개의 소프트웨어 스레드가 존재할 수 있음

소프트웨어 스레드

 

 

끝.

반응형