본문 바로가기
Book

[혼공컴운]혼공학습단11기_2주차+기본, 선택미션

by suuuuunnng 2024. 1. 14.

앞의 글

2024.01.07 - [Book] - 혼공학습단11기_혼공컴운 시작

2024.01.07 - [Book] - [혼공컴운]혼공학습단11기_1주차+기본, 선택미션

 

혼공컴운 2주차

 

Chapter 4. CPU의 작동원리

04-1 ALU와 제어장치.

시작하기 전에

1장의 내용 중 CPU 에 대한 이야기가 있었다.

이번 장에선 CPU의 구성 요소 중 ALU와 제어장치에 대해 알아본다.

ALU와 제어장치가 어떤 정보를 내보내고 받아들이는지를 중심으로 두 장치의 역할을 학습!!

ALU

ALU는 레지스터를 통해 피연산자를 받아들이고, 제어장치로 부터 수행할 연산을 알려주는 제어 신호를 받아들인다.

그리고 레지스터와 제어장치로부터 받아들인 피연산자와 제어 신호로 산술 연산, 논리 연산 등 다양한 연산을 수행한다.

ALU가 내보내는 정보

CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 느리다. (레지스터를 통해서 오고가는 이유이기도)

연산을 수행한 결과는 특정 숫자, 문자, 그리고 메모리 주소가 될 수 있다. 이 결괏값은 바로 메모리에 저장되지 않고 일시적으로 레지스터에 저장됨.

ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장한다.

ALU는 계산 결과와 더불어 플래그를 내보낸다. (2장에서 나온 적이 있음.)

플래그란, 연산 결과에 대한 추가적인 상태 정보.

 

플래그 종류 의미 사용 예시

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

이러한 플래그는 CPU가 프로그램을 실행하는 도중 반드시 기억해야 하는 일종의 참고 정보이다.

그리고 플래그들은 플래그 레지스터라는 레지스터에 저장된다. 이름 그대로 플래그 값들을 저장하는 레지스터다.

제어장치

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

제어 신호는 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호.

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

1. 제어장치는 클럭 신호를 받아들인다.

클럭이란? 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위.

2. 제어장치는 '해석해야 할 명령어' 를 받아들인다.

CPU가 해석해야 할 명령어는 명령어 레지스터라는 특별한 레지스터에 저장됨. 제어장치는 이 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려준다.

3. 제어장치는 플래그 레지스터 속 플래그 값을 받아들인다.

4. 제어장치는 시스템 버스, 그 중 제어 버스로 전달된 제어 신호를 받아들인다.

제어신호는 CPU 뿐만 아니라 입출력장치를 비롯한 CPU 외부 장치도 발생시킬 수 있다. 제어장치는 제어 버스를 통해 외부로부터 전달된 제어 신호를 받아들이기도 한다.

제어장치가 내보내는 정보.

CPU 내부와 외부로 제어 신호를 내보낸다.

제어장치가 메모리에 저장된 값을 읽거나 메모리에 새 값을 쓰고 싶다면 메모리로 제어 신호를 내보낸다.

제어장치가 입출력장치의 값을 읽거나 입출력장치에 새로운 값을 쓰고 싶을 땐 입출력장치로 제어 신호를 내보낸다.

CPU 내부로 전달하는 제어 신호는 ALU에 전달하는 신호, 레지스터에 전달하는 제어 신호 2가지 종류가 있다.

ALU : 수행할 연산을 지시하기 위해

레지스터 : 레지스터 간 데이터 이동 또는 레지스터에 저장된 명령어를 해석하기 위해

마무리

핵심 포인트

  1. ALU는 레지스터로부터 피연산자를 받아들이고, 제어장치로부터 제어 신호를 받아 들인다.
  2. ALU는 연산 결과와 플래그를 내보낸다.
  3. 제어장치는 클럭, 현재 수행할 명령어, 플래그, 제어 신호를 받아들인다.
  4. 제어장치는 CPU 내부와 외부로 제어 신호를 내보낸다.

04-2 레지스터

시작하기 전에

명령어와 데이터는 실행 전후로 반드시 레지스터에 저장된다. 고로 레지스터에 저장된 값만 잘 관찰해도 프로그램의 실행 흐름을 파악 가능하다.

이번 챕터는 레지스터의 종류와 역할을 학습, 각 레지스터를 통해 명령어가 처리되는 과정을 이해하자

반드시 알아야 할 레지스터.

상용화된 CPU 속 레지스터들은 CPU마다 이름, 크기, 종류가 매우 다양하다.

이 중 여러 전공 서적에서 중요하게 다루는 8개의 레지스터를 학습. (아래 6개 + 2개 [스택 포인터] [베이스 레지스터] )

 

프로그램 카운터 [PC : Program Counter]

메모리에서 가져올 명령어와 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장.

명령어 카운터 [IP : Instruction Pointer] 라고 부르는 CPU 도 있음.

 

명령어 레지스터 [IR : Instruction Register]

해석할 명령어, 즉 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터.

 

메모리 주소 레지스터 [MAR : Memory Buffer Register]

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

CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거친다.

 

메모리 버퍼 레지스터 [MBR : Memory Buffer Register] // MDR 이라고도 부른다. (Data)

메모리와 주고받을 값 (데이터와 명령어) 을 저장하는 레지스터다. 

즉, 메모리에 쓰고 싶은 값이나 메모리부터 전달받은 값은 메모리 버퍼 레지스터를 거친다. 

CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고받을 값은 메모리 버퍼 레지스터를 거침.

 

범용 레지스터 [general purpose register]

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

데이터와 주소를 모두 저장할 수 있음. 현재 대다수의 CPU 는 모두 범용 레지스터를 갖고 있음.

 

플래그 레지스터 [flag register]

ALU 연산 결과에 따른 플래그를 플래그 레지스터에 저장하는데 이 레지스터는 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터.

 

특정 레지스터를 이용한 주소 지정 방식(1) : 스택 주소 지정 방식

프로그램 카운터, 스택 포인터, 베이스 레지스터 : 주소 지정에 사용될 수 있는 특별한 레지스터 들.

스택 포인터(stack pointer) : 스택 주소 지정 방식이란 주소 지정 방식에 사용되고, 프로그램 카운터와 베이스 레지스터는 변위 주소 지정 방식이라는 주소 지정 방식에 사용됨.

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

스택 포인터 : 스택의 꼭대기를 가리키는 레지스터. 즉, 스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터임.

스택 영역 : 메모리 안에 스택처럼 정해진 사용할 영역.

특정 레지스터를 이용한 주소 지정 방식(2) : 변위 주소 지정 방식

변위 주소 지정 방식 [displacement addressing mode]

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

이 방식을 사용하는 명령어는 연산 코드 필드, 레지스터 필드, 오퍼랜드 필드.

이 방식은 오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라 상대 주소 지정 방식과 베이스 레지스터 주소 지정 방식으로 나뉨.

상대 주소 지정 방식 : 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식.

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

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

마무리

핵심 포인트

  1. 프로그램 카운터는 메모리에서 가져올 명령어의 주소, 명령어 레지스터는 해석할 명령어를 저장.
  2. 메모리 주소 레지스터는 메모리의 주소, 메모리 버퍼 레지스터는 메모리와 주고 받을 데이터를 저장.
  3. 범용 레지스터는 데이터와 주소를 모두 저장, 플래그 레지스터는 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장.
  4. 스택 포인터는 스택 최상단의 위치를 저장.
  5. 베이스 레지스터에 저장된 주소는 기준 주소로서의 역할을 함.

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

시작하기 전에.

CPU가 하나의 명령어를 처리하는 프름인 명령어 사이클과 그 흐름을 방해하는 인터럽트에 대해 학습.

명령어 사이클

하나의 명령어를 처리하는 정형화된 흐름

프로그램 속 각각의 명령어들은 일정한 주기가 반복되며 실행되는데 이 주기를 뜻함.

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

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

간접 사이클 : 명령어를 실행하기 위해서는 메모리 접근을 한 번 더 해야하는데 해당 과정의 단계.

인터럽트

CPU의 작업을 방해하는 신호.

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

다만 이는 예외적인 상황을 마주쳤을 때 발생하는 인터럽트라서 보통 예외(exception) 이라고도 부른다.

비동기 인터럽트 : 입출력장치에 의해 발생하는 인터럽트.

또 다른 이름으로 하드웨어 인터럽트 라고도 부름.

하드웨어 인터럽트는 알림과 같다.

처리 순서

  1. 입출력장치는 CPU에 인터럽트 요청 신호를 보낸다.
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
  3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는 지여부를 확인한다.
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
  5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행.
  6. 인터럽트 서비스 루틴 실행이 끝나면 4번에서 백업한 작업을 복구하여 실행을 재개.

인터럽트 요청 신호 : 인터럽트는 CPU의 정상적인 실행 흐름을 끊는 것이라, 다른 누군가가 인터럽트하기 전엔 CPU에 물어봐야하는 것을 칭함.

인터럽트 플래그 [interrupt flag] : 요청 신호에 따라 CPU가 인터럽트 요청을 수용하기 위해선 플래그 레지스터에 활성화 되어있어야 하는 것을 칭함.

하드웨어 인터럽트에는 막을 수 있는 인터럽트[maskable interrupt]막을 수 없는 인터럽트[non maskable interrupt] 가 있다.

인터럽트 서비스 루틴

인터럽트를 처리하기 위한 프로그램 ( = 인터럽트 핸들러)

어떤 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리 및 작동할지에 대한 정보로 이루어진 프로그램.인터럽트 벡터 : 인터럽트 서비스 루틴을 식별하기 위한 정보.

마무리

핵심 포인트

  1. 명령어 사이클은 하나의 명령어가 처리되는 주기이며 인출, 실행, 간접, 인터럽트 사이클로 구성되어 있음.
  2. 인터럽트는 CPU의 정상적인 작업을 방해하는 신호다.
  3. 인터럽트의 종류에는 예외와 하드웨어 인터럽트가 있다.
  4. 인터럽트 서비스 루틴은 인터럽트를 처리하기 위한 동작들로 이루어진 프로그램이다.

Chapter 5. CPU 성능 향상 기법

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

시작하기 전에

클럭과 코어, 스레드라는 개념을 학습하고, 빠른 CPU를 만드는 설계 기법인 멀티 코어와 멀티스레드란 무엇인지 이해!!

클럭

클럭 속도 : Hz(헤르츠) 단위로 측정. 1초에 클럭이 몇 번 반복되는지를 나타냄.

클럭 속도가 높은 CPU는 빠르게 동작한다.

코어와 멀티 코어

코어 : 명령어를 실행하는 부품

기존의 CPU의 정의 였던 '명령어를 실행하는 부품' 은 코어를 뜻하고, 오늘날의 CPU는 '명령어를 실행하는 부품을 여러 개 포함하는 부품' 으로 명칭의 범위가 확장되었다.

멀티코어 CPU : 코어를 여러 개 포함하는 CPU, 이를 멀티코어 프로세서라고도 부름.

 

CPU의 종류

코어 수 프로세스 명칭

1 싱글 코어
2 듀얼 코어
3 트리플 코어
4 쿼드 코어
6 헥사 코어
8 옥타 코어
10 데카 코어
12 도데카 코어

2개 이상의 코어가 있는 CPU는 모두 멀티코어다.

스레드와 멀티스레드

스레드 : 실행 흐름의 단위(사전적 의미)

CPU에서 사용되는 스레드와 프로그래밍에서 사용되는 스레드는 용례가 다르기에 사전적 의미를 곧이곧대로 알기보단 엄밀하게 이해해야한다.

스레드는 2종류다. CPU에서 사용되는 하드웨어적 스레드, 프로그램에서 사용되는 소프트웨어적 스레드.

하드웨어적 스레드 : 하나의 코어가 동시에 처리하는 명령어 단위. ( = 논리 프로세서 )

멀티스레드 프로세서, 멀티스레드 CPU : 하나의 코어로 여려 명령어를 동시에 처리하는 CPU.

즉, 여러 개의 하드웨어 스레드를 지원하는 CPU를 뜻하기도 함.

하이퍼스레딩 : 인텔의 멀티스레드 기술

소프트웨어적 스레드 : 하나의 프로그램에서 독립적으로 실행되는 단위.

마무리

핵심 포인트

  1. 클럭 속도가 높은 CPU는 빠르게 작동한다.
  2. 코어란 CPU 내에서 명령어를 실행하는 부품.
  3. 멀티코어 프로세스란 여러 개의 코어를 포함하는 CPU
  4. 스레드에는 하드웨어적 스레드와 소프트웨어적 스레드가 있음.
  5. 멀티스레드 프로세스란 하나의 코어로 여러 개의 명령어를 동시에 실행할 수 있는 CPU.

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

시작하기 전에

명령어를 빠르고 효율적으로 처리하기 위해 CPU를 한시도 쉬지 않고 작동시키는 명령어 병렬 처리 기법을 알아본다.

명령어 파이프라인

명령어 처리 과정을 클럭 단위로 나누어 보면

1. 명령어 인출 (Instruction Fetch)

2. 명령어 해석 (Instruction Decode)

3. 명령어 실행 (Execute Instruction)

4. 결과 저장 (Write Back)

 

단, 이 순서가 정답은 아니다. 전공서적 마다 다르게 표현하기도 한다.

이처럼 공장 생산 라인 처럼 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝 이라고 한다.

파이프라인 위험 : 파이프라이닝이 높은 성능을 가져오지만, 특정 상황에서는 성능 향상에 실패하는 경우도 있음을 뜻함.

아래의 3개의 위험으로 분류한다.

 

데이터 위험 : 명령어 간 '데이터 의존성' 에 의해 발생함.

데이터 의존적인 두 명령어를 무작정 동시 실행하려고 하면 파이프라인이 제대로 작동하지 않는 경우를 뜻한다.

제어 위험 : 주로 분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화' 에 의해 발생한다.

제어 위험을 위해 사용하는 기술 중 하나가 분기 예측이다.

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

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

슈퍼스칼라

CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조.

슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 또는 슈퍼스칼라 CPU 라고 함.

비순차적 명령어 처리 

다수의 전공서에선 다루지 않지만, 오늘날 CPU 성능 향상에 크게 기여했으며 대부분 차용하는 기법.

OoOE 라고 줄여 부름. Out of order execution 을 줄여서 부름.

명령어들을 순차적으로 실행하지 않는 기법이다. 명령어의 '합법적인 새치기' 라고 함.

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

마무리

핵심 포인트

  1. 명령어 파이프라이닝은 동시에 여러 개의 명령어를 겹쳐 실행하는 기법.
  2. 슈퍼스칼라는 여러 개의 명령어 파이프라인을 두는 기법
  3. 비순차적 명령어 처리 기법은 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 기법.

05-3 CISC와 RISC

시작하기 전에

CPU의 언어인 ISA란 무엇인지 이해하고, 현대 CPU의 주요 설계 방식인 CISC 와 RISC 의 정의와 차이점에 대해 학습

명령어 집합.

CPU가 이해할 수 있는 명령어들의 모음. (명령어 집합 구조 [ISA] 라고도 부름.)

즉, CPU마다 ISA 가 다를 수 있다는 것.

ISA는 CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해할 지에 대한 약속이다.

CISC

Complex Instruction Set Computer 의 약자.

이름 그대로 복잡하고 다양한 명령어들을 활용하는 cpu 설계 방식이다.

CISC 는 다양하고 강력한 기능의 명령어 집합을 활용하기 때문에 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다.

단점 : 활용하는 명령어가 워낙 복잡, 다양한 기능을 제공하는 탓에 명령어의 크기와 실행되기까지의 시간이 일정치 않다.

그리고 복잡한 명령어 떄문에 명령어 하나를 실행하는 데에 여러 클럭 주기를 필요로 한다.

RISC

CISC 의 한계가 만들어낸 RISC

Reduced Instruction Set Computer 의 약자.

CISC 에 비해 명령어의 종류가 적고, 달리 짧고 규격화된 명령어, 되도록 1클럭 내외로 실행되는 명령어를 지향한다.

그리고 단순하고 적은 수의 고정 길이 명령어를 활용.

RISC 는 짧고 규격화된 명령어를 활용하기에 명령어 파이프 라이닝에 유리하다.

둘을 정리하여 비교해보는 표.

CISC RISC

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

마무리

핵심 포인트

  1. ISA는 CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속.
  2. CISC는 복잡하고 다양한 종류의 가변 길이 명령어 집합을 활용.
  3. RISC는 단순하고 적은 종류의 고정 길이 명령어 집합을 활용.

기본 미션

p.125의 확인 문제 2번, p.155의 확인 문제 4번 풀고 인증하기

P.125 문제 2번.
P. 155 문제 4번

 

선택 미션

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

코어 : 일종의 두뇌, CPU 내부에 물리적으로 탑재되어 있다. 명령어를 실행하는 부품으로 일컫는다.

스레드 : 사전적 의미로는 실행 흐름의 단위, 운영체제에선 프로세스 내 실작업을 수행하는 주체를 뜻한다.

하드웨어적 스레드 / 소프트웨어적 스레드로도 구분된다. 

멀티 코어 : 코어를 여러 개 포함하고 있는 CPU.

멀티 스레드 : 하나의 코어로 여러 명령어를 동시에 실행할 수 있는 CPU

 

 

2주차 마무리 소감

이번 2주차 과정은 저번 1주차보단 난이도가 있었다. 책으로 1회독할 땐 레지스터의 작동 과정을 글로 보니까 이해가 어려웠는데 인강(유튜브) 으로 2회독, 책 정리하면서 3회독을 하다보니 이젠 이해가 된다. ㅎㅎ;;

혼공학습단 하면서 좋은 점이 최소 2회독은 할 수 밖에 없다는 점... 그러다보니 정리본이 점점 길어진다.

최대한 요약하고, 정리를 해서 포스팅을 해보고 싶은데 내가 잘모르는 것은 다 기입하는 스타일이라 그런지 인강 중에 언급한 문장이나 추가로 설명해준 부분(기울기 처리) 중 중요한 부분은 다 기입했다... 그래서 긴 것 같다.

아직까진 비전공자 입장에서도 흥미있는(??) 내용들이라서 지치지 않고 하고는 있다.

다음 주차에도 3회독 해야할 듯 싶다.. ㅋ;;