Chapter 4. CPU의 작동 원리
04-1. ALU와 제어장치
💡 학습내용
- ALU가 내보내고 받아드리는 정보
- 제어장치가 내보내고 받아들이는 정보
- ALU와 제어장치의 회로에 대한 내용은 다루지 않을 예정
ALU
-
ALU는 계산하는 장치(계산기와 유사)
-
ALU가 반환하는 값
-
계산의 결과값
- ALU의 계산을 위해서는 레지스터로 받는 피연산자와 제어장치로부터 받는 수행할 연산(제어신호)이 필요하다.
- 계산한 결과값은 레지스터에 저장된다.(숫자, 문자, 주소와 같은 형태로 저장된다.)
- 메모리가 아니라 레지스터에 저장하는 이유는 CPU가 메모리에 접근하는 것보다 레지스터에 접근하는 속도가 빠르기 때문이다.
-
플래그
- 연산결과에 대한 부가정보(ex. 양수/음수 판단)
- 특수한 레지스터인 플래그 레지스터에 저장된다.
- 플래그의 종류
- 플래그 저장 방법
제어장치
- 제어 신호를 발생시키고 명령어를 해석하는 장치
- 제어장치가 받아들이는 정보의 종류
- 클럭(clock)
- 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위
- 해석할 명령어
- 명령어 레지스터에 저장되어 있는 해석할 명령어를 받아들인다.
- 플래그
- 플래그 레지스터에 저장되어 있는 플래그 정보를 받아들인다.
- 제어신호
- 외부에서 발생되는 제어 신호를 받아들인다.
- 제어신호는 제어장치에서만 발생되는것이 아님
- 제어장치가 내보내는 정보의 종류
- CPU내부에 전달하는 제어신호 전달
- 레지스터 : 레지스터간의 행동 정보에 관한 제어신호 전달
- ALU : 수행할 연산
- CPU외부에 전달하는 제어신호
- 메모리 : 메모리를 읽어라/써라 등과 같은 제어신호 전달
- 입출력장치 : 입출력장치를 읽어라/써라 등과 같은 제어신호 전달
04-2. 레지스터
레지스터
- CPU내부에 있는 작은 임시저장 장치
- 프로그램 속 명령어 및 데이터는 프로그램 실행 전후로 레지스터에 값이 저장되기 때문에 프로그래머 입장에서 중요한 개념이다.
- CPU 내부에는 다양한 레지스터들이 있고 각자 다른 역할을 가진다.
- CPU마다 레지스터 종류는 다 다르다.
- 레지스터의 종류
레지스터 | 역할 | 설명 |
---|
프로그램 카운터 | 메모리에서 가져올 명령어의 주소를 저장 | 메모리에서 읽어 들일 명령어의 주소 |
(프로그램을 순차적으로 수행할 수 있게 해준다) | | |
명령어 레지스터 | 해석할 명령어를 저장 | |
(방금 메모리에서 읽어들인 명령어) | 제어장치가 해석 | |
메모리 주소 레지스터 | 메모리의 주소를 저장 | CPU가 읽어 들이고자 하는 주소를 주소 버스로 보낼때 거치는 레지스터 |
메모리 버퍼 레지스터 | 메모리와 주고받을 값(데이터와 명령어) 저장 | CPU가 정보를 데이터 버스로 주고받을때 거치는 레지스터 |
플래스 레지스터 | 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장 | |
범용 레지스터 | 다양하고 일반적인 상황에서 자유롭게 사용하는 레지스터 | |
스택 포인터 | 특별한 주소 지정에 사용하는 레지스터 | 스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식 |
스택포인터 : 스택의 꼭대기를 가리키는 레지스터 (스택이 어디까지 차 있는지에 대한 표시)
스택의 위치 : 스택은 메모리 안에 스택처럼 쓸 수 있는 공간이 지정되어 있다. |
| 베이스 레지스터 | 특별한 주소 지정에 사용하는 레지스터 | 변위 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻는 주소 지정 방식
베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더하여 유효 주소 얻기 |
04-3. 명령어 사이클과 인터럽트
명령어 사이클
- 프로그램 속 명령어들은 일정한 주지가 반복되며 실행되는데, 이 반복의 주기를 일컫는다.
- CPU의 실행 방식
- 인출사이클과 실행사이클에 의해 인출과 실행이 반복되며 진행된다.
- 인출사이클 : 가장 먼저 CPU로 값을 가져온다
- 실행사이클 : 인출 사이클에 의해 가져온 값을 실행한다.
- 간접사이클 : CPU 명령어를 가지고 와도 바로 실행이 불가능하고, 메모리 접근이 더 필요한 경우 실행된다.
인터럽트
-
인터럽트(interrupt) : 방해하다/ 중단시키다.
-
정해진 흐름대로 처리하고 있는 CPU를 방해/끊는 것
-
CPU가 인터럽트를 처리한다. = 인터럽트 서비스 루틴을 실행하고 본래 수행하던 작업으로 다시 되돌아온다(인터럽트의 시작 주소를 인터럽트 벡터를 통해 알 수 있다)
-
발생 시점
- CPU가 꼭 주목해야할때
- CPU가 얼른 처리해야 할 다른 작업이 생겼을 때 발생
-
인터럽트의 종류
-
동기 인터럽트(예외)
- CPU가 예기치 못한 상황을 접했을 때 발생
- 종류
-
비동기 인터럽트(하드웨어 인터럽트)
-
주로 입출력 장치에 의해 발생
-
알림과 같은 역할을 함
-
사용 목적 :
- 입출력 작업 도중 효율적으로 명령어를 처리하기 위해 사용
- 입출력 장치는 CPU에 비해 느리기 때문 사용
- 만약 인터럽트가 없다면 CPU는 입출력 작업 처리 완료 여부를 알기 위해 주기적으로 확인해야한다.
- 인터럽트가 있다면 입출력 작업 동안 CPU는 다른 일을 할 수 있게 된다.
-
하드웨어 인터럽트의 처리 순서
- 입출력 장치는 CPU에 인터럽트 요청 신호를 보냅니다.
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인합니다.
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인합니다.
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업합니다.
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행합니다.
- 인터럽트 서비스 루틴 실행이 끝나면 4번에서 백업해 둔 작업을 복구하여 실행을 재개합니다.
-
용어 정리
-
인터럽트 요청신호
-
인터럽트 플래그
- 인터럽트 요청 신호 발생 시, 플래그 레지스터에서 인터럽트를 받아들일 수 있는지 알기 위해 확인하는 플래그
- 단, 막을 수 없는 인터럽트(non maskable interrupt)는 인터럽트 플래그로도 막을 수 없다.
-
인터럽트 서비스 루틴
- 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리할지에 대한 프로그램
- CPU가 인터럽트를 받아들이기로 했다면 인터럽트 서비스 루틴이 실행되며 메모리에 저장된다.
-
인터럽트 벡터
Chapter 5. CPU 성능 향상 기법
05-1. 빠른 CPU를 위한 설계 기법
클럭
- 클럭 속도 : 헤르츠(Hz) 단위로 측정
- 헤르츠(Hz) : 1초에 클럭이 반복되는 횟수
- 1초에 한번 반복되면 1Hz / 100번 반복되면 100Hz
- 클럭 속도를 필요 이상으로 높이면 발열이 심각해져서 한계가 있음
CPU를 빠르게하는 방법은?
- 코어 수를 늘리는 방법(듀얼 코어 멀티코어
- 스레드 수를 늘리는 방법(멀티스레드
코어와 멀티코어
- 코어(Core)
- 전통적으로 명령어를 실행하는 부품은 원칙적으로 하나만 존재해야한다.
- 하지만 오늘날 CPU에는 명령어를 실행하는 부품이 여러개 존재한다.
- (현재) 명령어를 실행하는 부품 * n = CPU
- 이러한 명령어를 실행하는 부품을 코어라고 한다.
- 멀티코어
- 코어가 2개 이상인 코어를 일컫는다
코어 수 | 프로세서 명칭 | 멀티코어 |
---|
1 | 싱글코어(single-core) | |
2 | 듀얼코어(dual-core) | O |
3 | 트리플코어(triple-core) | O |
4 | 쿼드코어(quad-core) | O |
6 | 헥사코어(hexa-core) | O |
8 | 옥타코어(octa-core) | O |
10 | 데카코어(deca-core) | O |
12 | 도데카코어(dodeca-core) | O |
- 코어수에 비례하여 증가하는 개념은 아니다
스레드와 멀티 스레드
- 스레드
- 실행 흐름의 단위
- 스레드의 종류
- 하드웨어적 스레드(논리프로세서)
- 하나의 코어가 동시에 처리하는 명령어의 단위
- 멀티스레드 프로세서(멀티스레드 CPU)
- ex. 2코어 4스레드 CPU : 2개의 코어가 4개의 명령어를 한번에 실행할 수 있다.
- 멀티스레드 프로세서를 설계할 때 가장 큰 핵심은 레지스터이다.
- 레지스터 세트가 여러개 있으면 하나의 코어가 여러개의 명령어를 실행할 수 있다.
- 소프트웨어적 스레드
- 하나의 프로그램에서 독립적으로 실행되는 단위
- (이후 운영체제 파트에서 더 다룰 예정)
05-2. 명령어 병렬 처리 기법
명령어 파이프라인
- 명령어가 처리되는 과정을 비슷한 시간 간격으로 나누었을때
- 명령어 인출
- 명령어 해석
- 명령어 실행
- 결과저장
- 같은 단계가 겹치지만 않는다면 CPU는 ‘각 단계를 동시에 실행’할 수 있다.
- 명령어 파이프라이닝
- 명령어 파이프라인을 사용하지 않는다면 시간이 오래걸리게 된다.
- 파이프라인 위험
- 명령어 파이프라인이 성능 향상에 실패하는 경우
- 종류
- 데이터위험
- 명령어간의 의존성에 의해 야기
- 이전 명령어를 끝까지 실행해야지만 실행할 수 있는 경우
- 제어위험
- 프로그램 타운터의 갑작스러운 변화에 의해 야기
- 구조적위험
- 서로 다른 명령어가 같은 CPU부품(ALU, 레지스터)를 사용하려고 할때 야기
슈퍼 스칼라
- CPU 내부에 여러개의 명령어 파이프라인을 포함한 구조(= 멀티스레드 프로세서)
- 이론적으로는 파이프라인 개수에 비례하여 처리 속도가 증가하지만 파이프라인 위험도도 함께 증가하기 때문에 결론적으로 파이프라인 개수에 비례하여 처리속도가 증가하진 않는다.
비순차적 명령어 처리
- 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법(합법적인 새치기)
- 아무 명령아나 순서를 바꿀 수 있는 것은 아니다.
- 비순차적 명령어 처리를 통해 파이프라이닝을 더 효율적으로 실행시킬 수 있다.
- 비순차적 명령어 처리를 통해 순서를 바꾸어도 전체 프로그램의 실행 흐름에는 영향이 없다.
05-3. CISC와 RISC
명령어 집합
- 명령어의 세세한 생김새, 연산방식, 주소지정방식은 CPU마다 다르다
- 명령어 집합(구조) - ISA(Instruction Set Architecture) : CPU가 이해할 수 있는 명령어들의 모음(CPU 언어와 유사)
- 명령어가 달라지만 그에 대한 나비 효과로 많은 것이 달라진다.
- ex. 명령어 해석 방식, 레지스터의 종류와 개수, 파이프라이닝의 용이성 등
- CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속
- 종류
CISC & RISC
- CISC(Complex Instruction Set Computer)
- 복잡한 명령어 집합을 활용하는 컴퓨터(CPU)
- 복잡하고 다양한 명령어를 활용한다.
- 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다.
- 다양하고 강력한 명령어를 활용한다.
- 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있다.
- 메모리를 최대한 아낄 수 있어 그 시기에 인기가 많았다
- 명령어 파이프라이닝이 불리하다는 치명적인 단점 발견
- 명령어가 복잡하고 다양한 기능을 제공하여 명령어의 크기와 실행되기까지의 시간이 일정하지 않음
- 명령어가 복잡하여 명령어 하나를 실행하는 데에 여러 클럭 주기가 필요
- 복잡한 명령어는 사용 빈도가 낮음
- RISC(Reduced Instruction Set Computer)
- 명령어의 종류가 적고, 짧고 규격화된 명령어 사용
- 짧고 규격화된 명령어를 활용하기에 명령어 파이프라이닝에 유리함
- 메모리 접근 최소화(load, store), 레지스터를 많이 활용
- 단, CISC에 비해 명령어의 종류가 적어 더 많은 명령어로 프로그램을 동작시
MISSION
P125 - 2번 문제
(답) 1 - 플래그 레지스터 / 2 - 프로그램 카운터 / 3 - 범용 레지스터 / 4 - 명령어 레지스터
P155 - 4번 문제
(답) 코어(Core)