초점 : 개발자가 알아야 할 배경지식
레지스터
CPU 안에 있는 작은 임시 저장장치 : 각기 다른 이름 & 역할 존재
•
프로그램을 이루는 데이터 & 명령어가 프로그램의 실행 전후로 레지스터에 저장 → 레지스터에 저장된 값만 잘 관찰해도 비교적 낮은 수준의 프로그램이 어떻게 작동하는지 파악 가능
•
각 레지스터는 저마다의 역할을 갖고 각자의 역할에 알맞은 내용들을 저장
CPU를 구성하는 레지스터들의 세세한 종류와 이름은 조금씩 다름. 아래에서 살펴볼 레지스터들은 대부분의 CPU가 공통적으로 포함하고 있는 대표적인 주요 레지스터에 해당
1) 프로그램 카운터(명령어 포인터)
PC(Program Counter) IP(Instruction Pointer)
메모리에서 다음으로 읽어 들일 명령어 주소를 저장하는 레지스터
•
일반적으로 프로그램 카운터는 1씩 증가(= 다음으로 읽어 들일 메모리 주소가 1씩 증가)
•
다만, 조건문이나 리턴문을 만나는 경우, 프로그램이 순차적으로 실행되지 않음 → 프로그램 카운터 값이 임의 위치로 변경
2) 명령어 레지스터
IR(Instruction Register)
해석할 명령어(메모리에서 방금 읽어 들인 명령어)를 저장하는 레지스터
•
CPU 내 제어장치가 명령어 레지스터 속 명령어를 해석한 뒤, ALU로 하여금 연산하도록 시키거나 다른 부품으로 제어 신호를 보내 해당 부품을 작동시킴
3) 범용 레지스터
General Purpose Register
일반적인 상황에서 자유롭게 사용 가능한 레지스터
•
데이터, 명령어, 주소 모두 저장 가능
•
일반적으로 CPU 내에는 여러 개의 범용 레지스터가 존재
4) 플래그 레지스터
Flag Register
연산 결과 또는 CPU 상태에 대한 부가 정보(플래그) 값을 저장하는 레지스터
•
플래그 : CPU가 명령어를 처리하는 과정에서 반드시 참조해야 할 상태 정보를 의미하는 비트
◦
매우 다양한 플래그 종류가 존재 : 부호 플래그, 제로 플래그, 캐리 플래그, 오버플로우 플래그, 인터럽트 플래그, 슈퍼바이저 플래그
◦
EX : CPU의 연산 직후 플래그 레지스터 내 부호 플래그가 1이 되었다면, 연산 결과가 음수임을 의미
5) 스택 포인터
Stack Pointer
메모리 내 스택 영역의 최상단 스택 데이터 위치를 가리키는 특별한 레지스터
•
스택 영역 : 스택처럼 사용하자고 약속된 메모리 영역
•
스택 포인터 : 스택에 마지막으로 저장된 데이터의 위치를 가리키는 레지스터(= 스택이 채워진 정도를 나타내는 레지스터)
인터럽트
다양한 상황에서 발생 가능
•
인터럽트 : CPU의 작업을 방해하는 신호
◦
인터럽트 유형
1.
동기 인터럽트 : CPU에 의해 발생하는 인터럽트
•
프로그래밍 오류와 같은 예외적인 상황을 마주쳤을 때 발생하는 인터럽트 → 예외라고도 부름
2.
비동기 인터럽트 : 입출력장치에 의해 발생하는 인터럽트
•
알림과 같은 역할 수행
예시
하드웨어 인터럽트(비동기 인터럽트)
알림
•
CPU는 효율적인 명령어 처리를 위해 하드웨어 인터럽트를 사용
◦
폴링(입출력장치의 상태가 어떤지, 처리할 데이터가 있는지 주기적으로 확인하는 방법) → 주기적으로 프린터 완료 여부를 확인해야함
◦
하드웨어 인터럽트 → 온전히 다른 작업을 처리 가능(알림을 받았을 때 처리하면 되니까)
▪
입출력 완료 여부 확인을 위한 CPU 사이클 낭비 최소화
•
일반적으로 CPU가 하드웨어 인터럽트를 처리하는 순서
1.
입출력장치가 CPU에게 인터럽트 요청 신호 전송
2.
CPU는 실행 사이클 종료 후, 명령어 인출 전 항상 인터럽트 여부 확인
3.
CPU는 인터럽트 요청 확인 후, 인터럽트 플래그를 통해 현재 인터럽트를 수용 가능한지 여부 확인
4.
인터럽트 수용 가능시, CPU가 지금까지의 작업을 백업
5.
CPU는 인터럽트 벡터를 참조해 인터럽트 서비스 루틴 실행
6.
인터럽트 서비스 루틴 실행 종료시, 4에서 백업해 둔 작업 복구 후 실행 재개
