🧵ALU와 제어장치
💾ALU
ALU가 받아들이는 정보
- 레지스터로부터 피연산자를 받아들인다.
- 제어장치로부터 수행할 연산을 알려주는 제어신호를 받아들인다.
ALU가 내보내는 정보
- 연산 결과(숫자, 문자, 메모리 주소 등)을 레지스터에 저장한다.
- 플래그(추가적인 상태 정보)를 내보낸다.
⚙제어장치
제어장치가 받아들이는 정보
-
클럭 신호
컴퓨터의 모든 부품을 일사분란하게 움직일 수 있게 하는 시간 단위
-
해석해야 할 명령어
명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 후, 제어신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려준다.
-
플래그 레지스터 속 플래그 값
-
제어 버스로 전달된 제어 신호
제어장치가 내보내는 정보
- CPU 외부에 전달하는 제어 신호
- 제어 버스로 제어 신호를 내보낸다.
- 메모리 또는 입출력 장치에 전달
- CPU 내부에 전달하는 제어 신호
💻레지스터
- CPU 내부의 작은 임시저장장치
- 프로그램 속 명령어, 데이터는 실행 전후로 레지스터에 저장
🔎반드시 알아야 할 레지스터
1. 프로그램 카운터(PC)
메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소 저장
2. 명령어 레지스터(IR)
해석할 명령어, 즉 방금 메모리에서 읽어 들인 명령어 저장
3. 메모리 주소 레지스터(MAR)
메모리의 주소 저장
4. 메모리 버퍼 레지스터(MBR)
메모리와 주고받을 값(데이터, 명령어)을 저장
5. 플래그 레지스터
연산 결과 또는 CPU 상태에 대한 부가적인 정보 저장
6. 범용 레지스터
다양하고 일반적인 상황에서 자유롭게 사용
📡스택 주소 지정 방식
- 스택, 스택 포인터를 이용한 주소 지정 방식
- 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터
- 스택 영역 : 메모리 안에 스택처럼 사용할 영역
📚변위 주소 지정 방식
- 오퍼랜드 필드의 값(변위)과 특정 레지스터 값을 더하여 유효주소 계산
- 어떤 레지스터를 더하냐에 따라 여러 방식으로 나뉜다.
상대 주소 지정 방식
- 프로그램 카운터의 값을 더해 유효 주소 계산
- 분기하여 특정 주소의 코드 실행할 때 사용
베이스 레지스터 주소 지정 방식
- 베이스 레지스터의 값을 더해 유효 주소 계산
- 베이스 레지스터 : 기준 주소의 역할
- 오퍼랜드 : 기준 주소로부터 떨어진 거리의 역할
📌명령어 사이클과 인터럽트
- 프로그램 속 명령어들이 반복되며 실행되는 주기
🧨명령어 사이클의 과정
- 인출 사이클 : 메모리에 있는 명령어를 CPU로 가지고 오는 단계
- 실행 사이클 : CPU로 가져온 명령어를 실행하는 단계
명령어들은 일반적으로 위 두 사이클을 반복하며 실행된다.
그러나 간접 주소 지정 방식은 오퍼랜드에 유효 주소의 주소를 명시하기 때문에 바로 실행 사이클에 돌입할 수 없다.
그래서 아래 그림처럼 메모리 접근을 한번 더 하는 간접사이클을 추가하기도 한다.
✂인터럽트
- CPU의 작업을 방해하는 신호
- CPU가 처리해야 할 다른 작업이 생겼을 때 발생한다.
인터럽트의 종류
- 동기 인터럽트(예외)
- CPU에 의해 발생하는 인터럽트로 예외적인 상황에 마주쳤을 때 발생
- 폴트, 트랩, 중단, 소프트웨어 인터럽트 등이 있다.
- 비동기 인터럽트(하드웨어 인터럽트)
- 알림과 같은 역할을 한다.
- 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용.
→ 입출력장치는 CPU에 비해 느려서 인터럽트가 없다면 완료 여부 확인을 위해 주기적으로 확인을 해야한다.
- 하지만 인터럽트가 있다면 입출력 작업 동안 CPU는 다른 일 수행 가능
하드웨어 인터럽트 처리 순서
-
인터럽트 요청 신호
인터럽트하기 전 CPU에 물어보는 신호
-
인터럽트 플래그
하드웨어 인터럽트를 받아들일지, 무시할지 결정하는 플래그
모든 플래그를 막을 수 있는 것은 아니다.
-
인터럽트 서비스 루틴
인터럽트를 처리하기 위한 프로그램으로 메모리에 저장되어 있다.
인터럽트가 발생했을 때 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어져 있다.
CPU가 인터럽트를 처리하는 것은 인터럽트 서비스 루틴을 실행하고, 보래 수행하던 작업으로 다시 돌아오는 것과 같다.
-
인터럽트 벡터
인터럽트 서비스 루틴을 식별하기 위한 정보
위 그림처럼 여러 개의 인터럽트 서비스 루틴이 저장되어 있는데 이들을 구분하기 위해 이용한다.
-
인터럽트 서비스 루틴을 실행할 때
인터럽트 요청 받기 전까지 CPU가 수행하던 모든 값들을 스택에 백업한다.
-
인터럽트까지 추가한 명령어 사이클은 다음과 같다.