@ 1주차 확인
- 명령어 = 연산구조 + 오퍼랜드
- 연산구조 = 명령어가 수행할 연산 → 데이터전송, 산술논리/연산, 제어 흐름 변경, 입출력 제어
- 오퍼랜드 = 연산에 사용할 데이터가 저장된 위치
- 오퍼랜드 필드에는 데이터 또는 메모리나 레지스터 주소가 올 수 있음
- 오퍼랜드 필드에서 나타내는 위치는 주소 지정 방식에 따라 다름 → 즉시, 직접, 간접 / 레지스터
Chapter 4. CPU의 작동 원리 (전체적으로 생소함)
4.1. ALU와 제어장치
ALU
- ALU : CPU 내부에서 계산을 담당
- 계산하기 위한 대상이 있어야되기 때문에 피연산자 필요, 계산에 대한 결과가 출력됨
?→ALU input
- 레지스터를 통해 피연산자를 받고, 제어장치로부터 수행할 연산을 알려주는 제어신호를 받음 → 산술/논리 연산 등 다양한 연산
ALU output→?
1) 연산 수행 결과는 연산 결과 또는 메모리 주소가 될 수 있음 → 이러한 값들은 일시적으로 레지스터 저장됨(메모리 저장 X)
- CPU 접근 속도 : 메모리 느림↓, 레지스터 빠름 ↑ : (메모리에 접근한다면 상대적으로 실행속도가 느려질 수 밖에 없음)
2) 연산 결과의 추가적인 정보를 위해 플래그 출력 (음수/양수, 오버플로우 정보등)
- ex) 부호, 제로, 케리(올림/빌림), 오버플로우, 인터럽트, 슈퍼바이저(커널/사용자 모드) 등
- 프로그램을 실행하는 도중 반드시 기억해야 하는 참고 정보이며, 플래그 레지스터에 저장됨
제어장치
- 제어장치 : 제어 신호를 내보내고, 명령어를 해석하는 부품 (CPU 구성 요소 중 가장 정교하게 설계)
- 제어신호 : 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호
?→제어장치 input
1) 클럭 신호
- 클럭은 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위임, 일정한 주기를 가짐
- 컴퓨터 부품들은 클럭에 맞춰 작동, 한 박자마다가 아닌 여러 클럭에 걸쳐 실행될 수 있음
2) '해석해야 할 명령어'
- CPU가 해석해야 할 명령어는 명령어 레지스터에 저장됨
- 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생 → 컴퓨터 부품들이 수행할 내용 안내
3) 플래그 레지스터의 플래그 값
- 플래그는 ALU 연산에 대한 추가적인 상태 정보임 → 참고하여 제어 신호 발생
4) 시스템 버스 중 제어 버스로 전달된 제어 신호
- 제어신호는 CPU뿐만 아니라 입출력 장치를 비롯한 CPU 외부 장치도 발생시킬 수 있음
- 그렇기 때문에, 제어 버스를 통해 외부로부터 전달된 제어 신호를 받을 수 있음
제어장치 output→?
1) CPU 외부에 전달하는 제어 신호
- 제어 버스로 제어 신호를 내보낸다는 의미
- ex) 메모리에 전달하는 제어 신호, 입출력장치에 전달하는 제어 신호, 제어장치가 입출력장치의 값 읽기/쓰기
2) CPU 내부에 전달하는 제어 신호
- ALU에 전달하는 제어 신호, ALU에 수행할 연산을 지시
- 레지스터에 전달하는 제어 신호, 레지스터 간에 데이터 이동, 레지스터에 저장된 명령어 해석
4.2. 레지스터
- 레지스터만 잘 관찰해도 프로그램의 자세한 실행 과정을 알 수 있음
- CPU 안의 레지스터들은 다 다르기 때문에, 본 장에서는 공통적인 8개의 레지스터를 알아봄(x86)
@4.2.1~4.2.4 의 동작 예시는 pp. 114~117 참고
4.2.1. 프로그램 카운터
- 프로그램 카운터는 메모리에서 가져올 명령어 주소를 저장함
- 프로그램 카운터를 명령어 포인터라고 부르기도 함
4.2.2. 명령어 레지스터
- 명령어 레지스터는 메모리에서 읽어 들인 명령어를 저장함
- 제어장치는 명령어 레지스터 속 명령어를 받아들이고, 해석한 뒤 제어 신호를 내보냄
4.2.3. 메모리 주소 레지스터
- 메모리의 주소를 저장하는 레지스터
- CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거침
4.2.4. 메모리 버퍼 레지스터
- 메모리와 주고 받을 값을 저장하는 레지스터(데이터, 명령어)
- 메모리에 쓰고 싶은 값이나 메모리로부터 전달받은 값은 메모리 버퍼 레지스터를 거침
- CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고 받을 값은 메모리 버퍼 레지스터를 거침
4.2.5. 플래그 레지스터
- ALU 연산 결과에 따른 플래그를 플래그 레지스터에 저장됨
- 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장함
4.2.6. 범용 레지스터
- 다양한 상황에서 자유롭게 사용할 수 있음
- 범용 레지스터는 데이터와 주소를 모두 저장할 수 있음
(메모리 버퍼 레지스터 : 데이터 버스로 주고받을 값만 저장, 메모리 주소 레지스터 : 주소 버스로 내보낼 주소값만 저장함)
- 일반적으로 CPU 안에는 여러 개의 범용 레지스터들이 있음
특정 레지스터를 이용한 주소 지정 방식(1) : 스택 주소 지정 방식
4.2.7. 스택 포인터
- 스택 주소 지정방식에서 사용, 해당 방식에서는 스택과 스택 포인터를 이용
- 스택 포인터는 스택의 꼭대기(가장 최근 값)를 가르키는 레지스터
- 스택은 메모리 안에 있으며, 스택처럼 사용하기로 암묵적으로 약속된 영역이 있음
특정 레지스터를 이용한 주소 지정 방식(2) : 변위 주소 지정 방식
- 명령어는 연산코드와 오퍼랜드로 구성되며, 오퍼랜드 필드에는 메모리 주소가 담길 때가 있음
- 변위 주소 지정 방식은 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식
- 변위 주소 지정 방식을 사용하는 명령어는 연산 코드 필드, 레지스터 필드, 오퍼랜드 필드 로 구성됨
- 오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라 상대 주소 지정방식, 베이스 레지스터 주소 지정 방식 등으로 나뉨
상대 주소 지정 방식
- 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식임
- if문과 유사하게, 모든 코드를 실행하는 것이 아닌 분기하여 특정 주소의 코드를 실행할 때 사용됨
베이스 레지스터 주소 지정 방식
4.2.8. 베이스 레지스터
- 오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식
- 베이스 레지스터는 기준 주소, 오퍼랜드는 기준으로부터 떨어진 거리 로서의 역할을 수행
- 베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소에 접근할 것인지 연산하여 유효 주소를 얻어내는 방식임
4.3 명령어 사이클과 인터럽트
- CPU가 하나의 명령어를 처리하는 과정에는 어떠한 정해진 흐름에 따라 처리해 나감 → 명령어 사이클
- 정해진 흐름에 따라 명령어를 처리하지만 흐름이 끊기는 상황이 발생 (인터럽트)
4.3.1. 명령어 사이클
- 프로그램 속 각각의 명령어들은 일정한 주기로 반복되며 실행되는데, 명령어 사이클이라고 함
1) 명령어를 메모리에서 CPU로 가져옴 (인출 사이클), pp 115~116의 2~6번
2) CPU로 가져온 명령어를 실행함 (실행 사이클), 제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생시키는 단계
- 명령어를 인출하여 바로 실행할 수 없는 경우도 있음 → 간접 주소 지정방식에서 메모리 접근을 한번 더해야 함
4.3.2. 인터럽트
- CPU의 작업을 방해하는 신호를 인터럽트라고 하며, 동기/비동기로 나눠짐
동기 인터럽트 (예외)
- CPU에 의해 발생하는 인터럽트 → 예외라고도 함
- CPU가 명령어들을 수행하다가 예상치 못한 상황에 마주쳤을 때, 프로그래밍상의 오류와 같은 예외적인 상황
비동기 인터럽트 (하드웨어 인터럽트)
- 주로 입출력장치에 의해 발생되는 인터럽트 → 하드웨어 인터럽트라고도 함
- 예를 들어, 입출력장치에 의한 비동기 인터럽트는 세탁기 완료 알림, 전자레인지 조리완료 알림 등, 알림 역할
- 또는 키보드, 마우스와 같은 입출력장치가 어떠한 입력을 받아들였을 때 이를 처리하기 위한 알림을 CPU에 보냄
- 주기적으로 완료 여부를 확인할 필요가 없어, 인터럽트를 받을 때까지 다른 작업을 처리할 수 있음
비동기 인터럽트 처리 순서
1) 입출력장치에서 인터럽트 요청신호를 CPU에 보냄
2) CPU는 실행사이클이 끝나고, 명령어를 인출 하기 전에 인터럽트 발생여부 확인
3) CPU에서 인터럽트 요청 확인 → 인터럽트 플래그를 통해 인터럽트 받을 수 있는 지 여부 확인
4) 인터럽트 수용 가능 시, CPU는 지금까지 작업을 백업함 → 스택에 백업
5) CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴(=인터럽트 핸들러) 실행
6) 인터럽트 서비스 루틴 실행 종료 4)에서 백업된 작업 재개
- 다만, 모든 하드웨어 인터럽트를 인터럽트 플래그로 막을 수 있는 것은 아님(정전, 하드웨어 고장으로 발생한 인터럽트)
- 인터럽트 벡터는 인터럽트 서비스 루틴을 식별하기 위한 정보
- CPU는 비동기 인터럽트 요청을 보낸 대상으로부터, 데이터 버스를 통해 인터럽트 벡터를 전달 받음
5.1. 빠른 CPU를 위한 설계 기법
클럭
- 클럭 속도가 높은 CPU는 일반적으로 성능이 좋음 → CPU 속도 단위로 간주되기도 함
- 클럭속도는 Hz 단위로 측정, 1초에 클럭이 몇 번 반복되는지를 나타냄
- 클럭속도가 너무나 높으면, CPU를 빠르게 만들긴 하지만 발열 문제가 생김
→ 클럭 속도만으로는 CPU의 성능을 올리기에 한계가 있음
코어와 멀티코어
- 클럭 속도 외로 성능을 올리기 위한 방법은, CPU의 물리적 코어수를 증가시키거나 스레드 수를 늘리는 방법이 있음
- 코어는 명령어를 실행하는 부품으로, CPU의 경우 명령어를 실행하는 부품 → 명령어를 실행하는 부품을 여러개 포함하는 부품
- 이러한 다중의 코어를 멀티코어 CPU 또는 멀이코어 프로세서라고함
- 코어가 증가한다고 해서 선형적으로 성능이 향상되진 않음
- 코어마다 처리할 명령어들을 얼마나 적절하게 분배하느냐이고 그에 따라서 연산 속도는 크게 달라짐
스레드와 멀티스레드
- 스레드는 사전적 의미로는 실행 흐름의 단위이며, 하드웨어적 스레드와 소프트웨어적 스레드가 있음
하드웨어 스레드
- 하나의 코어가 동시에 처리하는 명령어 단위를 의미
- CPU 에서 사용하는 스레드 용어는 보통 CPU 입장에서 정의된 하드웨어적 스레드를 의미함
- 여러 스레드를 지원하는 CPU는 하나의 코어로 여러개의 명령어를 동시에 실행할 수 있음 (2코어 4스레드)
- 단일 코어로 여러 명령어를 처리하는 CPU를 멀티스레드 프로세서 또는 멀티스레드 CPU라고 함
@하이퍼 스레딩은 인텔의 멀티 스레드 기술임
소프트웨어 스레드
- 하나의 프로그램에서 독립적으로 실행되는 단위를 의미
- 프로그래밍이나 운영체제를 학습할 대 접하는 스레드는 소프트웨어적으로 정의된 스레드를 의미
- 하나의 프로그램은 실행되는 과정에서 한 부분만 실행 될 수도 있지만, 프로그램의 여러 부분이 동시에 실행될 수도 있음
- 예를 들어, 1)입력받은 내용을 화면에 보여주는 기능 2) 입력한 내용이 맞춤법에 맞는지 검사하는 기능 등 동시에 실행 가능
@1코어 1스레드 CPU에서 소프트웨어적 스레드를 몇십 개 실행 할 수 있음
멀티스레드 프로세서
- 설계하는게 매우 복잡하지만, 가장 큰 핵심은 레지스터임
- 하나의 코어로 여러 명령어를 동시에 처리하도록 만들려면 하나의 명령어를 처리하기 위해 필요한 레지스터를 여러 개 가지면 됨
(프로그램 카운터, 스택 포인터, 메모리 버퍼 레지스터, 메모리 주소 레지스터)
- 메모리 속 프로그램 입장에서는 하드웨어 스레드는 한 번에 하나의 명령어를 처리하는 CPU나 다름없음
- 다중 스레드를 가지고 있어도 프로그램 입장에서는 하나의 명령어를 처리하는 CPU가 여러개 있는 것처럼 보임
- 하드웨어 스레드를 논리 프로세서라고 부르기도 함
5.2. 명령어 병렬 처리 기법
멀티 코어, 멀티 스레드를 지원하는 CPU도 중요하지만 CPU가 놀지 않고 최대한 작동하게 만드는 것도 중요함
명령어 파이프라인
- 클럭 단위를 기준으로 명령어 처리 과정
1) 명렁어 인출
2) 명령어 해석
3) 명령어 실행
4) 결과 저장
- 여기서 같은 단계가 겹치지만 않으면 CPU는 각 단계를 동시에 실행할 수 있음
- 명령어를 1)인출 하는 동안에, 다른 명령어를 3)실행 할 수 있고, 실행 동안 연산 결과를 저장할 수도 있음
- 명령어 파이프라이닝 : 공장 생산 라인과 같이 명령어들을 명령어 파이프 라인에 넣고 동시에 처리하는 기법임
- 파이프라이닝이 높은 성능을 가져오지만, 성능향상에 실패하는 경우도 있음 - 파이프라인 위험
- 파이프 라인 위험에는 1)데이터 위험, 2)제어 위험, 3)구조적 위험이 있음
1) 데이터 위험
- 데이터 의존성에 의해 발생함
- 모든 명령어는 동시에 처리할 수 없기에, 데이터 의존적인 두 명령어(R1+R2=R3, R3+R4=R5)에 대해 제대로 작동 X
2) 제어 위험
- 분기 등으로 인한 프로그램 카운터의 갑작스러운 변화에 의해 발생함
- 기본적으로 프로그램 카운터는 현재 실행중인 멸영어의 다음 주소로 갱신되지만, 실행 흐름이 바뀌어 명령어가 실행되면서
- 프로그램 카운터 값에 갑작스러운 변화 발생 → 이미 처리 중인 명령어는 쓸모 없어짐
- 이를 위해 분기 예측이라는, 프로그램이 어디로 분기할지 미리 예측한 후 주소를 인출하는 기술을 사용
3) 구조적 위험 (자원 위험)
- 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생
슈퍼 스칼라
- CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조 (공장 생산 라인을 여러개 두는 것)
- 이러한 처리가능한 CPU를 슈퍼스칼라 프로세서 or 슈퍼스칼라 CPU라고 함
- 매 클럭 주기마다 동시에 여러 명령어를 처리할 수 있어야 하며, 멀티스레드 프로세서를 통해 슈퍼 스칼라 구조를 사용할 수 있음
- 슈퍼 스칼라 또한 선형적으로 속도가 증가하지 않으며, 위험 방지를 위해 고도로 설계 되어야 함
비순차적 명령어 처리(OoOE)
- CPU 성능 향상에 크게 기여한 방법, 대부분의 CPU가 차용하는 기법임
- 이전까지의 파이프라이닝, 슈퍼스칼라는 명령어의 순차적 처리임
- 비순차적 명령어 처리 기법은 순차적 처리가 아닌, 의존성이 없는 처리를 먼저 수행하여, 파이프라인이 멈추지 않도록 함
- 명령어들이 어떤 명령어와 데이터 의존성을 가지고 있는지, 순서를 바꿔도 되는 명령어는 어떤 것인지 판단 할 수 있어야 함
5.3. CISC와 RISC
CPU 언어인 ISA와 각기 다른 성격의 ISA 기반인 CISC, RISC
5.3.1. 명령어 집합
- ISA : CPU가 이해할 수 있는 명령어들의 모음을 명령어 집합 또는 명령어 집합 구조, CPU마다 다를 수 있음
- ISA는 CPU의 언어임과 동시에 CPU를 비롯한 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속임
명령어 병렬 처리 기법들을 유리한 ISA
5.3.2. CISC (Complex Instruction Set Computer)
- 복잡한 명령어 집합을 활용하는 컴퓨터(CPU)
- 복잡하고 다양한 명령어들을 활용하는 CPU 설계 방식임 (대표적으로 x86, x86-64)
- 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용함 → 상대적으로 적은 수의 명령어로도 프로그램을 실행
- ARM 명령어보다 x86-64의 명령어가 짧음(pp 168)
- 프로그램을 실행하는 명령어 수가 적다 → 컴파일된 프로그램의 크기가 작다
- 장점 : 메모리 공간을 절약할 수 있음
- 단점1 : 명령어가 복잡하고 다양한 기능을 제공하기 때문에 실행되기까지의 시간이 일정하지 않음
- 단점2 : 복잡한 명령어 때문에 명령어 하나를 실행하는데 여러 클럭 주기가 필요
- 단점3 : 명령어 수행 시간이 제각각 → 파이프라인이 효율적으로 명령어 처리 어려움
- 복잡한 명령어의 실제 사용 빈도가 낮음
이러한 이유로 CISC 기반 CPU는 성장에 한계가 있음
5.3.3. RISC (Reduced Instruction Set Computer)
- CISC의 단점을 해소하기 위해 명령어 파이프라인 활용, 자주 쓰이는 기본적인 명령어를 빠르게 만드는 것을 원칙으로 생성
- CISC에 비해 명령어 종류 적음, 짧고 규격화된 명령어, 되도록 1클럭 내외로 실행되는 명령어 지향
- RISC는 단순하고 적은 수의 고정 길이 명령어 집합을 활용
- RISC 명령어 집합은 명령어 파이프라이닝에 최적화되어 있음
- 메모리에 접근하는 명령어를 load, store 두 개로 제한, 메모리 접근을 단순화하고 최소화 추구
→ 메모리 접근 단순화, 최소화하는 대신 레지스터를 적극적으로 활용
이러한 이유로 CISC보다 레지스터 연산이 많고, 범용 레지스터 수 많음, CISC보다 명령어 수 많음(ex pp168- ARM)
CISC | RISC | |
명령어 복잡성 | 복잡하고 다양 | 단순하고 적음 |
명령어 길이 | 가변 길이 | 고정 길이 |
주소 지정 방식 | 다양한 주소 지정 방식 | 적은 주소 지정 방식 |
프로그램 구성 명령어의 수 | 적음 | 많음 |
클럭 수 | 여러 클럭 | 1클럭 내외 |
파이프라이닝 | 어려움 | 쉬움 |
# | 진도 | 기본 숙제(필수) | 추가 숙제(선택) |
2주차 (1/13 ~ 1/19) |
Chapter 04 ~ 05 | p. 125의 확인 문제 2번, p. 155의 확인 문제 4번 풀고 인증하기 | Ch.05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기 |
1. 설명에 맞는 레지스터를 빈칸에 채우기
- 플래그 레지스터 : 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터
- 프로그램 카운터 : 메모리에서 가져올 명령어의 주소를 저장하는 레지스터
- 범용 레지스터 : 데이터와 주소를 모두 저장할 수 있는 레지스터
- 명령어 레지스터 : 해석할 명령어를 저장하는 레지스터
2. 코어
'개인공부 > 혼공학습단 13기 - 컴운' 카테고리의 다른 글
혼공학습단 13기- 5주차 (0) | 2025.02.19 |
---|---|
혼공학습단 13기- 4주차 (1) | 2025.02.11 |
혼공학습단 13기- 3주차 (0) | 2025.02.04 |
혼공학습단 13기- 1주차 (0) | 2025.01.13 |
혼공학습단 13기 시작 (0) | 2025.01.13 |