CPU - CPU는 컴퓨터구조에 있어서 중요한 부품 중 하나이다.
ALU와 제어장치
- ALU(Arithmatic Logic Unit)는 연산을 수하는 장치
- 제어장치는 제어 신호를 발생시키고 명령어를 해석하는 장치
ALU가 받아들이는 정보
- 계산을 하기 위해서는 피연산자와 수행할 연산이 필요
- 레지스터에서 피연산자를 받아들인다.
- 제어장치로부터 제어 신호를 받아들인다.
ALU가 내보내는 정보
- 결과값
- 플래그 값
결과값을 레지스터에 저장하는 이유 - CPU에서 메모리로 접근하는 것보다 레지스터로 접근하는 것이 빠르기 때문이다.
플래그 - 연산 결과에 대한 부가 정보
제어장치 - 받아들이는 정보
클럭 - 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위
해석할 명령어
- 플래그
- 제어 신호: 주변 장치들도 제어 신호를 발생시킬 수 있다.
제어 장치 - 내보내는 정보
제어신호 (To. 레지스터)
제어신호 (To. ALU)
제어신호 (To. 메모리)
제어신호 (To. 입출력장치)
레지스터
- 레지스터는 CPU 내부의 작은 임시저장장치로, 프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장된다.
- CPU 내부에는 다양한 레지스터들이 있고, 각기 다른 역할을 한다.
반드시 알아야 할 레지스터
1. 프로그램 카운터 (Program Counter)
- 다음 명령의 주소를 일시적으로 저장하는데 사용된다.
- 현재 명령의 주소나 그 다음 명령의 주소를 가리킨다.
2. 명령어 레지스터 (Instruction Register)
- 해석할 명령어 (방금 메모리에서 읽어들인 명령어) 저장
- 레지스터가 제어장치에 지시를 하면, 컴퓨터의 해당 구성요소로 신호를 전송하고 명령을 해석하여 실행한다.
3. 메모리 주소 레지스터 (Memory Address Register)
- 데이터를 읽거나 쓰려는 메모리의 주소 저장
- CPU가 읽어들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터
4. 메모리 버퍼 레지스터 (Memory Buffer Register)
- 메모리와 주고받을 값 일시적으로 저장 (데이터와 명령어)
- CPU가 정보를 데이터 버스로 주고받을 때 거치는 레지스터
5. 플래그 레지스터
- 연산 결과 또는 cpu 상태에 대한 부가적인 정보 저장
- 양수인지 음수인지 판단하는 플래그도 포함되어있다.
6. 범용 레지스터
- 다양하고 일반적인 상황에서 자유롭게 사용
7. 스택 포인터
- 주소 지정에 사용
- 스택의 꼭대기를 가리킴
스택 주소 지정 방식
- 스택과 스택 포인터를 이용한 주소 지정 방식
- 스택 포인터: 스택의 꼭대기를 가리키는 레지스터(스택이 어디까지 차 있는지에 대한 표시)
8. 베이스 레지스터
- 주소 지정에 사용
- 기준 주소 저장
변위 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 특정 레지스터(프로그램 카운터 또는 베이스 레지스터)의 값을 더하여 유효 주소 얻기
상대 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더하여 유효 주소 얻기
베이스 레지스터 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더하여 유효 주소 얻기
베이스 레지스터는 기준 주소 역할을 한다고 보면 된다.
기준 주소로부터 X번째 떨어진 코드 실행!
프로그램 순차적인 실행 흐름이 끊기는 경우
- 특정 메모리 주소로 실행 흐름을 이동하는 명령어 실행 시 (e.g. JUMP, CONDITIONAL JUMP, CALL, RET)
- 인터럽트 발생 시
명령어 사이클과 인터럽트
CPU는 정해진 흐름대로 명령어를 처리한다 -> 명령어 사이클
프로그램 속 명령어들은 일정한 주기가 반복되며 실행한다.
이 주기를 명령어 사이클이라고 한다.
명령어 사이클은 인출, 실행, 간접, 인터럽트 사이클로 구성되어 있다.
메모리에 저장된 명령어를 실행하려면?
인출 사이클: CPU로 데이터를 가져온다
실행 사이클: 실행한다
인출-실행-인출-실행 반복
그런데 CPU로 명령어를 가져와도 바로 실행이 불가능한 경우가 있다.
ex) 간접 주소 지정 방식
간접 사이클
- 메모리 접근이 더 필요한 경우
어떤 명령어는 인출과 실행 사이클만으로 실행되고 어떤 명령어는 인출, 간접, 실행 사이클을 거쳐 실행된다.
인터럽트(interrupt) ex) keyboard interrupt
- CPU가 꼭 주목해야할 때, CPU가 얼른 처리해야 할 다른 작업이 생겼을 때 발생
- 인터럽트의 종류에는 예외와 하드웨어 인터럽트가 있다.
인터럽트의 종류
동기 인터럽트 (예외)
- CPU가 예기치 못한 상황을 접했을 때 발생
- 폴트
- 트랩
- 중단
- 소프트웨어 인터럽트
비동기 인터럽트 (하드웨어 인터럽트)
- 주로 입출력장치에 의해 발생
- 알림과 같은 역할
- 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트 사용
- 입출력장치는 CPU에 비해 느리다
- 인터럽트가 없다면 CPU는 프린트 완료 여부를 확인하기 위해 주기적으로 확인해야 한다.
- 인터럽트가 있다면 입출력 작업동안 CPU는 다른 일을 할 수 있다.
하드웨어 인터럽트의 처리 순서
인터럽트의 처리 순서는 대동소이하다.
1. 입출력장치는 CPU에 인터럽트 요청 신호를 보낸다.
2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
6. 인터럽트 서비스 루틴 실행이 끝나면 4에서 백업해둔 작업을 복구하여 실행을 재개한다.
인터럽트 요청 신호
- CPU의 흐름을 끊어도 되는지에 대한 신호
CPU가 인터럽트 요청을 받아들이려면?
- 실행 사이클이 끝나고 나면 플래그 레지스터의 인터럽트 플래그를 확인한다.
- 현재 인터럽트를 받아들일 수 있다면 처리, 그렇지 않으면 처리 X
- 모든 인터럽트를 인터럽트 플래그로 막을 수 있는 것은 아니다. (non-markable interrupt)
- ex) 하드웨어 고장이나 정전과 같은 긴급한 상황
CPU가 인터럽트를 받아들이기로 했다면 인터럽트 서비스 루틴 실행
인터럽트 서비스 루틴이란, 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하면 되는지 적혀있는 프로그램이다.
ex1) 키보드가 인터럽트 요청을 보내면 이렇게 행동해야 한다.
ex2) 마우스가 인터럽트 요청을 보내면 이렇게 행동해야 한다.
인터럽트 서비스 루틴도 프로그램이기에 메모리에 저장된다.
인터럽트 벡터: 각각의 인터럽트를 구분하기 위한 정보
CPU가 인터럽트를 처리한다 == 인터럽트 서비스 루틴을 실행하고 본래 수행하던 작업으로 다시 돌아온다. (+ 그리고 인터럽트의 시작 주소는 인터럽트 벡터를 통해 알 수 있다.)
인터럽트 서비스 루틴 실행 전에, 본래 실행되던 것들의 정보는 스택 영역에 저장된다. 인터럽트 서비스 루틴 종료 후에는 스택에서 복구를 해오게 된다.
'컴퓨터 구조' 카테고리의 다른 글
[컴퓨터구조] RAM (0) | 2024.03.23 |
---|---|
[컴퓨터구조] 빠른 CPU를 위한 설계 (0) | 2024.03.15 |
[컴퓨터구조] 소스 코드와 명령어 (1) | 2024.03.08 |
[컴퓨터구조] 컴퓨터가 0과 1로 숫자 및 문자를 표현하는 방법 (1) | 2024.03.08 |
[컴퓨터구조] 컴퓨터의 핵심 부품 4가지 (0) | 2024.03.06 |