본문 바로가기
Computer Science/컴퓨터 구조

[컴퓨터 구조] ep4) CPU와 인터럽트

by 클레어몬트 2024. 2. 14.

컴퓨터의 두뇌 CPU == 프로세서에 대해서 자세히 알아보자
ㅁCPU(Central Processing Unit) = ALU + 제어장치 + 레지스터
 
 
ㅇALU(Arithmetic Logic Unit) 산술연산장치

ALU가 어떤 정보를 받아들이고 어떤 정보를 내보내는지 표현한 그림

 
ALU는 플래그를 내보낸다 아래의 표를 보자

ALU가 내보내는 대표적인 플래그 6가지

 
이 플래그들은 모두 플래그 레지스터에 저장된다

플래그 레지스터의 형태

 
 
 
이 밖에도 ALU 내부에는 여러 계산을 위한 회로들이 있다
가산기: 덧셈
보수기: 뺄셈
시프터: 시프트 연산 수행
오버플로우 검출기: 오버플로우 대비
누산기: AC(accumulator) - 연산결과 등을 일시적으로 저장해 두는 레지스터
 
 
ㅇ제어장치(Control Unit)
제어장치: 제어신호 발생 + 명령어 해석

파란색) 제어장치가 받아들이는 것
1. 클럭 신호
여기서 클럭(clock)이란 컴퓨터의 시간 단위이다 "컴퓨터 부품들은 클럭이라는 박자에 맞춰 작동한다"
2. 해석할 명령어
명령어 레지스터(IR)로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생시킨다
3. 플래그 레지스터의 플래그값
플래그값을 받아들이고 이를 참고하여 제어 신호를 발생시킨다
4. 제어 버스로 전달된 제어신호
제어 버스를 통해 외부로부터 전달된 제어 신호를 받아들인다 e.g. 입출력장치(I/O)
 
빨간색) 제어장치가 내보내는 것 "제어장치는 제어신호만을 내보낸다"
ㅇCPU 외부(제어 버스로 제어신호를 내보낸다): 메모리, 입출력장치(I/O, 보조기억장치)
ㅇCPU 내부: ALU, 레지스터
 
 
 
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
 
ㅇ레지스터
"프로그램 속 데이터와 명령어는 실행 전후로 반드시 레지스터에 저장된다"
 
크게 레지스터에는 8가지 종류가 있고 먼저 4가지를 살펴보겠다
1. 프로그램 카운터(PC): 메모리에서 가져올 명령어의 주소 저장(= 메모리에서 읽어 들일 명령어의 주소 저장)
※명령어 포인터(IP)라고 하는 CPU도 있다
 
2. 명령어 레지스터(IR): 해석할 명령어 저장(= 방금 메모리에서 읽어들인 명령어 저장)
제어장치는 명령어 레지스터(IR) 속 명령어를 받아들이고 이를 해석한 뒤 제어신호를 내보낸다
 
3. 메모리 주소 레지스터(MAR): 메모리의 주소 저장
CPU가 읽어 들이고자 하는 주소값을 주소버스로 보낼 때 메모리 주소 레지스터를 거치게 된다
 
4. 메모리 버퍼 레지스터(MBR): 메모리와 주고 받을 데이터와 명령어 저장
메모리에 쓰고 싶은 값이나 메모리로부터 전달받은 값은 메모리 버퍼 레지스터(MBR)을 거치게 된다
(CPU가 주소버스로 내보낼 값이 MAR을 거친다면, 데이터버스로 주고 받을 값은 MBR을 거치게 된다)
※메모리 버퍼 레지스터를 메모리 데이터 레지스터(MDR)이라고도 부른다
 
+ 우리가 c언어에서 scanf로 받을 때의 버퍼와는 별개의 개념이다, MBR은 RAM에 적재되기 전에 거쳐가는 공간이기 때문에 사용이 될 수도 있고 아닐 수도 있다 이는 컴파일러나 구현에 따라 다르다
 
 
 
<메모리에 저장된 프로그램을 실행하는 과정>

 
 
프로그램 카운터(PC)값이 증가하고 1000번지 명령어 처리가 끝나면 CPU는 다음 명령어(1001번지)를 읽어 들인다
이처럼 PC는 지속적으로 증가하며 계속해서 다음 명령어를 읽어 들일 준비를 한다, 이 과정이 반복되면서 CPU는 프로그램을 차례대로 실행해 나간다. 결국 CPU가 메모리 속 프로그램을 순차적으로 읽어 들이고 실행해 나갈 수 있는 이유는 CPU속의 PC가 꾸준히 증가하기 때문이다

따라서 일반적인 케이스는 PC가 꾸준히 증가하며 프로그램을 차례대로 실행시킨다
순차적인 실행흐름이 끊기는 예외 케이스: 인터럽트, 특정 메모리 주소로 이동시키는 명령어 실행 시
 
 
 
다시 이어서 레지스터의 나머지 종류 4가지를 살펴보자
5. 범용 레지스터: 말 그대로 다양하고 자유롭게 사용할 수 있는 올라운더 레지스터
MAR주소버스로 내보낼 주소값만을 저장하고
MBR데이터버스데이터만을 저장하지만
범용 레지스터주소 + 데이터 모두 저장할 수 있다
 
6. 플래그 레지스터: 연산결과 / CPU상태에 대한 부가적인 정보 저장

플래그 레지스터의 형태

 
PSW(Program Status Word): 플래그 레지스터보다 더 넓은 범위의 레지스터이다
PSW는 일반적으로 프로세서의 상태 및 환경에 중점을 두고 플래그 레지스터는 대게 연산에 중점을 둔다

PSW도 레지스터임을 주의!


 
 
 
나머지 두 개는 주소 지정 방식에 사용되는 레지스터이다
7. 스택 포인터: 스택의 꼭대기(마지막으로 저장한 값의 위치)
스택 주소 지정 방식: EA = top of stack

스택과 스택 포인터를 이용한 주소 지정 방식
 
+ 스택영역은 메모리 안에 사용될 영역이 정해져 있다
 
 
8. 베이스 레지스터: 기준 주소 저장
변위 주소 지정 방식: EA = A + (R)
오퍼랜드의 필드값(변위)과 특정 레지스터의 값을 더하여 유효주소를 얻어내는 방식
 
1) 상대 주소 지정 방식: EA = 오퍼랜드 + PC값

오퍼랜드가 -3이라면 CPU는 읽어 들이기로 한 명령어로부터 -3만큼의 번지로 접근한다
 
 
2) 베이스 레지스터 주소 지정 방식: EA = 오퍼랜드 + 베이스 레지스터

오퍼랜드: 기준주소로부터 떨어진 거리
베이스 레지스터: 기준주소
 
(6장 주소 변환에서 또 나오는 개념이다)
 
3) 인덱싱
-생략-
 
 
 
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
 
ㅁ명령어 사이클: 하나의 명령어가 처리되는 주기

 
 
ㅇ인출(fetch) 사이클: 메모리에 있는 명령어를 CPU로 가져오는 단계

 
ㅇ실행(execution) 사이클: CPU로 가져온 명령어를 실행하는 단계

 

하지만 메모리 접근이 더 필요한 경우에 간접 사이클 단계를 더 거치게 된다

 
 
 

우리에게 아주 간단한 A+B 계산! 실상은 이러하다

example of Program Execution

 

<Fetch Stage>

첫 번째 fetch stage 시작 전 PC: 300 / IR: 이전 실행 명령

(1) MAR <- PC, PC++

(2) memory read, MBR <- (MAR애 저장된 번지의 명령)

(3) IR <- MBR

 

<Execution Stage>

#1

(1) 명령 분석

(2) MAR <- IR의 주소 부분

(3) memory read, MBR <- (MBR에 저장된 번지의 데이터)

(4) AC <- MBR

 

#2 - 덧셈 작업

(1) 명령 분석

(2) MAR <- IR의 주소 부분

(3) memory read, MBR <- (MAR에 저장된 번지의 데이터)

(4) AC <- AC + MBR

 

#3

(1) 명령 분석

(2) MAR <- IR의 주소 부분, MBR <- AC

(3) memory write, (MAR에 저장된 번지의 memory 공간) <- MBR

 

 

 


 
ㅁ인터럽트(Interrupt): 실행 중인 프로그램을 잠시 중단하고 다른 프로그램을 먼저 실행하는 것

 
<동기(synchronous) 인터럽트>
예외(exception)이라고도 불리며 CPU에 의해 발생하는 인터럽트를 말한다
더 자세한 건 운영체제에서 배우자
- 폴트
- 트랩 (e.g. 코드 오류, seg fault, overflow)
- 중단(abort)
- 소프트웨어 인터럽트
 
<비동기(asynchronous) 인터럽트>
하드웨어 인터럽트라고 말할 수 있겠다 주로 입출력장치(I/O)에 의해 발생하는 인터럽트를 말한다
알림이라고 생각하면 편하다 e.g. 프린터 완료 알림, 키보드 입력
대부분의 인터럽트는 막을 수 있지만 정전이나 하드웨어 고장 같은 경우의 인터럽트는 막을 수가 없다

하드웨어 인터럽트의 두 가지 종류

 
우리는 지금 컴퓨터 구조를 배우고 있으므로 이 하드웨어 인터럽트, 특히 하드웨어 인터럽트의 처리순서에 대해 알아보자
 
ㅁ하드웨어 인터럽트의 처리순서ㅁ
1. 입출력장치(I/O)가 CPU에 인터럽트 요청신호(req msg)를 보낸다
2. CPU는 실행사이클이 끝나고 명령어를 fetch 하기 전에 항상 인터럽트 여부를 확인한다
3. CPU가 인터럽트 요청신호(req msg)를 확인하고 인터럽트 플래그를 통해서 현재 인터럽트를 받아들일 수 있는 상황인지 확인한다
4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 스택에 백업시킨다
5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴(ISR)을 실행한다
6. 인터럽트 서비스 루틴이 끝나면 스택에 백업해 둔 작업을 복구하여 다시 실행을 재개한다 
 
여기서 굵은 글씨의 낯설지만 핵심인 키워드에 대해서 공부해 보자
ㅇ인터럽트 요청 신호(req msg): 인터럽트를 걸기 전에 지금 걸어도 되는지 물어보는 요청 신호
 
ㅇ인터럽트 플래그: CPU가 인터럽트 요청을 받아들일지 무시할지를 결정하는 비트(플래그 레지스터에 있다)

 
 
ㅇ인터럽트 서비스 루틴(ISR): 대응 매뉴얼 프로그램 (OS의 한 파트, 프로그램이다)
= 인터럽트 핸들러(Interrupt Handler)라고도 부른다

인터럽트 서비스 루틴 프로그램은 메모리에 내장되어 있다!
 
 
ㅇ인터럽트 벡터: 인터럽트 서비스 루틴을 식별하기 위한 정보 (on 데이터 버스)
(이정표라 생각하면 쉽다)

 
 


 
추가1) 인터럽트가 있어야 하는 이유

인터럽트 X vs 인터럽트 O(short I/O wait)

No Interrupts vs Interrupts; short I/O wait
Program Timing: short I/O wait

 

 

인터럽트 X vs 인터럽트 O(long I/O wait)

No Interrupts vs Interrupts; long I/O wait
Program Timing: long I/O wait

 

 

 


 
 
추가2) 스택에 정보들이 백업되는 과정

 
 

 

Q. 인터럽트 할 때 PC랑 PSW를 소프트웨어적이 아닌 하드웨어적으로 스택에 올려놓는 이유는?

A. 새로운 인터럽트를 실행하면 PC와 PSW값이 변경되므로 따로 저장해놔야 한다
 
 
 


 
 
참고 및 출처: 컴퓨터시스템구조론(William Stallings), 혼공컴운(강민철), Operating Systems: Internals and Design Principles(William Stalling), Operating System Concepts(Silberschatz, Abraham)