혼자 공부하는 컴구, 운체

[2주차] Chapter 04. ALU, 제어장치, 레지스터, 명령어 사이클, 인터럽트

털난 모짜렐라 2023. 7. 16. 22:08

Chapter 04 CPU의 작동원리


04-1 ALU와 제어장치

1. ALU

ALU

 -컴퓨터 내부에서 수행되는 대부분의 계산을 하는 부품

▲ALU가 받아들이고 내보내는 정보

ALU가 받아들이는 정보 

 -레지스터로부터 계산에 필요한 피연산자를 받아들인다.

 -제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들인다.

 

ALU가 내보내는 정보

 -결괏값(특정 숫자, 문자, 메모리 주소)을 레지스터에 우선 저장한다.

CPU가 메모리에 접근하는 속도는 느리고, 모든 결괏값을 메모리에 저장하게 되면 CPU가 메모리에 접근하는 횟수가 늘어나 프로그램 성능 저하가 일어날 수 있기 때문이다.

 - 플래그(flag, 연산 결과에 대한 추가정보, Chapter 02-1 2.②-1 항목 아래에 한 번 나온 적 있다.)를 플래그 레지스터라는 레지스터에 저장한다.

  ALU가 내보내는 대표적인 플래그는 아래 표를 참고하자. 

플래그 종류 의미 사용 예시
부호 플래그 연산한 결과의 부호를 나타낸다. 1 연산 결과가 음수다.
0 연산 결과가 양수다.
제로 플래그 연산 결과가 0인지 여부를 나타낸다. 1 연산 결과가 0이다.
0 연산 결과가 0이 아니다.
캐리 플래그 연산 결과 올림수나 빌림수가 발생 여부를 나타낸다. 1 올림수나 빌림수가 발생했다.
0 올림수나 빌림수가 발생하지 않았다.
오버플로우 플래그 오버 플로우(overflow, 연산결과가 연산 결과를 담을 레지스터보다 큰 상황) 발생 여부를 나타낸다. 1 오버플로우가 발생했다.
0 오버플로우가 발생하지 않았다.
인터럽트 플래그 인터럽트(04-3참고)의 가능 여부를 나타낸다. 1 인터럽트가 가능하다.
0 인터럽트가 불가능하다.
슈퍼바이저 플래그 커널 모드로 실행 중인지, 사용자 모드로 실행중인지를 나타낸다.
커널 모드와 사용자 모드는 Chapter 09 참고
1 커널 모드로 실행 중이다.
0 사용자 모드로 실행 중이다.

▲플래그 사용의 예시, 연산 수행 후 부호 플래그가 1이 되었다면 연산 결과는 음수다.

③ ALU 내부 계산을 위한 회로들

 -가산기 : 덧셈

 -보수기 : 뺄셈

 -시프터 : 시프트 연산 수행

 -오버플로우 검출기 : 오버플로우를 대비

 

2. 제어장치

제어장치

 -제어 신호(컴퓨터 부품을 관리하고 작동시키기 위한 일종의 전기 신호)를 내보내고, 명령어를 해석하는 부품

 -CPU  제조사마다 제어장치의 구현 방식, 명령어를 해석하는 방식, 받아들이고 내보내는 정보에는 조금씩 차이가 있다.

▲제어장치

② 제어장치가 받아들이는 정보

 1. 클럭 신호

 -클럭(clock) : 컴퓨터의 모든 부품을 일사불란하게  움직일 수 있게 하는 시간 단위

 -클럭이라는 박자에 맞춰서 컴퓨터 부품들이 작동하는 것(한 박자마다 작동하는 것이 아니다.)으로, 하나의 명령어가 여러 클럭에 걸쳐 실행될 수 있다. 

  2. 해석해야 할 명령어

 -명령어 레지스터에 저장되어 있던 해석해야 할 명령어를 받아들여 해석한다.

 -해석 후, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려준다. 

  3. 플래그 레지스터 속 플래그 값

 -플래그 값을 받아들이고 참고하여 제어 신호를 발생시킨다.

  4. 시스템 버스 중 제어 버스로 전달된 제어 신호

 -외부(입출력 장치(보조기억장치 포함)를 비롯한 CPU 외부 장치 또한 제어 신호를 발생시킬 수 있다.)로부터 전달된 제어 신호를 받아들인다.

 

③ 제어장치가 내보내는 정보

 -CPU 외부에 전달하는 제어 신호 = 제어 버스로 제어 신호를 내보낸다.

 : 메모리에 전달하는 제어 신호

ex) 메모리에 저장된 값을 읽고 싶을 때, 메모리에 새로운 값을 쓰고 싶을 때

 : 입출력장치에 전달하는 제어 신호

 

 -CPU 내부에 전달하는 제어 신호

 : ALU에 전달하는 제어 신호

ex) 수행할 연산을 지시

 : 레지스터에 전달하는 제어 신호 

ex) 레지스터 간에 데이터의 이동, 레지스터에 저장된 명령어 해석


확인문제

1. 부호플래그가 1이므로 음수이고, 101은 011에 2의 보수법을 취한 값이므로 -3

2. ④, 산술 연산과 논리 연산을 담당하는 부품은 ALU이다. 

3. ① 플래그 레지스터, ② 명령어 레지스터, ③ 제어버스

4. ④, 하드 디스크는 보조 기억 장치이다.


04-2 레지스터

1. 반드시 알아야 할 레지스터

상용화된 CPU 속 레지스터는 CPU마다 이름, 크기, 종류가 다양하다. 

아래에 나오는 8개의 레지스터는 전공서적에서 중요하게 다루고, 많은 CPU가 공통으로 포함하고 있는 것들이다.

프로그램 카운터(PC; Program Counter 또는 명령어 포인터(IP; Instruction Pointer))

 -메모리에서 읽어 들일 명령어의 주소를 저장한다.

 -지속적으로 증가하며 계속해서 다음 명령어를 읽어 들일 준비를 한다. 이는 CPU가 프로그램을 순차적으로 읽어 들이고 실행해 나갈 수 있는 이유이다.

 

명령어 레지스터(IR; Instruction Register)

 -메모리에서 읽어 들인 명령어를 저장한다.

 -제어장치가 이 레지스터(명령어 레지스터) 속 명령어를 받아들이고 해석한 뒤 제어 신호를 내보낸다.

 

메모리 주소 레지스터(MAR; Memory Address Register)

 -메모리의 주소를 저장한다.

 -CPU가 주소 버스로 내보낼 값(읽어 들이고자 하는 주소 값)이 레지스터(메모리 주소 레지스터)를 거친다.

 

메모리 버퍼 레지스터(MBR; Memory Buffer Register 또는 메모리 데이터 레지스터(MDR; Memory Data Register))

 -메모리와 주고받을 값(데이터와 명령어)을 저장한다.

 -데이터 버스로 주고받을 값(메모리에 쓰고 싶은 값/메모리로부터 전달받은 값)이 이 레지스터(메모리 버퍼 레지스터)를 거친다. 


프로그램 카운터, 명령어 레지스터, 메모리주소 레지스터, 메모리 버퍼 레지스터의 작동 과정

 

01. CPU로 실행할 프로그램이 1000번지~1500번지에 저장되어 있다고 가정한다.

 

02. 프로그램을 실행하기 위해 프로그램 카운터에 1000이 저장된다.
(=메모리에서 가져올 명령어가 1000번지에 있다.)

 

03. 주소 버스로 1000번지를 내보내기 위해 메모리 주소 레지스터에 1000이 저장된다.

 

04. 제어 버스로 '메모리 읽기' 제어 신호가, 주소버스로 메모리 주소 레지스터 값이 메모리로 보내진다. 

 

05. 메모리 1000번지에 저장된 값은 데이터 버스를 통해 메모리 버퍼 레지스터로 전달된다.
프로그램 카운터는 증가되어 다음 명령어를 읽어 들일 준비를 한다.

 

06. 메모리버퍼 레지스터에 저장된 값은 명령어 레지스터로 이동된다. 

 

07. 제어장치는 명령어 레지스터의 명령어를 해석하고 제어 신호를 발생시킨다. 
1000번지 명령어 처리가 끝나면 CPU는 증가된 프로그램 카운터(1001번지)를 읽어 들인다. 
더보기

+)순차적인 실행 흐름이 끊기는 경우

 -명령어 중 JUMP, CONDITIONAL JUMP, CALL, RET와 같이 특정 메모리 주소로 실행 흐름을 이동하는 명령어가 실행되었을 때

 -인터럽트(04-3 참고)가 발생했을 때


플래그 레지스터(flag Register)

 -ALU 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장한다.

 

범용 레지스터(general purpose register)

 -다양하고 일반적인 상황에서 자유롭게 사용할 수 있다.

 -데이터와 주소를 모두 저장할 수 있다. 

 -일반적으로 CPU 안에는 여러 개의 범용 레지스터들이 있고 현재 대다수 CPU는 모두 범용 레지스터를 가지고 있다.


 

주소 지정에 사용될 수 있는 특별한 레지스터

스택 포인터(stack pointer)

 -스택의 꼭대기를 가리킨다. (=스택에 마지막으로 저장한 값의 위치를 저장한다.)

 

베이스 레지스터

 -기준 주소를 저장한다.

 

 

2. 특정 레지스터를 이용한 주소 지정 방식

스택 주소 지정 방식

 -스택과 스택 포인터를 이용한 주소 지정 방식

 -스택 영역 : 메모리 안에 스택처럼 사용하기로 암묵적으로 약속된 영역

 -스택 주소 지정 방식의 예는 아래 표를 참고

아래에서 부터 주소가 매겨져 있고,
아래에서부터 데이터가 저장되어 있는 스택이 있다고 가정했을 때

4개의 데이터가 저장된 스택에서 스택 포인터에 저장된 값
스택에서 하나의 데이터를 꺼냈을 때,
꼭대기 주소가 달라졌으므로 스택 포인터에 '3번지'를 저장한다.
스택에 하나의 데이터를 추가했을 때,
꼭대기 주소가 달라졌으므로 스택 포인터에 '4번지'를 저장한다.

 

변위 주소 지정 방식(displacement addressing mode)

 -명령어의 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식

 -변위 주소 지정 방식을 사용하는 명령어는 연산 코드 필드(수행할 연산), 레지스터 필드(주소에 더할 레지스터의 값), 오퍼랜드 필드(주소)가 있다.

 

②-1 상대 주소 지정 방식(relative addressing mode)

 -오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식

 -오퍼랜드가 음수 n(-n)이라면 읽어 들이기로 한 명령어로부터 n번째 이전 번지 명령어를 실행한다.

 -오퍼랜드가 양수 n(+n)이라면 읽어 들이기로 한 명령어로부터 n번째 이후 번지 명령어를 실행한다.

 -if문과 같이 모든 코드를 실행하는 것이 아닌, 분기하여 특정 주소의 코드를 실행할 때 사용된다.  

 

②-2 베이스 레지스터 주소 지정 방식 

 -오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식

(=베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산하여 유효 주소를 얻어내는 방식)

ex) 베이스 레지스터에 100이라는 값이 저장되어 있고, 오퍼랜드가 20이라면, "기준 주소 100번지로부터 20만큼 떨어진 120번지로 접근하라"


확인문제

1. 2100번지

(기본미션)2. ① 플래그 레지스터, ② 프로그램 카운터, ③ 범용 레지스터, ④ 명령어 레지스터

3. 6번지. 현재 스택 포인터는 4번지를 가리키고, 한 번 빼면 5번지, 두 번 빼면 6번지를 가리킨다.

4. ④

① 산술 연산과 논리 연산을 수행하는 부품은 ALU이다. 

② 제어 신호를 발생시키는 부품은 제어장치이다.

③ 명령어를 해석하는 부품 또한 제어장치이다.


04-3 명령어 사이클과 인터럽트

1. 명령어 사이클

명령어 사이클(instruction cycle)

 -프로그램 속 각각의 명령어들이 실행되는 일정한 주기

 -인출 사이클과 실행 사이클의 반복

 

인출 사이클(fetch cycle)

 -메모리에 있는 명령어를 CPU로 가지고 오는 단계

 -명령어 사이클의 첫 번째 과정

(위 "프로그램 카운터, 명령어 레지스터, 메모리주소 레지스터, 메모리 버퍼 레지스터의 작동 과정"에서 2~6번이 인출 사이클의 과정)

 

실행 사이클(execution cycle)

 -CPU로 가져온 명령어를 실행하는 단계 (명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생시키는 단계)

 -명령어사이클의 두번째 과정 

 

간접 사이클(indirect cycle)

 -명령어를 실행하기 위해 메모리 접근을 한 번 더 하는 단계

 

2. 인터럽트

인터럽트(interrupt)

 -CPU의 정상적인 작업을 방해하는 신호

 -인터럽트의 종류를구분하는 통일된 기준은 없다. 혼자 공부하는 컴퓨터 구조+운영 체제는 인텔의 공식 문서를 참고한 기준이다.   

 

①-1 동기 인터럽트(synchonous interrrupts)

 -CPU에 의해 발생하는 인터럽트

 -CPU가 실행하는 프로그래밍 상의 예외적인 상황에서 발생하는 인터럽트로, 예외(exception)이라고 부른다.

 -예외의 종류

폴트(fault) 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외
트랩(trap) 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외
주로 디버깅(debugging, 개발 중 발생한 문제를 진단하고 해결하기 위한 작업)할 때 사용한다.
중단(abort) CPU가 실행중인 프로그램을 강제로 중단시킬 수밖에 없는 심각한 오류를 발견했을 때 발생하는 예외
소프트웨어 인터럽트(software interrupt) 시스템 호출이 발생했을 때 나타나는 예외

 

①-2 비동기 인터럽트(asynchonous interrrupts)

 -주로 입출력 장치에 의해 발생하는 인터럽트

ex) 프린터와 같은 입출력 장치에 입출력 작업을 부탁하고 작업을 끝낸 입출력 장치가 CPU에 완료 알림(인터럽트)를 보낸다.

    키보드, 마우스와 같은 입출력 장치가 어떠한 입력을 받아들였을 때 이를 처리하기 위해 CPU에 입력 알림(인터럽트)를 보낸다.

 -일반적으로는 비동기 인터럽트를 인터럽트라고 칭하나, 책에서는 용어 혼동을 방지하기 위하여 하드웨어 인터럽트라고 사용한다.  

 

하드웨어 인터럽트

 -알림과 같은 인터럽트로, 효율적인 명령 처리를 위해 사용된다.

하드웨어 인터럽트를 사용하지 않는다면, CPU는 자신보다 현저히 느린 입출력장치의 작업 완료 여부를 주기적으로 확인하느라 다른 일을 할 수 없고 사이클을 낭비하게 된다.

그러나 하드웨어 인터럽트를 사용하면 완료 인터럽트를 받을 때까지 CPU는 다른 작업을 처리할 수 있다.

 

②-1 하드웨어 인터럽트 처리 순서

1 입출력장치가 CPU에 인터럽트 요청 신호를 보낸다.
2 CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
3 CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다. 
4 인터럽트를 받아들일 수 있다면 CPU는  프로그램 카운터 값 등 현재 프로그램을 재개하기 위해 필요한 모든 내용을 스택에 백업한다.
5 CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴의 시작 주소가 위치한 곳으로 프로그램 카운터 값을 갱신하고 인터럽트 서비스 루틴을 실행한다.
6 인터럽트 서비스 루틴 실행이 끝나면 4에서 스택에 백업해 둔 작업을 복구하여 실행을 재개한다.

 -인터럽트 요청 신호 : 다른 기기가 CPU의 정상적인 실행 흐름을 끊기 전에 CPU에게 끼어들어도 되는지 묻는 것

 

 -인터럽트 플래그 : 하드웨어 인터럽트를 받아들일지, 무시할지를 결정하는 플래그

  플래그 레지스터의 인터럽트 플래그가 '가능' : CPU는 인터럽트 요청 신호를 받아들이고 인터럽트를 처리한다.

  플래그 레지스터의 인터럽트 플래그가 '불가능' : CPU가 중요한 작업을 처리해야 하거나 어떤 방해도 받지 않아야 할 때. CPU가 인터럽트 요청 신호를 무시한다. 단, 우선순위가 가장 높은 인터럽트일 경우 무시할 수 없다.

 -막을 수 있는 인터럽트(maskable interrupt) : 인터럽트 플래그로 막을 수 있는 인터럽트

 -막을 수 없는 인터럽트(non maskable interrupt) : 인터럽트 플래그로 막을 수 없는 인터럽트 (ex: 정전, 하드웨어 고장으로 인한 인터럽트) 

 

-인터럽트 벡터(interrupt vector) : 인터럽트 서비스 루틴을 식별하기 위한 정보

  CPU는 하드웨어 인터럽트 요청을 보낸 대상으로부터 데이터 버스를 통해 인터럽트 벡터를 전달받는다.

  인터럽트 벡터를 알면 인터럽트 서비스 루틴의 시작 주소를 알 수 있기 때문에 CPU는 특정 인터럽트 서비스 루틴을 처음부터 실행할 수 있다. 

 

 -인터럽트 서비스 루틴(ISR; Interrupt Service Routine 또는 인터럽트 핸들러(interrupt handler)) : 인터럽트를 처리하기 위한 프로그램

  어떤 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어져 있다.

  프로그램(=명령어와 데이터로 이루어져 있다)이므로 프로그램 카운터와 레지스터를 사용하며 실행된다.

인터럽트 없이 실행되는 경우 수행 도중 인터럽트가 발생한 경우

확인문제

1. ④, 인터럽트 사이클은 프로그램의 순차적인 흐름을 끊는다.

2. ③, 막을 수 없는 인터럽트가 존재한다.

3. 인터럽트 서비스 루틴

4. ②

5. ③