CS/혼공컴구운체

[혼공컴운] 혼공단 2주차: 04~05

동백05 2024. 1. 14. 17:24

04 CPU의 작동 원리

04-1 ALU와 제어장치

ALU

- 계산하는 부품

- 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들임

- 특정 숫자나 문자가 될 수도 있고, 메모리 주소가 될 수 있음

- ALU가 연산할 떄마다 결과를 메모리에 저장한다면 당연하게도 CPU는 메모리에 자주 접근하게 되고, 이는 CPU가 프로그램 실행 속도를 늦출 수 있음 -> ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장함

 

플래그

- 연산 결과에 대한 추가적인 상태 정보

- 플래그들은 플래그 레지스터에 저장됨

플래그 종류 의미
부호 플래그 연산한 결과의 부호를 나타낸다
제로 플래그 연산 결과가 0인지 여부를 나타낸다
캐리 플래그 연산 결과 올림수나 빌림수가 발생했는지를 나타낸다
오버플로우 플래그 오버플로우가 발생했는지를 나타낸다
인터럽트 플래그 인터럽트가 가능한지를 나타낸다
슈퍼바이저 플래그 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지를 나타낸다

 

제어장치

- 제어 신호를 내보내고, 명령어를 해석하는 부품

1) 클럭 신호를 받아들임

    - 클럭: 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위

    - 컴퓨터 부품들은 클럭이라는 박자에 맞춰 작동할 뿐 한 박자마다 작동하는 것은 아님

2) 해석해야 할 명령어를 받아들임

    - 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려줌

3) 플래그 레지스터 속 플래그 값을 받아들임

    - 플래그 값을 받아들이고 이를 참고하여 제어 신호를 발생시킴

4) 제어 버스로 전달된 제어 신호를 받아들임

- CPU 외부에 전달하는 제어 신호: 제어버스로 제어 신호를 내보냄

- CPU 내부에 전달하는 제어 신호: ALU에 전달하는 제어 신호 -> 수행할 연산 지시/레지스터에 전달하는 제어 신호 -> 레지스터 간에 데이터를 이동시키거나 레지스터에 저장된 명령어를 해석하기 위해

04-2 레지스터

1) 프로그램 카운터

- 메모리에서 읽어 들일 명령어의 주소를 저장

2) 명령어 레지스터

- 방금 메모리에서 읽어 들인 명령어를 저장

3) 메모리 주소 레지스터

- 메모리의 주소 저장

4) 메모리 버퍼 레지스터

- 메모리와 주고받을 값(데이터와 명령어)을 저장

5) 범용 레지스터

- 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터

6) 플래그 레지스터

- 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장

 

스택 포인터

- 스택 주소 지정 방식이라는 주소 지정 방식에 사용

프로그램 카운터, 베이스 레지스터

- 변위 주소 지정 방식이라는 주소 지정 방식에 사용

스택 주소 지정 방식

- 스택과 스택 포인터를 이용한 주소 지정 방식

 

변위 주소 지정 방식

- 오퍼랜드 필드 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식

- 연산 코드 필드, 어떤 레지스터의 값과 더할지를 나타내는 레지스터 필드, 주소를 담는 오퍼랜드 필드

1) 상대 주소 지정 방식

- 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식

2) 베이스 레지스터 주소 지정 방식

- 오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식

 

[ 기본 미션 ]
2. 설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워보세요.
- [ 플래그 레지스터 ]: 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터
- [ 프로그램 카운터 ]: 메모리에서 가져올 명령어의 주소를 저장하는 레지스터
- [ 벙용 레지스터 ]: 데이터와 주소를 모두 저장할 수 있는 레지스터
- [ 명령어 레지스터 ]: 해석할 명령어를 저장하는 레지스터

 

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

인터럽트

- 정해진 흐름에 따라 명령어를 처리하던 CPU의 흐름이 끊어지는 상황

- CPU가 수행중인 작업을 방해하는 신호

 

1) 동기 인터럽트

- CPU에 의해 발생하는 인터럽트

- CPU가 명령어들을 수행하다가 예상치 못한 상황에 마주쳤을 때, 가령 CPU가 실행하는 프로그래밍상의 오류와 같은 예외적인 상황에 마주쳤을 때 발생하는 인터럽트

- 예외라고도 불림
2) 비동기 인터럽트

- 주로 입출력장치에 의해 발생하는 인터럽트

- 하드웨어 인터럽트라고도 함

 

인터럽트 요청 신호

- 인터럽트 하기 전 요청

인터럽트 플래그

- 플래그 레지스터의 인터럽트 플래그가 활성화 되어 있어야 인터럽트 요청을 수용할 수 있음

- '불가능'으로 설정되어 있으면 CPU는 인터럽트 요청이 오더라도 해당 요청을 무시함

- 그러나 '불가능' 상태여도 무시할 수 없는 요청이 있음 -> 하드웨어 고정으로 인한 인터럽트

인터럽트 서비스 루틴/인터럽트 핸들러

- 인터럽트를 처리하기 위한 프로그램

- CPU가 인터럽트 요청을 받아들이기로 했다면 실행됨

인터럽트 벡터

- 인터럽트 서비스 루틴을 식별하기 위한 정보

 

명령어 사이클

- 프로그램 속 각각의 명령어들이 일정한 주기가 반복되며 실행됨

인출 사이클

- 메모리에 있는 명령어를 CPU로 가지고 오는 단계

실행 사이클

- CPU로 가져온 명령어를 실행하는 단계

간접 사이클

- 명령어를 실행하기 위해 메모리 접근을 한 번 더 해야하는 경우

 

예외

- 발생하면 CPU는 하던 일을 중단하고 해당 예외를 처리함

1) 폴트

- 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외

2) 트랩

- 예외를 처리한 직후 예외가 발생한 명령어의 다음병령어부터 실행을 재개하는 예외

- 주로 디버깅할 때 사용

3) 중단

- CPU가 실행 중인 프로그램을 강제로 중단할 수 밖에 없는 심각한 오류를 발생했을 때 발생하는 오류

4) 소프트웨어 인터럽트

- 시스템 호출이 발생했을 때 나타남

05 CPU 성능 향상 기법

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

클럭

- CPU 속도로 간주되기도 함

- 단위: 헤리츠(Hz)

- 속도를 무작정 높이면 발열 문제가 심각해짐

 

CPU의 성능을 높이는 방법 -> CPU의 코어와 스레드 수를 늘리는 방법

코어

- 명령어를 실행하는 부품

- 멀티코어 CPU / 멀티코어 프로세서: 코어를 여러 개 포함하고 있는 CPU

- CPU의 연산 속도가 꼭 코어 수에 비례하여 증가하지는 않음

 

스레드

- 실행 흐름의 단위

1) 하드웨어적 스레드

- 하나의 코어가 동시에 처리하는 명령어 단위

- 멀티스테드 프로세서 / 멀티스레드 CPU: 하나의 코어로 여러 명령어를 동시에 처리하는 CPU

- 하이퍼스레딩: 인텔의 멀티스레드 기술

- 논리 프로세서

2) 소프트웨어적 스레드

- 하나의 프로그램에서 독립적으로 실행되는 단위

 

멀티스레드 프로세서

- 하나의 코어로 여러 명령어를 동시에 처리하는 CPU

- 하나의 명령어를 처리하기 위해 꼭 필요한 레지스터(프로그램 카운터, 스택 포인터, 메모리 버퍼 레지스터, 메모리 주소 레지스터)를 여러 개 가지고 있음

8코어 8스레드

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

답: 코어

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

명령어 파이프라인

- CPU를 한시도 쉬지 않고 작동시키는 기법

- 명령어 인출 -> 명령어 해석 -> 명령어 실행 -> 결과 저장

- 명령어 파이프라이닝: 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법

 

파이프라인 위험

1) 데이터 위험

- 명령어 간의 데이터 의존성에 의해 발생

- 데이터 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않는 것

2) 제어 위험

- 분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화'에 의해 발생

- 프로르갬 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 갑작스러운 변화가 생긴다면 명령어 파이프라인에 미리 가지고 와서 처리중이였던 명령어들은 아무 쓸모가 없어질 수 있음

- 분기예측: 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기법

3) 구조적 위험

- 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발성

- 자원위험이라고도 불림

 

슈퍼스칼라

- CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조

- 슈퍼스칼라 프로세서 / 슈퍼스칼라 CPU

- 파이프라인 개수에 비례해서 프로그램 처리 속도가 빨라짐

- 슈퍼스칼라 방식을 차용한 CPU는 파이프라인 위험을 방지하기 위해 고도로 설계되어야 함

 

비순차적 명령어 처리

- OoOE(Out-ot-Order Execution)

- 명령어를 순차적으로만 실행하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법

05-3 CISC와 RISC

명령어 집합 / 명령어 집합 구조(ISA)

- CPU가 이해할 수 있는 명령어들의 모음

- 같은 소스 코드로 만들어진 같은 프로그램이라 할지라도 ISA가 다르면 CPU가 이해할 수 있는 명령어도 어셈블리어도 달라짐

 

CISC

- Complex Instruction Set Computer

- 복잡한 명령어 집합을 활용하는 CPU

- 가변 길이 명령어 활용

- 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있음

- 활용하는 명령어가 워낙 복잡하고 다양한 기능을 제공하는 탓에 명령어의 크기와 실행되기까지의 시간이 일정하지 않음

- 복잡한 명령어 때문에 명령어 하나를 실행하는 데에 여러 클럭 주기가 필요함

 

RISC

- Reduced Instruction Set Computer

- CISC에 비해 명령어의 종류가 적음

- 짧고 규격화된 명령어, 되도록 1클럭 내외로 실행되는 명령어 지향 -> 고정 길이 명령어

- 메모리 접근을 단순화, 최소화하는 대신 레지스터를 적극적으로 활용함

- 사용 가능한 명령어 개수가 CISC보다 적기 때문에 CISC보다 많은 명령으로 프로그램을 작동시킴