Chapter 4. CPU의 작동 원리
목표
- ALU와 제어장치에 대해 학습한다.
- 레지스터의 종류와 역할에 대해 학습한다.
- 명령어 사이클을 이해한다.
- 인터럽트의 개념을 이해한다.
05. ALU와 제어장치
1. ALU
- CPU 내부에서 계산을 담당
- 피연산자와 제어신호로 다양한 연산을 수행
- 플래그 : 연산 결과에 대한 추가적인 상태 정보 ex. 결괏값이 음수, 결괏값이 오버플로우 됨
플래그 종류 | 의미 | 사용 예시 |
부호 플래그 | 연산한 결과의 부호를 나타낸다. | 부호 플래그가 1일 경우 계산 결과는 음수, 0일 경우 계산 결과는 양수를 의미한다. |
제로 플래그 | 연산 결과가 0인지 여부를 나타낸다. | 제로 플래그가 1일 경우 연산 결과는 0, 0일 겨웅 연산 결과는 0이 아님을 의미한다. |
캐리 플래그 | 연산 결과 올림수나 빌림수가 밠행했는지를 나타낸다. | 캐리 플래그가 1일 경우 올림수나 빌림수가 발생했음을 의미하고, 0일 경우 발생하지 않았음을 나타낸다. |
오버플로우 플래그 | 오버플로우가 발생했는지를 나타낸다. | 오버플로우 플래그가 1일 경우 오버플로우가 발생했음을 의미하고, 0일 경우 발생하지 않았음을 의미한다. |
인터럽트 플래그 | 인터럽트가 가능한지를 나타낸다. 인터럽트는 04-3절에서 설명한다. | 인터럽트 플래그가 1일 경우 인터럽트가 가능함을 의미하고, 0일 경우 인터럽트가 불가능함을 의미한다. |
슈퍼바이저 플래그 | 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지를 나타낸다. 커널 모드와 사용자 모드는 09장에서 설명한다. | 슈퍼바이저 플래그가 1일 경우 커널 모드로 실행 중임을 의미하고, 0일 경우 사용자 모드로 실행 중임을 의미한다. |
- 플래그 레지스터 : 플래그를 저장하는 레지스터
2. 제어장치
- 제어장치 : 제어 신호를 내보내고, 명령어를 해석하는 부품
- 제어 신호 : 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호
- 제어장치가 받아들이는 정보의 종류
- 클럭 신호
- 쿨럭: 컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위
- 해석해야 할 명령어
- 명령어 레지스터: cpu가 해석해야 할 명령어를 저장하는 레지스터
- 플래그 값
- 제어 신호 : 제어 버스로 전달됨
06. 레지스터
1. 프로그램 카운터 = 명령어 포인터
- 메모리에서 읽어 들일 명령어의 주소를 저장
2. 명령어 레지스터
- 메모리에서 읽어 들인 명령어를 저장
3. 메모리 주소 레지스터
- 메모리의 주소를 저장
4. 메모리 버퍼 레지스터
- 메모리와 주고 받을 값(데이터와 명령어)을 저장하는 레지스터
5. 범용 레지스터
- 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
- 일반적으로 CPU 내부에 여러 범용 레지스터가 존재
6. 플래그 레지스터
- 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터
7. 스택 포인터
- 스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터
- 스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식
8. 변위 주소 지정 방식
- 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식
- 상대 주소 지정 방식 : 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻어내는 방식
- 베이스 레지스터 주소 지정 방식 : 오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식
07. 명령어 사이클과 인터럽트
1. 명령어 사이클
- 하나의 명령어를 처리하는 정형화된 흐름
- 명령어가 실행되며 반복하는 일정한 주기
- 인출 사이클 : 메모리에 있는 명령어를 cpu로 가지고 오는 단계
- 실행 사이클 : cpu로 가져온 명령어를 실행하는 단계
- 간접 사이클 : 명령어를 실행하기 위해 메모리 접근을 한번 더 하는 단계
2. 인터럽트
- 명령어의 흐름이 끊어지는 상황
- CPU의 작업을 방해하는 신호
- 인터럽트의 종류
동기 인터럽트(예외) | 비동기 인터럽트(하드웨어 인터럽트) |
- CPU에 의해 발생 - CPU가 실행하는 프로그래밍상의 오륲와 같은 예외적인 상황에서 발생 |
- 입출력 장치에 의해 발생 - 프린트 완료 등 알림 역할 - 명령어를 효율적으로 실행하기 위해 사용 |
3. 하드웨어 인터럽트
- 인터럽트 요청 신호
- 인터럽트 플래그 : 일반적으로 요청 수용을 위해선 활성화 되어있어야 함
- 인터럽트 벡터 : 인터럽트 서비스 루틴 구분을 위한 정보
- 인터럽트 서비스 루틴 = 인터럽트 핸들러 : 인터럽트를 처리하기 위한 프로그램
4. 예외
- 폴트 falut : 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재기하는 예외
- 트랩 trap : 예욀르 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외 ex. 디버깅
- 중단 abort : CPU가 실행 중인 프로그램을 강제로 중단시캬애 힐 때
- 소프트웨어 인터럽트 software interrupt : 시스템 호출이 발생했을 때
Chapter 5. CPU 성능 향상 기법
목표
- 빠른 CPU를 위한 설계 기법을 학습한다..
- 빠른 CPU를 위한 명령어 병렬 처리 기법을 학습한다.
- RISC와 CISC의 차이에 대해 이해한다.
08. 빠른 CPU를 위한 설계 기법
1. 클럭
- 클럭 속도
- 헤르츠(Hz) 단위로 측정
- 클럭 속도만으로 CPU의 성능을 올리는 것에는 한계가 있음
2. 코어
- 명령어를 실행하는 부품
3. 멀티코어
- 여러 개의 코어를 포함하는 CPU
4. 스레드
- 실행 흐름의 단위
- 하드웨어적 스레드 : CPU에서 사용
- 멀티스레드 프로세서(CPU) : 하나의 코어로 여러 명령어를 동시에 처리함
- 하이퍼스레딩 : 인텔의 멀티스레드 기술
- 소프트웨어적 스레드 : 프로그램에서 사용
5. 명령어 병렬 처리 기법
- 명령어를 동시에 처리하여 CPU를 한시도 쉬지 않고 작동시키는 기법
- 명령어 파이프 라이닝
- 명령어 인출 Instruction Fetch
- 명령어 해석 Instruction Decode
- 명령어 실행 Execute Instruction
- 결과 저장 Write Back
- 슈퍼스칼라
- 비순차적 명령어 처리
6. 파이프라인 위험
- 데이터 위험
- 명령어 간 데이터 의존성에 의해 발생
- 제어 위험
- 분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화'에 의해 발생
- 분기 예측 : 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술
- 구조적 위험(자원 위험)
- 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시네 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생
7. 슈퍼스칼라
- CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조 ex. 공장 라인을 여러개 두는 상태
- 파이프라인 위험을 방지하기 위해 고도로 설계되어야 함
8. 비순차적 명령어 처리
- 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법
09. CISC와 RISC
1. 명령어 집합(명령어 집합 구조 = ISA)
- CPU가 이해할 수 있는 명령어들의 모음
2. CISC
- 복잡한 명령어 집합을 활용하는 컴퓨터(CPU) ex. x86, x86-64
- 가변 길이 명령어 : 명령어의 형태와 크기가 다양함
- 메모리를 최대한 아끼며 개발해야할 때 효율적
3. RISC
- CISC의 한계를 극복하기 위해 활용
- 고정 길이 명령어 : 단순하고 적은 수의 명령어 집합
- 메모리 접근의 단순화, 최소화 추구
CISC | RISC |
복잡하고 다양한 명령어 | 단순하고 적은 명령어 |
가변 길이 명령어 | 고정 길이 명령어 |
다양한 주소 지정 방식 | 적은 주소 지정 방식 |
프로그램을 이루는 명령어의 수가 적음 | 프로그램을 이루는 명령어의 수가 많음 |
여러 클럭에 걸쳐 명령어 수행 | 1클럭 내외로 명령어 수행 |
파이프라이닝하기 어려움 | 파이프라이닝하기 쉬움 |
'공부 > TIL' 카테고리의 다른 글
한입 크기로 잘라 먹는 타입스크립트 : 타입스크립트 개론 (1) | 2023.08.09 |
---|---|
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 6 - 7 (0) | 2023.08.05 |
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 1 - 3 (0) | 2023.07.29 |
[Nods.js] dgram을 이용한 UDP 채팅 서버 구현 (0) | 2023.07.15 |
[Node.js] Socket.io를 이용한 TCP/IP chat program 구현 (0) | 2023.07.15 |