주로 계산을 담당한다.
피연산자(레지스터) + 제어 신호(제어장치)를 받아들여 연산 수행
-> 연산 결과를 메모리가 아닌 레지스터에 저장
flag register에 flag 저장(연산 결괏값에 대한 정보: 부호, 0, overflow, interrupt 등)
1. clock신호
2. 해석해야 할 명령어
3. flag register 속 flag value
4. 시스템 버스 - 제어버스로 전달된 제어신호
1. CPU 외부 - 제어버스로 제어신호(제어장치 메모리 저장된 값 Read/Write 요청 메모리에 보냄, IO device Read/Write요청 IO device에 보냄)
2. CPU 내부 - ALU전달(계산요청), 레지스터 전달(레지스터 간 데이터 이동)
메모리 스택영역에 주소 지정방식(인터럽트 데이터 백업)
1. 상대 주소 지정방식 - PC를 보고 오퍼랜드 값 더하거나 빼서 주소 지정
2. 베이스 레지스터 주소 지정 방식 - 베이스 레지스터 + 오퍼랜드로 구함
fetch cycle(인출 사이클)
execution cycle(실행 사이클) 두개가 순환하는 구조
이 때 추가적인 메모리 로드가 필요한 indirect cycle이 둘 사이에 발생하면 이 과정을 거친 후 execution cycle로 넘어감
execution cycle을 끝내고 fetch cycle로 넘어가기 전 cpu는 인터럽트를 체크
1. io decice가 cpu에게 interrupt requirement signal 보냄
2. execution cycle이 끝나고 cpu는 요청 확인
3. interrupt flag(flag register)를 확인하고 활성화 되면 진행
4. cpu는 메모리 스택에 현재 내용 백업
5. interrupt vector를 확인하고 그걸 기준으로 interruptservice routine을 실행함
6. 완료되면 스택에서 데이터 호출 및 복구, 실행 두가지로 나뉜다.
cpu의 작업 흐름은 clock speed에 영향을 받으므로 clock speed는 cpu 성능의 대표적 지표 중 하나이다.
//clock speed는 Hz단위이며 일정하지 않고 Base clock speed와 Max clock speed로 나뉘어 유연하게 조정되는 방식이다.
cpu성능의 또 다른 지표 중 하나이다.지금까지 학습한 "명령어를 실행하는 부품"일을 수행하는 단위이다. 즉 코어의 수가 많을수록 동시에 다양한 명령어를 실행할 수 있다.
//그러나 코어 수를 무작정 늘린다고 성능이 그에 대응되게 상승하는 것은 아니다. 요점은 코어마다 처리할 명령어의 분배가 중요하다는 것이기 때문이다.
사전적 의미: 실행 흐름의 단위
HW적인 스레드: 하나의 코어가 동시에 처리하는 명령어 단위
//예시: 2코어 4스레드인 cpu는 각 코어 당 2개의 명령어를 동시에 처리 가능하다. 이를 멀티스레드 프로세서, 멀티스레드 cpu라고 한다.(intel의 하이퍼스레딩)
이 때 하드웨어스레드를 logical processor(논리 프로세서)라고 부른다.
SW적인 스레드: 하나의 프로그램에서 독립적으로 실행되는 단위
Java에서의 thread를 생각하면 될 것 같다.
아래는 현재 글을 작성한 데스크톱의 작업관리자 화면이다.
이 cpu는 코어가 8, 논리 프로세서가 16으로 표기되어 있으므로
각 코어 당 2개의 명렁어를 동시 처리하는 멀티스레드 cpu임을 알 수 있다. 또한 기본 속도를 통해 clock이 3.80GHz즉 초당 3.8 x 10^9번 의 번 clock이 반복됨을 알 수 있다.
하나의 명령어가 처리되는 전체 과정을 클럭 단위로 나누어 마치 공장 생산 라인과 같이 명령어를 동시에 처리하여 성능을 향상시키는 것이다.
그러나 특정 상황에 위험요소가 있다. 이를 Pipeline hazard라고 부른다.
1. data hazard - 데이터 의존성에 의해 발생(의존적 두 명령어를 무작정 동시에 실행시)
2. control hazard - Program counter의 갑작스러운 변화에 의해 발생(해당 상황 발생 시 미리 가지고와서 처리중이던 명령어들이 붕 떠버리는 현상)
3. structural hazard, resource hazard - 서로 다른 명령어가 동시에 CPU부품을 사용하려고 할 때 발생한다.
이러한 파이프라인을 CPU 내부에 여러 개 포함한 구조를 superscalar라고 한다.
일반적으로 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨라진다.
합법적인 새치기이다.데이터 의존성 없이 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법이다.
CPU가 이해할 수 있는 명령어들의 모음이다. SW로써 cpu의 언어임과 동시에 cpu를 비롯한 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속이다. 이 ISA는 cpu마다 다를 수 있다. e.g)x86과 ARM 등은 서로의 명령어를 이해할 수 없다.
현대 ISA의 양대산맥은 다음과 같다.
키워드: 가변 길이 명령어
x86, x86-64등에서 이용
다양하고 강력한 기능의 명령어 집합을 활용하기 때문에 명령어의 형태와 크기가 다양한 가변 길이 명령어 활용 - 적은 수의 명령어로도 프로그램을 실행 가능 - but 활용 명령어가 복잡하고 다양하여 명령어 크기, 실행까지의 시간이 비일정함 - 파이프라이닝에 치명적 영향
키워드: 고정 길이 명령어
이름에서 알 수 있듯이 CISC의 단점인 명령어의 규격화, 사용 빈도 낮은 복잡한 명령어를 보완하여 등장하였다.
명령어의 종류가 적고 짧고 규격화된 명령어, 1클럭 내외의 명령어 위주
즉 고정 길이 명령어이다.
메모리접근을 단순화, 최소화했기 때문에
사용 가능한 명령어 수가 많다 -> 레지스터를 적극적 활용한다.
1.1: 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터
-> 플래그 레지스터(Flag register)
1.2: 메모리에서 가져올 명령어의 주소를 저장하는 레지스터
-> 프로그램 카운터(Program Counter)
1.3: 데이터와 주소를 모두 저장할 수 있는 레지스터
-> 범용 레지스터(General register)
1.4: 해석할 명령어를 저장하는 레지스터
-> 명령어 레지스터(Instruction Register)
빈칸->코어
코어: CPU에서 명령어를 실행하는 부품의 단위이다.
스레드: 사전적 의미는 실행 흐름의 단위이며
HW적인 관점의 스레드는 하나의 코어가 동시에 처리하는 명령어 단위이다.
SW적인 관점의 스레드는 하나의 프로그램에서 독립적으로 실행되는 단위이다.
멀티코어: 코어를 여러 개 포함하는 CPU를 멀티코어 CPU라고 한다.
멀티스레드: 하나의 코어로 여러 개의 명령어를 동시에 실행하는 것이다.
Data Hazard가 데이터 의존성에 의해 발생한다는 점에서 학교 OS강의에서 들었던 race condition이 생각났다. 이후 찾아본 결과는 다음과 같았다.
A: 의존성 이라는 단어에 혼동하기 쉽지만 Data Hazard는 파이프라이닝에서 사용되는 언어이고 race condition은 데이터 리소스 동시성 제어를 다룰 때 사용된다고 한다. 시스템 동시성과 순서 문제로 발생한다는 공통점이 있는 듯 하다.
ISA는 CPU간의 약속이라는 교재 내용을 보고 학교에서 네트워크 강의를 들을 때 프로토콜이 일종의 약속이라는 교수님의 말씀이 기억이 나서 찾아보았다.
A: Data hazard와 race condition은 각각 컴퓨터 아키텍처와 소프트웨어 동시성 문제에서 발생하지만, 둘 다 동시성으로 인한 비정상적인 동작을 방지하기 위한 기법들을 필요로 한다는 점에서는 같다고 볼 수 있다고 한다.
지난주에 아쉬웠던 점들을 피드백하여 직접 예제도 적용해 보고 공부하면서 궁금했던 점을 찾아보는 시간을 통해 더욱 깊이있게 공부한 것 같아 기분이 좋다. 다음주도 화이팅!