✏️ 2주차 진도: Chapter 04 ~ 05
- 기본 숙제(필수): p. 125의 확인 문제 2번, p. 155의 확인 문제 4번 풀고 인증하기
- 추가 숙제(선택): Ch.05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기
CPU의 구성 요소인 ALU라는 친구에 대해서 알아보자.
ALU는 CPU 내부에서 계산을 담당한다.
ALU가 받아들이는 정보
레지스터를 통해 피연산자를 받고, 제어장치로부터 제어 신호(수행할 연산)을 받아들인다.
ALU가 내보내는 정보
연산을 수행한 결괏값(숫자, 문자, 메모리 주소)과 플래그(연산 경과에 대한 추가적인 정보)를 내보낸다.
결괏값은 바로 메모리에 저장되지 않고 일시적으로 레지스터에 저장된다.
CPU가 메모리에 접근하는 속도 <<<<<< CPU가 레지스터에 접근하는 속도이기 때문에 프로그램 실행 속도를 높이기 위해 레지스터에 저장하는 것!
플래그는 플래그 레지스터에 저장된다.
제어장치는 제어 신호를 내보내고 명령어를 해석하는 부품이다.
제어장치가 받아들이는 정보
클럭 신호(clock) : 컴퓨터의 부품이 클럭 신호에 맞춰서 작동함
해석해야 할 명령어 : 명령어 레지스터로부터 받아들임
플래그 : 플래그 레지스터로부터 받아들임
제어 신호 : 시스템 버스 중 제어 버스로부터 외부에서 전달된 제어 신호를 받아들임
제어장치가 내보내는 정보
CPU 외부에 전달하는 제어 신호
CPU 내부에 전달하는 제어 신호
스택과 스택 포인터를 이용한 주소 지정 방식
스택 포인터가 top을 가리키게 하여 스택에 데이터를 저장하거나 꺼낼 때 사용
스택은 메모리 안의 스택 영역에 있음
오퍼랜드 필드의 값(변위)와 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식
변위 주소 지정 방식을 사용하는 명령어는 연산 코드와 오퍼랜드 코드 외에도 레지스터 필드가 추가로 있다.
상대 주소 지정 방식
오퍼랜드와 프로그램 카운터의 값(읽어들일 명령어의 주소)을 더하여 유효 주소를 얻음
베이스 레지스터 주소 지정 방식
오퍼랜드와 베이스 레지스터의 값(기준 주소)을 더하여 유효 주소를 얻음
하나의 명령어를 처리하는 정형화된 흐름
인출 사이클과 실행 사이클이 반복된다.
(인터럽트 사이클과 간접 사이클이 중간에 끼어있는 경우도 있다.)
인출 사이클
메모리에 있는 명령어를 CPU로 가지고 오는 단계
실행 사이클
CPU로 가져온 명령어를 실행하는 단계
간접 사이클
명령어를 인출하여 CPU로 가져와도 곧바로 실행할 수 없는 경우.
메모리 접근이 더 필요한 경우(ex. 간접 주소 지정 방식)
CPU의 작업을 잠시 중단시키는 신호
동기 인터럽트(예외, exception)
CPU에 의해 발생하는 인터럽트
CPU가 명령어들을 수행하다가 예상치 못한 상황에 마주쳤을 때 발생하는 인터럽트
비동기 인터럽트(하드웨어 인터럽트)
주로 입출력장치에 의해 발생하는 인터럽트
작업을 끝낸 입출력장치는 CPU에 인터럽트를 보낸다.
하드웨어 인터럽트 처리 순서
1. 입출력장치가 CPU에 인터럽트 요청 신호를 보낸다.
- 인터럽트 하기 전에 CPU에게 보내는 신호
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
- CPU가 인터럽트 요청을 확인하면 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는 상황인지 확인한다.
- 인터럽트 플래그가 활성화되어 있을 경우에 인터럽트 요청 수용
- 하지만 정전이나 하드웨어 고장으로 인한 인터럽트일 경우, 우선순위가 가장 높아서 인터럽트 플래그에 상관없이 무조건 받아들인다.
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 스택에 백업한다.
- CPU는 인터럽트 벡터를 참조해서 인터럽트 서비스 루틴(ISR, 인터럽트 핸들러)을 실행한다.
- 인터럽트 벡터: 입출력장치들의 인터럽트 서비스 루틴을 구분하기 위한 것. 인터럽트 서비스 루틴의 시작주소를 알 수 있다. 인터럽트 벡터는 인터럽트 요청을 보낸 대상으로 부터 전달받는다.
- 인터럽트 서비스 루틴: 인터럽트를 처리하기 위한 프로그램
- 인터럽트 서비스 루틴 실행이 끝나면 백업해 둔 작업을 복구해서 실행을 재개한다.
클럭 속도가 높아지면 CPU는 명령어 사이클을 더 빠르게 반복하므로, 클럭 속도가 높은 CPU는 일반적으로 성능이 좋다. 그래서 클럭 속도가 CPU 속도 단위로 간주되기도 한다.
클럭 속도는 헤르츠(Hz) 단위로 측정한다. (1초에 클럭 한 번 반복 -> 1Hz)
클럭 속도는 일정하지 않다. 고성능이 필요한 순간에는 간적으로 클럭 속도를 높일 수 있는데, 너무 많이 높일 경우에는 발열 문제가 심각해진다.
명령어를 실행하는 부품, 작은 개념의 CPU라고 볼 수 있다
-> CPU는 명령어를 실행하는 부품인 코어를 여러 개 포함하는 부품
코어를 여러 개 포함하고 있는 CPU
명령어를 실행하는 부품인 코어가 많을 수록 CPU의 처리 속도는 빨라짐 -> 하지만, 코어가 많다고 무조건 성능이 좋아지는 것은 아님. 코어마다 처리할 명령어를 얼마나 적절하게 분배하느냐에 따라 성능이 달라지는 것!
하드웨어적 스레드, 논리 프로세서 (CPU에서 사용하는 개념)
하나의 코어에서 동시에 몇 개의 명령어를 처리할 수 있는가?
한 코어 당 2개의 명령어를 동시에 처리할 수 있고(2개의 하드웨어 스레드), 그러한 코어가 2개 있으면 2코어 4스레드 CPU
소프트웨어적 스레드 (프로그램에서 사용하는 개념)
하나의 프로그램에서 독립적으로 실행되는 단위
여기서 독립적이란? 동시에 실행될 수 있는 부분을 말함
하나의 코어로 여러 명령어를 동시에 처리하는 것
CPU를 효율적으로 작동시키는 방법
명령어 처리 과정 중 같은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행할 수 있다.(성능 증가) -> 마치 공장 생산 라인 처럼!
데이터 위험
명령어 간 데이터 의존성에 의해 발생한다. 이전 명령어를 실행한 결과를 다음 명령에서 사용할 때 발생한다.
제어 위험
분기 등으로 인한 프로그램 카운터의 갑작스러운 변화에 의해 발생한다. PC의 값이 갑자기 변한다면, 미리 처리 중이었던 명령어들은 아무 쓸모가 없어지기 때문이다. -> 이 위험을 완화하기 위해 분기 예측을 한다.
구조적 위험(자원 위험)
명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생한다.
CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조.
매 클럭 주기마다 동시에 여러 명령어를 인출, 해석, 실행할 수 있있는 프로세서에서 가능한 구조이다. (ex. 멀티스레드 프로세서)
오늘날 CPU 성능 향상에 크게 기여한 기법이자 대부분의 CPU가 차용하는 기법
명령어들을 순차적으로 실행하지 않는 기법
데이터 의존성이 전혀 없는(순서를 바꿔 처리해도 무방한) 명령어를 먼저 실행한다.
CPU가 이해할 수 있는 명령어들의 모음이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속
CPU마다 ISA가 다를 수 있다. -> CPU마다 이해할 수 있는 명령어가 다를 수 있다.
ISA가 다르면 제어장치가 명령어를 해석하는 방식, 사용되는 레지스터의 종류와 개수, 메모리 관리 방법 등 많은 것이 달라진다.
명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다.
-> 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있다. 따라서 컴파일된 실행 파일의 크기가 작다.
-> 하지만 활용하는 명령어가 매우 복잡하고 다양한 기능을 제공하기에 명령어의 크기와 실행되기까지의 시간이 일정하지 않다. 그리고 복잡한 명령어 때문에 명령어 하나를 실행하는 데에 여러 클럭 주기를 필요로 한다. => 파이프라인을 구현하는 데 어려움. 실제로는 거의 자주 쓰이는 명령어만 쓰임.
CISC에 비해 명령어의 종류가 적다.
고정 길이 명령어를 활용한다.
-> 명령어가 규격화되어 있고, 하나의 명령어가 1클럭 내외로 실행되기 때문에 RISC 명령어 집합은 명령어 파이프라이닝에 최적화되어 있다. 또한, 메모리에 직접 접근하는 명령어를 load, store 두 개로 제한할 만큼 메모리 접근을 단순화하고 최소화를 추구한다. 대신 레지스터를 적극 활용한다.
-> 하지만 사용 가능한 명령어 개수가 CISC보다 적으므로, CISC보다 많은 명령으로 프로그램을 작동시킬 수 밖에 없다.`
설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워 보세요.
플래그 레지스터 : 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터
프로그램 카운터 : 메모리에서 가져올 명령어의 주소를 저장하는 레지스터
범용 레지스터 : 데이터와 주소를 모두 저장할 수 있는 레지스터
명령어 레지스터 : 해석할 명령어를 저장하는 레지스터
다음 그림은 멀티코어 CPU를 간략하게 도식화 한 그림입니다. 빈칸에 알맞은 용어를 써 넣으세요. (빈 칸은 명령어를 처리하는 부분을 가리키고 있음)
답: 코어
위쪽에 정리