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
- 하나의 명령어를 처리하기 위해 꼭 필요한 레지스터(프로그램 카운터, 스택 포인터, 메모리 버퍼 레지스터, 메모리 주소 레지스터)를 여러 개 가지고 있음
[ 기본 미션]
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보다 많은 명령으로 프로그램을 작동시킴
'CS > 혼공컴구운체' 카테고리의 다른 글
[혼공컴운] 혼공단 5주차: 12~13 (1) | 2024.02.04 |
---|---|
[혼공컴운] 혼공단 4주차: 09~11 (1) | 2024.01.28 |
[혼공컴운] 혼공단 3주차: 06~08 (2) | 2024.01.21 |
[혼공컴운] 혼공단 1주차: 01 ~ 03 (0) | 2024.01.07 |
[혼공컴운] 혼공단 0주차 (0) | 2023.12.29 |
댓글