반응형
| 참고 도서: 혼자 공부하는 컴퓨터 구조+운영체제
04-1. ALU와 제어 장치
ALU
CPU에서 계산을 하는 부품
레지스터를 통해 피연산자와 제어 신호를 받아들인다.
피연산자와 제어신호를 바탕으로 다양한 연산 수행
> ALU의 결과 값을 레지스터에 우선 저장하는 이유
- CPU에서 레지스터에 접근하는 속도는 메모리에 접근하는 속도보다 빠르다
- 접근 속도를 줄여 프로그램의 실행 속도를 높이기 위해 메모리가 아닌 레지스터에 연산의 결괏값을 저장한다.
> 플래그 (flag)
연산에 대한 추가적인 상태 정보
- 부호, 제로, 캐리, 오버플로우, 인터럽트, 슈퍼바이저 플래그
플래그는 플래그 레지스터에 저장된다.
플래그 레지스터를 통해 연산 결과에 대한 추가적인 정보를 얻을 수 있다.
제어장치
제어 신호를 내보내고, 명령어를 해석하는 부품
(제어 신호: 부품을 관리하고 작동시키기 위한 일종의 전기 신호)
> 제어장치가 받아들이는 정보
- 클럭 신호
클럭 : 컴퓨터의 시간 단위
컴퓨터의 모든 부품이 한 클럭마다 작동 - 해석할 명령어
명령어 레지스터: 해설할 명령어가 저장되는 장치
명령어 레지스터로부터 명령어를 받아들이고 해석 -> 제어 신호 발생 - 플래그 레지스터 속 플래그의 값
- 제어 버스로 전달된 제어 신호
> 제어장치가 내보내는 정보
- CPU 외부에 전달하는 제어 신호
- 메모리에 저장하는 제어 신호
- 입출력장치(보조기억장치)에 전달하는 제어 신호
- CPU 내부에 전달하는 제어 신호
- ALU에 전달하는 제어신호 (수행할 연산 지시)
- 레지스터에 전달하는 제어신호 (레지스터 간 데이터 이동, 저장된 명령어 해석)
04-2. 레지스터
프로그램 속 명령어, 데이터는 실행 전후로 반드시 레지스터에 저장된다.
-> 레지스터디 저장된 값을 잘 관찰하면 프로그램의 실행 흐름을 파악할 수 있다.
반드시 알아야 할 레지스터
- 프로그램 카운터 (PC)
메모리에서 가져올 명령어의 주소 저장
(== 명령어 포인터) - 명령어 레지스터
메모리에서 읽어 들인 명령어를 저장하는 레지스터
제어장치는 명령어 레지스터 속 명령어를 받아들이고, 해석한 뒤 제어 신호를 내보냄 - 메모리 주소 레지스터
메모리의 주소를 저장하는 레지스터
CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 사용 - 메모리 버퍼 레지스터
메모리와 주고 받을 값(데이터, 명령어)을 저장하는 레지스터
메모리에 쓰고 싶은 값, 전달받은 값 저장
데이터 버스로 값을 주고 받을 때 사용 - 범용 레지스터
다양하고 일반적인 상황에서 자유롭게 사용하는 레지스터 - 플래스 레지스터
연산 결과, CPU 상태에 대한 부가 정보 등을 저장하는 레지스터 - 스택 포인터
스택 주소 지정 방식에 사용되는 레지스터 - 베이스 레지스터
변위 주소 지정 방식에 사용되는 레지스터
특정 레지스터를 이용한 주소 지정 방법(1): 스택 주소 지정 방식
> 스택 주소 지정 방식
스택, 스택 포인터를 이용한 주소 지정 방식
- 스택 포인터: 스택의 꼭대기를 가리키는 레지스터 (스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터)
- 스택 영역: 메모리 속 스택처럼 사용하도록 지정된 영역특정 레지스터를 이용한 주소 지정 방법(2): 변위 주소 지정 방식오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식
프로그램 카운터와 베이스 레지스터가 사용된다 - 변위 주소 지정 방식 명령어 = 연산 코드 + 레지스터 + 오퍼랜드
오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라
"상대 주소 지정 방식", "베이스 레지스터 주소 지정 방식"으로 나뉜다.
> 상대 주소 지정 방식
오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식
- 프로그램 카운터: 읽어 들일 명령어의 주소가 저장된 곳
- 예) 오퍼랜드 : +3 -> 프로그램 카운터에 저장된 주소에 + 3 번지에 가서 연산코드에 저장된 연산 수행
> 베이스 레지스터 주소 지정 방식
오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식
- 베이스 레지스터: 기준 주소
- 오퍼랜드: 기준 주소로부터 떨어진 거리
=> 베이스 레지스터 속 기준 주소로부터 얼마나 떨어진 주소에 접근할 것인지 연산하여 유효 주소를 얻어내는 방식 - 예) 베이스 레지스터 : 200, 오퍼랜드: 50 -> 200 + 50 번지에 접근하여 연산을 수행하라
04-3. 명령어 사이클과 인터럽트
- 명령어 사이클: 하나의 명령어를 처리하는 정형화된 흐름
- 인터럽트: 명령어 사이클이 끊어지는 상황
명령어 사이클
프로그램 속 명령어들이 반복되어 실행되는 일정한 주기
- 인출 사이클
메모리에 있는 명령어를 CPU로 가지고 오는 단계 - 실행 사이클
CPU로 가져온 명령어를 실행하는 단계 - 간접 사이클
명령어를 실행하기 위해 메모리에 접근하는 단계
예) 간접 주소 방식을 사용할 때 명령어를 실행하기 위해서는 메모리에 접근하여 유효 주소를 찾아야 한다. 이때 간접 사이클 단계 진입 - 인터럽트
CPU의 작업을 방해하는 신호- 동기 인터럽트
CPU에 의해 발생하는 인터럽트
예) CPU가 실행하는 프로그래밍상의 오류
예외(exception)라고 부른다. - 비동기 인터럽트
주로 입출력장치에 의해 발생하는 인터럽트
예) CPU가 요구한 작업을 마친 입출력 장치가 보내는 완료 알림
예) 입출력장치가 입력을 받으들였을 때 이를 처리하기 위한 입력 알림
하드웨어 인터럽트라고 부른다.
- 동기 인터럽트
> 하드웨어 인터럽트
알림과 같은 인터럽트
입출력 작업 중에도 CPU가 효율적인 작업을 할 수 있도록 함
(알림이 올 때 까지 입출력장치를 확인하지 않아도 된다. 인터럽트가 올 때만 확인하면 된다.)
> 하드웨어 인터럽트 처리 순서
- 입출력장치가 CPU로 인터럽트 요청 신호를 보냄
- 실행 사이클이 끝나고 명령어 인출 전 CPU는 항상 인터럽트 여부를 확인
- 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 확인
- 인터럽트를 받아 들일 수 있다면 CPU는 현재 작업 백업
- 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행
- 인터럽트 서비스 루틴이 끝나면 백업해둔 작업을 복구하여 실행 재개
- 인터럽트 요청 신호
인터럽트를 요청하는 신호
인터럽트 요청을 수용하기 위해서는 플래그 레지스터의 인터럽트 플래그가 활성화 되어 있어야 한다. - 인터럽트 플래그
하드웨어 인터럽트를 받아들일지 말지 결정하는 플래그
인터럽트 플래그가 불가능으로 설정되어 있다면 인터럽트가 와도 무시된다.
하지만 정전, 하드웨어 고장으로 인한 인터럽트 등 막을 수 없는 인터럽트는 우선순위가 높아 인터럽트 플래그에 관계 없이 인터럽트가 받아들여진다. - 인터럽트 서비스 루틴 (ISR)
인터럽트를 처리하기 위한 프로그램
인터럽트 핸들러라고도 부른다.
해당 인터럽트를 어떻게 처리해야 할지에 대한 정보가 담긴 프로그램 - CPU가 인터럽트를 처리한다 == 인터럽트 서비스 루틴을 실행하고 이전 작업으로 다시 돌아온다
- 인터럽트 벡터
인터럽트 서비스 루틴을 식별하기 위한 정보
인터럽트 벡터로 인터럽트 서비스 루틴의 시작 주소를 알 수 있다.
=> 인터럽트 신호 발생 -> 인터럽트 플래그가 활성화 되어 있다면 -> 작업을 백업(스택 영역에)하고, 인터럽트 벡터 참조하여 인터럽트 서비스 루틴 실행 -> 백업 해둔 작업 복구 -> 이전 작업 재개
반응형
'cs > [OS] 혼자 공부하는 컴퓨터 구조 + 운영체제' 카테고리의 다른 글
[혼공학습단 11기] 혼공컴운 2주차 미션 (0) | 2024.01.12 |
---|---|
[혼공 컴운] chapter 05. CPU 성능 향상 기법 (0) | 2024.01.12 |
[혼공학습단 11기] 혼공컴운 1주차 미션 (2) | 2024.01.05 |
[혼공컴운] chapter 03. 명령어 (0) | 2024.01.05 |
[혼공컴운] chapter 02. 데이터 (0) | 2024.01.05 |