1. CPU의 구성 요소 세 가지
- ALU (산술논리연산장치): 연산을 수행하는 장치 (계산을 담당하는 회로)
- 레지스터로부터 피연산자(연산의 대상)을 받아들이고
- 제어 장치로부터 제어 신호(연산할 작업)를 받아들인다.
- 연산의 결과를 레지스터, 플래그 레지스터에 저장한다.
==> 플래그 레지스터: 연산의 결과에 대한 부가 정보
> 부호 플래그 - 연산한 결과의 부호를 나타낸다.
> 제로 플래그 - 연산 결과가 0인지 여부를 나타낸다.
> 캐리 플래그 - 연산 결과 올림수나 빌림수가 발생했는지 여부를 나타낸다.
> 오버플로우 플래그 - 오버플로우가 발생했는지 여부를 나타낸다.
> 인터럽트 플래그 - 인터럽트가 가능한지 여부를 나타낸다.
> 슈퍼바이저 플래그 - 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지를 나타낸다.
- 제어 장치: 명령어를 해서가고 제어 신호를 내보내는 장치
- 제어 신호를 내보내고, 명령어를 해석하는 장치
- 클럭 신호
- 부품을 일사분란하게 움직일 수 있게 하는 시간 단위
- 부품이 움지이는 '박자'
- 레지스터: 명령어 처리 전후로 값을 임시 저장하는 장치
- 프로그램의 실행 전후로 값을 임시 저장하는 작은 저장장치
- 레지스터에 어떤 값이 저장되는지만 관찰해도 프로그램의 가장 저수준의 흐름을 볼 수 있다.
- CPU마다 레지스터의 이름, 크기, 종류가 다양하다.
- 프로그램 카운터: 메모리에서 가져올 명령어 주소 (메모리에서 읽어들일 주소)
==> 일반적으로 1씩 증가되며 메모리의 프로그램이 순차적으로 증가된다. - 명렁어 레지스터: 해석할 명령어 (메모리에서 읽어들인 주소)
- 메모리 주소 레지스터: 메모리의 주소 (읽어들일 주소 값)
- 메모리 버퍼 레지스터: 메모리와 주고받을 명령어와 데이터
- 플래그 레지스터: 연산 결과에 대한 부가 정보 저장
- 범용 레지스터: 범용적으로 사용 가능한 레지스터 (여러 개 있음)
- 스택 포인터: 스택 주소 지정 방식에서 사용되는, '스택의 꼭대기'를 가리키는 레지스터
==> 메모리 내의 스택의 꼭대기를 가르킨다. - 베이스 레지스터: 변위 주소 지정 방식에서 사용되는, '떨어진 거리'를 가리키는 레지스터
==> 변위 주소 지정 방식
> 오퍼랜드 필드의 값을 변위 삼아, 특정 레지스터 값을 더해 유효 주소를 얻는 주소 지정
> 상대 주소 지정 (오퍼랜드 + 프로그램 카운터 == 유효 주소)
> 베이스 레지스터 주소 지정 (오퍼랜드 + 베이스 레지스터(기준 주소) == 유효 주소)
- 프로그램 카운터: 메모리에서 가져올 명령어 주소 (메모리에서 읽어들일 주소)
2. 명령어 사이클과 인터럽트
- CPU가 명령어를 순차적으로 처리하는 양상
- 명령어 사이클: CPU가 명령어를 처러히나는 정형화된 주기, 흐름
- 메모리에서 명령어를 가져온다(인출 사이클) => 가져온 명령어 실행(실행 사이클) => 반복
- 실제 연산에 사용될 데이터를 얻기 위해 한 번 더 메모리에 접근해야 할 경우가 있다. (간접 주소 지정)
==> 이때는 간접 사이클이 추가 된다.
- 인터럽트
- 인터럽트(interrupt): 방해하다, 중단시키다
- CPU의 정상적인 실행 흐름을 방해하는 신호
- 인터럽트의 종류
- 동기 인터럽트 (예외, Exception):
주로 CPU에 의해 발생, 명령어 처리 도중 비정상적인 상황에 마주했을 경우 발생 - 비동기 인터럽트 (하드웨어 인터럽트):
주로 입출력장치에 의해 발생. 예로 세탁기 완료 아림, 저자레인지 조리 완료 알림과 같은 알림 역할 수행
- 동기 인터럽트 (예외, Exception):
- 입출력장치에게 입출력 작업을 맡겨 두면, CPU는 인터럽트를 받을 때까지는 다른 업무 수행 가능
- 하드웨어 인터럽트 처리 순서
- 입출력장치는 CPU에게 인터럽트 요청 신호를 보냄
- CPU는 실행 사이클 이후 인출 전 인터럽트 여부 확인
- CPU는 인터럽트 요청 확인 후, 인터럽트 플래그를 통해 인터럽트 수용 여부 확인
==> 인터럽트 요청 신호: CPU 작업을 방해하는 인터럽트에 대한 요청 - 인터럽트가 가능하다면 지금까지의 작업 백업
- 인터럽트 벡터를 참고하여 인터럽트 서비스 루틴(인터럽트 핸들러 실행)
==> 인터럽트 벡터: 인터럽트 서비스 루틴의 시작 주소를 포함하는 인터럽트 서비스 루틴의 식별 정보 - 인터럽트 서비스 루틴 실행 후 백업한 작업 복구, 실행 재개
==> 인터럽트 서비스 루틴: 인터럽트를 처리하는 프로그램
3. 멀티 코어와 멀티 프로세서
- 컴퓨터 부품은 클럭 신호에 맞춰 일사 분란하게 움직인다.
- CPU는 클럭 신호에 따라 명령어 사이클에 맞춰 명령어들을 실행한다.
- 클럭 속도가 높은 CPU는 일반적으로 성능이 좋다
- 클럭 속도 (Hz): 1초에 반복된 클럭의 횟수로 측정
- CPU 오버클럭킹
- 임의로 클럭 속도를 끌어올리는 기술
- 부팅시 BIOS에서 설정 가능
- 클럭과 발열의 관계
- 클럭 수가 높아질 수록 발열 문제가 심각해지기 때문이다.
- 코어와 멀티 코어
- 코어: 명령어를 인출하고, 해석하고, 실행하는 CPU 내 부품
- 코어가 여러 개 있다면 한 번에 여러 명령어 인출, 해석, 실행 가능하다.
- 클럭 수를 높이는 방법 이외에 성능을 높일 수 있는 방법
- 코어(Core) 수 늘리기 => 멀티 코어 프로세서
- 스레드와 멀티 스레드
- 스레드:
> 하드웨어적 스레드: 하나의 코어가 동시에 처리하는 명령어 단위
> 소프트웨어 스레드: 하나의 프로그램을 독립적으로 실행하는 단위 - 코어 수를 늘리는 방법 이외에 성능을 높일 수 있는 방법은 스레드 수를 늘리는 방법이다.
- 멀티 스레드 CPU의 고려 사항
- 복수의 레지스터 세트(하나의 명령어를 실행하기 위해 꼭 필요한 레지스터 집합)
- 메모리 + 메모리에 저장된 프로그램 입장에서 하드웨어 스레드와 코어를 구분할 수 없다.
각 하드웨어를 마치 하나의 단일 스레드/코어 프로세서로 인식 - 이런 점에서 하드웨어 스레드를 논리 프로세서라고 부르기도 함
- 스레드:
4. 명령어 병렬 처리 - 파이프라이닝
- 명령어 파이프라이닝 - 하나의 명령어가 처리되는 과정을 비슷한 시간 간격으로 나눈다.
==> 주요 아이디어: 위 단계들은 서로 겹치지만 않는다면 한꺼번에 실행할 수 있다.- 명령어 인출
- 명령어 해석
- 명령어 실행
- 명령어 저장
- 파이프라인 위험(pipeline hazard)
- 데이터 위험 (data hazard)
- 명령어 간 의존성에 의해 발생 (R: Read, A: After, W: Write)
1. 데이터가 쓰어진 직후 그 데이터를 읽어들이는 경우 (RAW)
2. 데이터를 쓴 직후 그 데이터에 새 내용을 쓰는 경우 (WAW)
3. 데이터를 읽어들인 직후 그 데이터에 새 내용을 쓰는 경우 (WAR)
- 명령어 간 의존성에 의해 발생 (R: Read, A: After, W: Write)
- 제어 위험(control hazard)
- 프로그램 카운터의 갑작스러운 변화에 의해 발생 (분기)
- 구조적 위험(structural hazard)
- 서로 다른 명령어가 같은 자원을 사용하려 할 경우 발생
- 데이터 위험 (data hazard)
- 파이프라인닝의 발전: 슈퍼스칼라
- 다수의 명령어 파이프라인을 두는 방식
- 여러 명령어 동시 인출/해석/실행/저장이 가능한 CPU
- 파이프라인닝을 십분 활용하기 위한 CPU 구조 (ISA)
- CISC : Complex Instruction Set Computer (Intel x86 CPU)
- 복잡하고 다양한 기능의 명령어 제공
- 다양한 주소 지정 방식 제공
- 적은 명령어 수로 명령어 실행 가능 => 메모리 절약
- 하나의 명령어 실행에 일정하지 않은 클록 수 => 명령어 파이프라이닝에 불리
- 대부분의 명령어는 사용되지 않는다.
- RISC : Reduced Instruction Set Computer (ARM CPU)
- 짧고 규격화된 명령어 => 명령어 파이프라인닝에 유리
- 적은 수의 명령어 제공
- 메모리 접근 최소화 (레지스터 활용)
- CISC에 비해 더 많은 명령어로 실행 => 컴파일러의 역할이 중요
- 파이프라이닝에 용이하다.
- CISC : Complex Instruction Set Computer (Intel x86 CPU)
5. 비순차적 명령어 처리
- 비순차적 명령어 처리 (Out-of-Order-Execution): 명령어 파이프라인의 성능을 높이는 방법
==> 파이프라이닝 내의 의존 관계가 없는 명령어를 순차적으로 처리하지 않는 방법 - 순서에 따라 프로그램 실행에 영향을 주지 않는 경우 명령어 순서를 바꿈으로써 파이프라이닝의 성능을 높이는 기능을 높이는 기능을 비순차적 명령어 처리라 한다.
'다양한 Dev. > cs 지식 정리' 카테고리의 다른 글
보조 기억 장치와 입출력 장치 (1) | 2023.12.17 |
---|---|
메인 메모리와 캐시 메모리 (0) | 2023.12.13 |
데이터 (0) | 2023.12.07 |
명령어 (1) | 2023.12.06 |
컴퓨터 구조 (0) | 2023.12.05 |