혼공학습단

혼공학습단 10기 - 혼공컴운 (2주차)

노루동산 2023. 7. 13. 17:30

 

2주 차 목표

# 진도 기본 미션 선택 미션
2주차
(7/10 ~ 7/16)
Chapter 04 ~ 05 p. 125의 확인 문제 2번, p. 155의 확인 문제 4번 풀고 인증하기 Ch.05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기

 

첫 주차는 맛보기였다는 것처럼

점점 어려운 내용이 늘어가는 2주 차

이번 주 주말에 시간이 없어, 평일 안에 공부하느라 애먹었다. ㅎㅎ

 

 

기본 미션

 

p.125 확인 문제 2번

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

보기: 프로그램 카운터, 명령어 레지스터, 플래그 레지스터, 범용 레지스터

 

- (     1     ): 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터

- (     2     ): 메모리에서 가져올 명령어의 주소를 저장하는 레지스터

- (     3     ): 데이터와 주소를 모두 저장할 수 있는 레지스터

- (     4     ): 해석할 명령어를 저장하는 레지스터

 

A. 1: 플래그 레지스터, 2: 프로그램 카운터, 3: 범용 레지스터, 4: 명령어 레지스터

 

 

p.155 확인 문제 4번

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

 

A. 코어

 

선택 미션

 

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

코어와 멀티 코어

 

코어

- CPU 내부의 '명령어를 실행하는 부품' 지금까지 다루었던 CPU의 개념을 코어의 개념이라 해도 좋다.

 

멀티 코어

- 코어는 여러 개 존재할 수 있다.

- 초기 CPU에는 코어가 하나뿐이었지만 현재는 CPU 하나에 여러 코어가 존재한다.

- 코어가 여러 개인 CPU는 멀티코어(multi-core) CPU 또는 멀티코어 프로세서라고 부르며, 코어가 하나뿐인 CPU는 싱글코어(single-core) CPU라 부른다.

 

스레드와 멀티 스레드

 

스레드

- 사전적 의미는 '실행 흐름의 단위'

- 하드웨어적 스레드(CPU에서 사용)와 소프트웨어적 스레드(프로그램에서 사용)로 나뉜다.

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

- 소프트웨어적 스레드'하나의 프로그램에서 독립적으로 실행되는 단위'를 의미한다.

 

멀티 스레드

- 하나의 코어여러 개의 명령어동시에 실행할 수 있는 CPU가 존재하며, 이를 멀티스레드(multithread) 프로세서 또는 멀티스레드 CPU라고 부른다.

- 2개의 코어가 있고 각 코어가 명령어를 2개씩 실행할 수 있다면, 2 코어 4 스레드 CPU라 부른다.

- 멀티스레드 프로세서를 설계하는 가장 큰 핵심은 레지스터로, 프로그램 카운터 등 하나의 명령어 처리에 꼭 필요한 레지스터를 스레드 수만큼 가지고 있어야 한다.

 

 

메모

더보기

04 - 1 ALU와 제어장치

1. ALU는 CPU에서 계산을 담당하는 회로이다. 
  - 받아들이는 정보: 레지스터 -> 피연산자 / 제어장치 -> 제어신호(수행할 연산).
  - 내보내는 정보: 결괏값 -> 레지스터 / 추가적인 상태 정보 '플래그(flag)' -> 플래그 레지스터.
2. 플래그의 종류
  - 부호 플래그: 연산 결과의 부호를 나타냄.
  - 제로 플래그: 연산 결과가 0인지 여부를 나타냄.
  - 캐리 플래그: 연산 결과에 올림수나 빌림수가 발생했는지 여부를 나타냄.
  - 오버플로우 플래그: 오버플로우가 발생했는지 나타냄.
  - 인터럽트 플래그: 인터럽트가 가능한지를 나타냄.
  - 슈퍼바이저 플래그: 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지 나타냄.
3. 제어장치
  - 받아들이는 정보: 클럭(모든 부품이 움직일 수 있게 하는 시간 단위) / 명령어 레지스터 -> '해석해야 할 명령어' / 플래그 레지스터 -> 플래그 / 제어 버스 -> 제어 신호.
  - 내보내는 정보: 
    - CPU 내부: ALU에 수행할 연산을 지시하기 위한 제어 신호, 레지스터 간 데이터를 이동이나 명령어 해석을 위한 제어 신호.
    - CPU 외부: 메모리에 저장된 값을 읽거나 쓰기 위한 제어 신호, 입출력장치의 값을 읽거나 쓰기 위한 제어 신호.

 

04 - 2 레지스터

1. 레지스터는 CPU마다 종류가 매우 다양하나, 대부분 공통적인 중요 레지스터가 존재함.
  - 프로그램 카운터(PC; Program Counter, 명령어 포인터(IP; Instruction Pointer)): 메모리에서 읽어 들일 명령어의 주소 저장.
  - 명령어 레지스터(IR; Rnstruction Register): 해석할 명령어를 저장 (방금 메모리에서 받아들인 명령어).
  - 메모리 주소 레지스터(MAR; Memory Address Register): 메모리의 주소를 저장. CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 거리는 레지스터.
  - 메모리 버퍼 레지스터(MBR; Memory Buffer Register, 메모리 데이터 레지스터(MDR; Memory Data Register): 메모리와 주고받을 값. CPU가 정보를 데이터 버스로 주고받을 때 거치는 레지스터.
  - 플래그 레지스터(flag register): 연산 결과 또는 CPU 상태에 대한 부가적인 정보 저장.
  - 범용 레지스터(general purpose register): 범용적으로 사용 가능. 여러 개 존재.
  - 스택 포인터(stack pointer): 스택 주소 지정 방식에 사용. 스택의 꼭대기를 가리킴.
  - 베이스 레지스터(base register): 변위 주소 지정 방식에 사용. 기준 주소를 저장.
2. 스택 주소 지정 방식: 스택과 스택 포인터를 이용한 주소 지정 방식. 메모리 안의 스택 영역에 주소 저장.
3. 변위 주소 지정 방식(displacement addressing mode): 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더해 유효 주소를 얻음. 명령어는 연산 코드 필드, 값을 더할 레지스터를 나타내는 레지스터 필드, 오퍼랜드 필드로 이루어짐.
  - 상대 주소 지정 방식: 변위와 프로그램 카운터의 값을 더하는 방식. 프로그램 카운터의 주소에서 변위를 더함. (ex. if문 등 분기)
  - 베이스 레지스터 주소 지정 방식: 변위와 베이스 레지스터의 값을 더하는 방식. 기준 주소가 담기며 변위를 더함. (ex. MMU)


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

1. 명령어 사이클(instruction cycle): 프로그램 속 명령어들이 실행되는 일정한 주기.
  - 인출 사이클(fetch cycle): 메모리로부터 명령어를 CPU로 가져오는 단계.
  - 실행 사이클(execution cycle): CPU로 가져온 명령어를 실행하는 단계.
  - 간접 사이클(indirect cycle): 메모리 접근이 추가적으로 필요할 때 단계.(ex 간접 주소 지정 방식)
  - 인터럽트 사이클(interrupt cycle): 인터럽트가 발생했을 때 단계.
2. 인터럽트(interrupt): CPU의 작업을 방해하는 신호. CPU가 주목해야 할 때, CPU가 급히 처리할 다른 작업이 생겼을 때.
  - 동기 인터럽트(synchronous interrupt, 예외(exception)): CPU가 예외적인 상황에 마주쳤을 때.
  - 비동기 인터럽트(asynchronous interrupt, 하드웨어 인터럽트): 알림. 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용.
3. 인터럽트 처리 순서: 입출력장치에서 인터럽트 요청 신호 보냄 -> CPU는 실행 사이클이 끝나고 인터럽트 여부를 확인 -> 인터럽트 플래그를 통해 가능 여부 확인 -> 레지스터의 작업 내역 스택에 백업 -> 인터럽트 백터 참조해 인터럽트 서비스 루틴 실행 -> 작업 내용 복구, 작업 재개
  - 인터럽트 서비스 루틴(ISR; Interrupt Service Routine, 인터럽트 핸들러(interrupt handler)): 인터럽트를 처리하는 프로그램. 프로그램이기 때문에 메모리에 저장되어 있다. 인터럽트가 발생하면 인터럽트 서비스 루틴으로 점프해 실행. 끝나면 다시 기존 작업으로 점프한다.
  - 인터럽트 벡터(interrupt vector): 인터럽트를 보내는 주체에 따라 인터럽트 서비스 루틴을 실행하기 위해, 시작점을 식별할 수 있는 정보.

 

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

1. 일반적으로 CPU는 클럭 속도가 높을수록 성능이 좋기 때문에 CPU의 속도 단위로 간주된다. 클럭 속도는 헤르츠(Hz) 단위로 측정되며 이는 1초에 클럭이 몇 번 반복되는지를 나타낸다.
2. CPU의 성능에 영향을 주는 것은 클럭 속도 이외에도 코어와 스레드가 있다.
  - 코어(Core): CPU 안의 '명령어를 실행하는 부품' 옛날에는 하나밖에 존재하지 않았으나(싱글 코어(single-core)) 현재에는 CPU 하나에 여러 개의 코어가 존재(멀티 코어(multi-core)). 코어가 많다고 무조건 빨라지지는 않음. 코어마다 처리할 명령어들을 얼마나 적절하게 분배하느냐가 관건.
  - 스레드(thread)
    - 하드웨어 스레드: 하나의 코어가 동시에 처리하는 명령어의 단위. CPU에 두 개의 코어가 있고 각자 두 개의 명령어를 처리할 수 있으면 2 코어 4 스레드 CPU라 부르며 이렇게 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드(multithread) 프로세서 또는 멀티스레드 CPU라고 한다.
    - 소프트웨어 스레드: 하나의 프로그램에서 독립적으로 실행되는 단위. 1 코어 1 스레드 CPU도 소프트웨어 스레드를 여러 개 실행 가능.
3. 멀티스레드 프로세서: 하나의 명령어를 실행하는데 필수적인 레지스터 세트를 여러 개 가지고 있으면, 멀티스레드 프로세서를 설계 가능.
  - 논리 프로세서(logical processor): 프로그램은 CPU가 몇 코어 몇 스레드인지 알 수 없음. 동시에 처리하는 명령어를 각자 하나의 프로세서로 인식. (ex 2 코어 4 스레드 = 논리 프로세서 8)


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

1. 명령어 병렬 처리 기법(ILP; Instruction-Level Parallelism)은 대표적으로 명령어 파이프라이닝, 슈퍼스칼라, 비순차적 명령어 처리가 있다.
2. 명령어 파이프라인(instruction pipeline)
  - 명령어가 처리되는 과정: 명령어 인출(Instruction Fetch) -> 명령어 해석(Instruction Decode) -> 명령어 실행(Execute Instruction) -> 결과 저장(Write Back)
  - 이 과정은 같은 단계가 겹치지만 않는다면 각 단계를 동시에 실행할 수 있다. (다른 명령어를 인출할 때, 또 다른 명령어는 해석 단계) 이렇게 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝(instruction pipelining)이라 함.
  - 파이프라인 위험(pipeline hazard): 파이프라인이 올바르게 작동되지 않는 상황.
    - 데이터 위험(data hazard): 명령어 간 '데이터 의존성'에 의해 발생.
    - 제어 위험(control hazard): 프로그램 카운터의 갑작스러운 변화에 의해 발생.
    - 구조 위험(structural hazard, 자원 위험(resource hazard)): 서로 다른 명령어가 동시에 같은 CPU 부품(ALU, 레지스터...)을 사용하려 할 때 발생.
3. 슈퍼스칼라(superscalar): CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조. 멀티스레드 프로세서가 사용 가능함. 그러나 파이프라인 위험도도 증가하기 때문에 비례하여 처리 속도가 증가하진 않음.
4. 비순차적 명령어 처리(OoOE: Out-of-order execution): a = 1, b = 2, c = a + b와 같은 명령어가 순서대로 들어가 있어 데이터 위험으로 병렬 처리가 불가능할 경우, 의존성 없는 명령어들과 순서를 바꾸는 것으로 병렬적으로 처리하도록 만들 수 있다.


05 - 3 CISC와 RISC

1. 명령어 집합(구조)(instruction set, ISA; Instruction Set Architecture): CPU가 이해할 수 있는 명령어들의 집합. ISA가 다르면 CPU 하드웨어 설계에도 큰 영향을 미침. 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속으로도 볼 수 있음.
2. CISC(Complec Instruction Set Computer): 복잡하고 다양한, 명령어의 형태와 크기가 다양한 가변 길이 명령어 활용.
  - 장점: 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있음. 메모리를 최대한 아낄 수 있음.
  - 단점: 명령어 하나하나의 실행 시간이 가지각색이라 명령어 파이프라이닝이 어려움. 대다수의 복잡한 명령어는 사용 빈도가 낮음.
3. RISC(Reduced Instruction Set Computer): 종류가 적고, 1 클럭 내외의 짧고 규격화된 명령어 사용. 메모리 접근을 단순화하고 최소화를 추구. 대신 레지스터를 적극적으로 활용.
  - 장점: 명령어 파이프라이닝에 유리.
  - 단점: 상대적으로 많은 수의 명령어 필요.

 

 

 

강의

https://www.youtube.com/playlist?list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl 

 

[컴퓨터 공학 기초 강의] 혼자 공부하는 컴퓨터 구조+운영체제

강민철 저자님과 함께하는 『혼자 공부하는 컴퓨터 구조+운영체제』 강의입니다. 다른 입문서에서는 알려주지 않았던 진짜 컴퓨터 공학 지식을 만나보세요! 👨‍🏫 누구를 위한 강의인가요? -

www.youtube.com

 

혼공

https://hongong.hanbit.co.kr/

 

[한빛미디어] 혼자 공부하는 시리즈: C, Java, Python...

프로그래밍 입문서 시장 베스트셀러 시리즈! 1:1 과외하듯 배우는 프로그래밍 언어 자습서! '무엇을', '어떻게' 학습해야 할지조차 모르는 입문자의 막연한 마음을 살펴, 친절하고 핵심적인 내용

hongong.hanbit.co.kr

 

혼공컴운 도서 구매하기

https://www.hanbit.co.kr/store/books/look.php?p_code=B9177037040&utm_source=hongong 

 

혼자 공부하는 컴퓨터 구조+운영체제

어려운 컴퓨터 구조와 운영체제의 원리를 누구나 쉽게 이해할 수 있도록 용어와 개념은 한 번 더 풀어쓰고, 적절한 예시와 이해하기 쉬운 그림으로 재미있게 구성했다. 또한 일상 소재를 활용한

www.hanbit.co.kr