혼공컴운 2주차 (레지스터, 멀티스레딩)
명령어를 cpu로 가져와서 수행하는 과정
PC 레지스터에 현재 실행중 프로세스의 읽어야 하는 부분의 메모리 주소가 저장되어 있다
control unit은 PC의 주소를 주소 레지스터에 옮기도록 제어신호를 보내고 데이터 버스를 통해 전달된다.
control unit의 제어신호를 통해 메모리에 READ 명령을 주소 레지스터에 있는 주소와 같이 보낸다.
해당 주소에 적재된 명령어가 메모리 버퍼 레지스터(MBR)에 저장된다.
이 명령어는 명령어 레지스터(IR)에 전달되고 여기에서 opcode와 operand로 분리된다.
control unit은 이 opcode를 해석하고 그에 맞추어 제어신호와 operand를 ALU나 레지스터에 보낸다.
연산이 필요한 opcode인 경우 ALU에 제어신호를 보내고 operand를 범용 레지스터에 보낸다.
ALU에서 연산을 마친 뒤 결과물을 범용 레지스터에 저장하고 연산 결과에 따른 추가 정보를
플래그 레지스터에 저장한다.(결과가 음수,양수,0 인지, 오버플로우인지 등의 여부)
결과를 메모리에 쓰거나 해야 하는 경우 control unit은 cpu 외부로 제어신호와 데이터를 보낼 수도 있다.
레지스터 활용 주소지정방식
메모리의 스택 영역을 가리키는 스택 레지스터(pop 할 주소를 가리키고 있음)를 이용하거나
오퍼랜드의 값에 특정 레지스터의 값을 더하거나 (변위 주소 지정 방식)
PC에 저장된 값에 오퍼랜드의 값을 더하는 방식(상대 주소 지정 방식)
기준점인 베이스레지스터에 오퍼랜드에 값을 더하는 방식(베이스 레지스터 주소 지정 방식)
등으로 주소지정을 하는데 레지스터의 도움을 받을 수 있다.
상대 주소 지정 방식으로 if문과 같은 분기를 처리할 수 있다.
명령어 사이클
프로그램이 실행되는 과정은 정해진 작업 사이클을 반복하며 진행된다.
기본적으로 인출과 실행.
인출 -> 메모리에서 데이터를 레지스터로 적재한다.
실행 -> cpu 내부에 가져온 데이터로 처리한다.
여기에 추가적으로 간접, 인터럽트가 추가된다.
간접 -> 간접주소지정방식의 채택 등으로 인출 과정에서 메모리 참조가 한번 더 이뤄짐
인터럽트 -> 프로그램 사이클 도중 외부 요소로부터 알림으로 그 작업을 처리하는 과정
병렬처리
여러 명령어를 사이클을 반복하며 수행하는데,
인출부터 실행 마무리까지 한 뒤 다음 명령어를 불러오는 것 보다
한 명령어를 실행하는 동안 동시에 다른 명령어를 인출하는 것이 훨씬 효율적이다.
그를 위해 파이프라이닝을 통해 인출->해석->실행->저장 을 여러 명령어를 단계별 구분으로 동시에 작업할 수 있다.
하지만 파이프라이닝이 항상 병렬적으로 전부 처리되진 못하는데
분기와 같은 상황에 PC를 이동시켜서 미리 작업중인 뒷 명령어가 의미없어짐(control hazard)
뒤 명령어가 앞 명령어에 의존적인 데이터가 필요해서 기다려야 함 (data hazard)
다른 명령어가 동시에 ALU, 레지스터 등에 접근(structural hazard)
data hazard 등으로 비효율적이게 되는 상황을 방지하기 위해, 명령어를 순차적으로 파이프라이닝 하는 것이 아닌
미리 처리해둘 수 있는 작업들의 순서를 바꾸는 등 비순차적 명령어 처리 기법을 활용한다.
RISC, CISC
x86-64 프로세서의 CISC는 복잡하고 다양한 명령어가 존재하기에 주소지정방식에 다라 가변 명령어 길이를 갖는다
그러다보니 여러 클럭에 걸쳐 명령어를 수행하고 일정하지 않은 길이로 파이프라이닝에 적합하지 않다
하지만 강력한 명령어로 명령어의 갯수를 줄일 수 있기에 메모리를 절약할 수 있다.
ARM 프로세서의 RISC는 1클럭 내외로 고정길이 명령어를 사용하기에 명령어 수는 많아질 수 있지만
파이프라이닝에 적합한 구조를 띄고 있다.
인터럽트
동기 인터럽트 -> 예외
예외에서
비동기 인터럽트 -> 하드웨어 인터럽트
두가지로 나뉘어진다. 예외는 cpu 내부에서 명령어 수행중 프로그래밍오류와 같은 예상치 못한 상황
하드웨어인터럽트는 키보드 입력 등 주변기기에서 cpu로 처리를 요구하는 상황에 발생.
인터럽트 발생 시 cpu는 플래그 레지스터의 인터럽트 플래그를 확인 후 처리할지 결정한다.
인터럽트 플래그가 불가능 상태더라도 우선순위가 높은 인터럽트는 처리해야 한다.
현재 진행중이던 명령어를 마친 뒤 프로세스의 상태와 레지스터를 저장한 뒤 인터럽트를 처리한다.
인터럽트 벡터를 참고해서 해당 인터럽트의 처리를 위한 인터럽트 서비스 루틴의 시작 주소를 확인하고
그를 실행시켜 처리한다. (메모리 두번참조)
추가 숙제
멀티스레드 프로세서와 멀티스레딩
하드웨어적 스레드는 cpu의 코어 하나가 동시에 처리할 수 있는 명령어의 단위
소프트웨어적 스레드는 하나의 프로그램에서 독립적으로 실행되는 단위.
ex) 워드프로세서에서 스레드1은 입력을받고 스레드2는 백업생성 스레드3은 맞춤법검사. 여러 스레드가 실행된다.
멀티스레드 프로세서라는 용어는 cpu 코어 안의 여러개의 레지스터 세트가 있어서 여러개의 스레드를 동시에 처리할 수 있는 프로세서의 하드웨어적 특성이고 멀티스레딩이란 1코어 1스레드 cpu라도 프로세스를 여러개의 스레드로 나누어서 time slice 하여 여러개의 스레드를 순차적으로 멀티태스킹 처리할 수 있는 것을 말한다.
코어와 멀티코어
일반적 인식의 cpu의 명령어 처리는 코어 하나에서 이루어진다.
코어에는 그에 필요한 ALU와 control unit, 레지스터 세트가 포함되며 멀티코어 cpu 라면
cpu 하나 내부의 여러개의 코어에서 동시에 여러 명령어의 동시 처리가 가능하다.
기본 숙제
P125 2번문제
연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터 -> 플래그 레지스터
메모리에서 가져올 명령어의 주소를 저장하는 레지스터 -> 프로그램 카운터
데이터와 주소를 모두 저장할 수 있는 레지스터 -> 범용 레지스터
해석할 명령어를 저장하는 레지스터 -> 명령어 레지스터
P155 4번문제
멀티코어 CPU를 도식화한 그림이 있고, CPU 내부에 두개의 묶음이 있고
한 묶음에는 레지스터들과 ALU, 제어장치가 있다.
각 묶음은 코어다. 듀얼코어 CPU의 그림이다.