ALU와 제어장치
- ALU : 계산하는 장치
- 제어장치 : 제어 신호를 발생시키고 명령어를 해석하는 장치
여기서는 ALU가 내보내고 받아들이는 정보와 제어장치가 내보내고 받아들이는 정보에 대해 다룬다.
ALU
계산을 하기 위해서는 피연산자와 수행할 연산이 필요하다. 레지스터로부터 피연산자를, 제어장치로부터 제어 신호를 받아들인다.
연산 후에는 결괏값(숫자, 문자, 주소 등)을 레지스터에 저장한다.
플래그는 연산 결과에 대한 부가 정보이다. 연산 결과가 음수라면, 연산 결과가 음수라는 부가 정보가 플래그 레지스터에 저장된다.
연산결과가 결과를 담을 레지스터에 비해 너무 크다면, 이것 또한 플래그 레지스터에 저장된다. 이 경우 오버플로우가 났다고 표현한다.
제어 장치
받아들이는 정보
- 클럭
컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위
- 해석할 명령어
제어 장치는 해석할 명령어를 받아들이고 이 명령어를 해석해 제어 신호를 내보냄
- 플래그
- 플래그 레지스터에서 플래그도 받아 들인다.
- 제어 신호
- 제어 신호를 발생시키는 것은 CPU만 있는 것이 아님
- 외부에서 발생한 제어 신호가 CPU로 전달된다면 제어장치가 받아들임
내보내는 정보
제어 장치는 제어 신호를 내보내는데 CPU 내부에 전달하는 제어 신호와 CPU 외부에 전달하는 제어 신호로 나뉜다.
- CPU 내부에 전달하는 제어 신호
- 레지스터에 전달
- ALU에 전달
- CPU 외부에 전달하는 제어 신호
- 메모리에 전달
- 입출력 장치에 전달
레지스터
- CPU 내부의 작은 임시 저장장치
- 프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장
반드시 알아야 할 레지스터
- 프로그램 카운터 : 메모리에서 가져올 명령어의 주소(메모리에서 읽어 들일 명령어의 주소)를 저장
- 명령어 레지스터 : 해석할 명령어(방금 메모리에서 읽어 들인 명령어)를 저장
- 메모리 주소 레지스터 : 메모리의 주소를 저장
- 메모리 버퍼 레지스터 : 메모리와 주고받을 값을 저장 (데이터와 명령어)
프로그램 카운터가 계속 1씩 증가하는 것은 아니다.
순차적인 실행 흐름이 끊기는 경우
- 특정 메모리 주소로 실행 흐름을 이동하는 명령어 실행 시(e.g. JUMP, CONDITIONAL JUMP, CALL, RET)
- 인터럽트 발생 시
- 기타...
5. 플래그 레지스터 : 연산 결과 또는 CPU 상태에 대한 부가적인 정보
6. 범용 레지스터 : 다양하고 일반적인 상황에서 자유롭게 사용
7. 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터(스택이 어디까지 차 있는지에 대한 표시)
8. 베이스 레지스터 : 기준 주소를 저장하는 레지스터
- 변위 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소 얻기
변위 주소 지정 방식에는 두 가지가 있다.
상대 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더하여 유효 주소 얻기
베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더하여 유효 주소 얻
명령어 사이클과 인터럽트
명령어 사이클
프로그램 속 명령어들은 일정한 주기가 반복되며 실행되는데, 이 주기를 명령어 사이클이라고 한다.
메모리에 저장된 명령어를 실행하려면?
인출 사이클 : 가장 먼저 CPU로 가지고 와야 한다.
실행 사이클 : 가져온 것을 실행
일반적으로 CPU는 인출 - 실행 -인출 -실행 ... 이렇게 인출 사이클과 실행 사이클이 반복되면서 실행된다.
그런데 CPU로 명령어를 가지고 와도 바로 실행이 불가능한 경우도 있다.
인터럽트
인터럽트(interrupt) : 방해하다, 중단시키다
CPU가 꼭 주목해야 할 때, CPU가 얼른 처리해야 할 다른 작업이 생겼을 때 발생
동기 인터럽트(예외)
CPU가 예기치 못한 상황을 접했을 때 발생
비동기 인터럽트(하드웨어 인터럽트)
- 주로 입출력장치에 의해 발생
- 알림과 같은 역할
하드웨어 인터럽트는 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용한다.
입출력장치는 CPU에 비해 느리기 때문에 인터럽트가 없다면 CPU는 프린트 완료 여부를 알기 위해 주기적으로 확인해야 한다.
하지만 인터럽트가 있다면 입출력 작업 동안 CPU는 다른 일을 할 수 있다.
하드웨어 인터럽트의 처리 순서
(인터럽트의 종류를 막론하고 인터럽트 처리 순서는 대동소이하다)
- 입출력장치는 CPU에 인터럽트 요청 신호를 보낸다.
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전에 항상 인터럽트 여부를 확인한다.
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
- 인터럽트 서비스 루틴 실행이 끝나면 4에서 백업해 둔 작업을 복구하여 실행을 재개한다.
인터럽트 요청 신호
CPU가 인터럽트 요청을 받아들이려면 인터럽트 플래그를 통해 받아들일 수 있는지 없는지 상태를 확인한다.
CPU가 인터럽트를 받아들이기로 했다면 인터럽트 서비스 루틴을 실행한다.
인터럽트 서비스 루틴이란 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하기 위한 프로그램이다. 인터럽트 서비스 루틴도 프로그램이므로 메모리에 저장된다.
CPU는 현재 실행 중인 프로그램을 실행하다가 인터럽트가 발생하면 해당 명령어까지 실행 후 그 인터럽트로 돌아가서 인터럽트를 실행하고 다시 원래 실행 중이던 프로그램으로 되돌아가 수행을 계속한다.
인터럽트 벡터 : 각각의 인터럽트를 구분하기 위한 정보
'CPU가 인터럽트를 처리한다'라는 말은 '인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다.'라고 할 수 있다.
인터럽트를 처리하기 위해 지금까지 작업한 정보가 있는 레지스터는 어딘가에 백업을 해야 하는데, 스택에 백업을 한다.
인터럽트 서비스 루틴의 실행이 끝나면 다시 복구한다.
'CS > 컴퓨터 구조' 카테고리의 다른 글
메모리와 캐시 메모리 (1) | 2023.05.20 |
---|---|
CPU의 성능 향상 기법 (0) | 2023.05.12 |
소스 코드와 명령어 (0) | 2023.03.21 |
데이터 (0) | 2023.03.20 |
컴퓨터 구조 개요 (0) | 2023.03.15 |