책 목차
Chapter 04. CPU 작동 원리
- ALU와 제어장치
- 레지스터
- 명령어 사이클과 인터럽트
Chapter 05. CPU 성능 향상 기법
- 빠른 CPU를 위한 설계 기법
- 명령어 병렬 처리 기법
- 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
- 피연산자와 제어신호를 받아들여서 계산(연산) 수행 후 결과를 레지스터에 저장하고 부가 정보는 플래그 레지스터에 저장
- 예를 들면, 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 의 속도를 빠르게 만드는 방법...
- 컴퓨터 부품들은 클럭 신호에 맞춰 일사불란하게 움직인다.
- CPU 는 명령어 사이클이라는 정해진 흐름에 맞춰 명령어를 실행한다.
그럼 클럭 속도를 빠르게 하면 되나? YES
- 클럭 속도는 헤르츠 (Hz) 로 표현하며 1초에 클럭이 반복되는 횟수를 의미함
그럼 무조건 빠르게 하면 되는거 아닌가? NO
필요 이상으로 클럭을 높이면 발열이 심해짐
그럼 어떻게 할까? (1) 코어 수 늘리기 (2) 스레드 수 늘리기
코어, Core
- 코어는 명령어를 실행하는 부품으로 여러 개가 존재할 수 있음
- 멀티코어 프로세서는 여러 개의 코어를 포함하고 있는 CPU
- 코어 수를 무한정 늘리면 속도가 빨라지나? NO. 반드시 비례하는 것은 아니다
스레드, Thread
- 실행 흐름의 단위로 하드웨어적 스레드, 소프트웨어적 스레드로 나눌 수 있음
하드웨어 스레드
- 하나의 코어가 동시에 처리하는 명령어 단위로 1코어 1스레드는 CPU 는 하나의 코어가 하나의 명령어를 한번에 처리하는 것을 의미하며 2코어 4스레드는 2 개의 코어가 각각 2 개의 명령어를 동시에 처리할 수 있음을 의미하며 이런 종류의 CPU 를 멀티 스레드 프로세서, 멀티 스레드 CPU 라고 함
- 핵심은 레지스터로 하나의 코어 내 얼마나 많은 레지스터 세트가 있으냐에 따라 얼마나 많은 명령어를 동시에 처리할 수 있을지가 결정됨
- 논리 프로세서라고도 부름
소프트웨어 스레드
- 하나의 프로그램에서 독립적으로 실행되는 단위로 하드웨어적 스레드가 1개라도 여러개의 소프트웨어 스레드가 존재할 수 있음
끝.
'IT' 카테고리의 다른 글
혼공단 3주차 정리: 메모리, 보조기억장치, 입출력장치 그리고 운영체제 시작 (0) | 2023.01.24 |
---|---|
[북리뷰] 『혼자 공부하는 데이터 분석 with 파이썬』1:1 과외하듯 배우는 데이터 분석 자습서 (한빛미디어) (0) | 2023.01.24 |
[북리뷰] 『비즈니스 데이터 과학』비즈니스 의사결정을 위한 통계학, 경제학, 인공지능의 만남 (한빛미디어) (0) | 2023.01.06 |
[북리뷰] 『Do it! 깡샘의 안드로이드 앱 프로그래밍 with 코틀린 ━ 개정2판』(이지스퍼블리싱) (1) | 2022.12.30 |
[북리뷰] 『파이썬 웹 프로그래밍: 기초편』- Django(장고)로 배우는 쉽고 빠른 웹 개발 (한빛미디어) (1) | 2022.11.27 |