CS/컴퓨터구조
CPU의 작동 원리
u0hun
2022. 9. 20. 02:13
1. ALU와 제어장치
1-1. ALU
- CPU 내부에서 계산을 담당하는 장치
- 계산을 하기 위해서는 피연산자와 수행할 연산(제어 신호)이 필요
- 결과를 레지스터에 저장하는 이유? -> CPU가 메모리보다 레지스터에 접근하는 속도가 더 빠르기 때문.
- 플래그 : 연산 결과에 대한 부가 정보. 플래그 값들을 저장하는 플래그 레지스터에 저장된다.
- 부호 플래그 : 1일 경우 음수, 0일 경우 양수
- 제로 플래그 : 1일 경우 연산 결과는 0, 0일 경우 0이 아님
- 캐리 플래그 : 1일 경우 올림수나 빌림수가 발생, 0일 경우 발생하지 않음
- 오버플로우 플래그 : 1일 경우 오버플로우 발생, 0일 경우 발생하지 않음
- 인터럽트 플래그 : 1일 경우 인터럽트 가능, 0일 경우 불가능
- 슈퍼바이저 플래그 : 1일 경우 커널 모드로 실행 중, 0일 경우 사용자 모드로 실행 중
1-2. 제어 장치
- 제어 신호를 내보내고, 명령어를 해석하는 부품
- 제어 신호 : 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호
- 제어 장치가 받아들이는 정보
- 클럭 신호
- 클럭 : 컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위
- 주기에 맞춰 한 레지스터에서 다른 레지스터로 이동
- ALU에서 연산이 수행되거나, CPU가 메모리에 저장된 명령어를 읽어들임
- 해석해야 할 명령어
- CPU가 해석해야 할 명령어는 명령어 레지스터에 저장된다.
- 제어 장치는 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려준다.
- 플래그 레지스터 속 플래그 값
- 플래그 값을 받아들이고 이를 참고하여 제어 신호를 발생시킨다.
- 시스템 버스, 그 중 제어 버스로 전달된 제어 신호
- 제어 신호는 CPU뿐만 아니라 입출력장치를 비롯한 CPU 외부 장치도 발생시킬 수 있다.
- 제어 버스를 통해 외부로부터 전달된 제어 신호를 받아들이기도 한다.
- 클럭 신호
- 제어 장치가 내보내는 정보
- CPU 외부에 전달하는 제어 신호
- 제어 장치가 CPU 외부에 제어 신호를 전달한다는 말은 곧, 제어 버스로 제어 신호를 내보낸다는 말과 같다.
- 메모리에 전달하는 제어 신호
- 제어 장치가 메모리에 저장된 값을 읽거나 메모리에 새로운 값을 쓰고 싶을때 제어 신호를 내보낸다.
- 입출력장치에 전달하는 제어 신호
- 제어 장치가 입출력장치의 값을 읽거나 입출력장치에 새로운 값을 쓰고 싶을 때 입출력장치로 제어 신호를 내보낸다.
- CPU 내부에 전달하는 제어 신호
- ALU에 전달하는 제어 신호
- 수행할 연산을 지시하기 위해 ALU로 제어 신호를 내보낸다.
- 레지스터에 전달하는 제어 신호
- 레지스터 간에 데이터를 이동시키거나 레지스터에 저장된 명령어를 해석하기 위해 제어 신호를 내보낸다.
- ALU에 전달하는 제어 신호
- CPU 외부에 전달하는 제어 신호
2. 레지스터
1-1. 범용적인 레지스터 (서적에서 중요하게 다루는 레지스터 8개)
- 레지스터
- CPU 내부의 작은 임시 저장 장치
- 프로그램 속 명령어 & 데이터는 실행 전후로 레지스터에 저장
- CPU 종류마다 레지스터 종류는 다르다!
- 프로그램 카운터
- 메모리에서 가져올 명령어의 주소를 저장(메모리에서 읽어 들일 명령어의 주소를 저장)
- Instruction Pointer(명령어 포인터)라고 부르는 CPU도 있다.
- 가져오고자 하는 주소를 CPU로 가져오면 카운트 1 증가. (메모리 버퍼 레지스트리가 값을 가져오면 증가)
- 메모리 주소 레지스터
- 메모리의 주소를 저장한다.
- CPU가 읽어 들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터
- 프로그램 카운터가 저장한 주소를 가져온다.
- 메모리 버퍼 레지스터
- 메모리와 주고받을 값을 저장(데이터와 명령어)
- CPU가 정보를 데이터 버스로 주고받을 때 거치는 레지스터
- 메모리 주소 레지스터가 가져온 주소의 값을 저장한다.
- 명령어 레지스터
- 해석할 명령어를 저장(방금 메모리에서 읽어 들인 명령어)
- 명령어 레지스터를 제어 장치가 받아들여서 해석하고 제어 신호를 내보낸다.
- 메모리 버퍼 레지스터가 가져온 값을 저장한다.
- 플래그 레지스터
- 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장
- 범용 레지스터
- 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
- 스택 포인터
- 특정 주소 지정에 사용
- 스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식
- 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터
- 베이스 레지스터
- 특정 주소 지정에 사용
- 변위 주소 지정 방식 : 오퍼랜드 필드의 값과 특정 레지스터(프로그램 카운터, 베이스 레지스터)의 값을 더하여 유효 주소를 얻는 방식 (더하는 값에 따라 방식이 두 가지로 나뉜다.)
- 상대 주소 지정 방식 : 오퍼랜드 필드의 값과 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식
- 프로그램 카운터에는 읽어 들일 명령어의 주소가 저장되어 있다.
- 오퍼랜드가 -3일 경우 {명령어의 주소 - 3} 번지로 접근한다.
- 베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드의 값과 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식
- 베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산.
- 기준 주소가 200이고 오퍼랜드가 40일 경우 {200 + 40} 번지로 접근한다.
- 상대 주소 지정 방식 : 오퍼랜드 필드의 값과 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식
3. 명령어 사이클과 인터럽트
3-1. 명령어 사이클
- CPU는 프로그램 속 명령어들을 일정한 주기가 반복하면서 실행한다.
- 이 주기를 명령어 사이클이라고 한다.
- 인출 사이클
- 메모리에 저장된 명령어를 실행시킬 때 가장 먼저 해야할 일은?
- 명령어를 메모리에서 CPU로 가져온다!
- 메모리에 있는 명령어를 CPU로 가져 오는 단계가 인출 사이클이다.
- 실행 사이클
- CPU로 명령어를 인출했다면 명령어를 실행한다. (사이클의 두 번째 과정)
- CPU로 가져온 명령어를 실행하는 단계가 실행 사이클이다.
- 프로그램을 이루는 명령어들은 일반적으로 인출 사이클과 실행 사이클을 반복한다.
- 간접 사이클
- 명령어를 인출하여 CPU로 가져와도 바로 실행하지 못하는 경우가 있다.
- 명령어를 실행하기 위해 메모리 접근을 더 해야하는 경우가 이에 해당
- 이러한 단계를 간접 사이클이라고 한다.
3-2 인터럽트
- 정의 : CPU가 수행 중인 작업을 방해하는 신호
- 크게 동기 인터럽트, 비동기 인터럽트로 나뉜다.
- 동기 인터럽트 (예외)
- CPU가 예기치 못한 상황을 접했을 때 발생
- CPU가 접근하고자 하는 데이터가 없다던지, 0으로 나누는 등의 상황
- 비동기 인터럽트 (하드웨어 인터럽트)
- 주로 입출력장치에 의해 발생
- 알림(세탁기 완료 안림, 전자레인지 조리 알림)과 같은 역할
- 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용
- 입출력 장치는 CPU에 비해 느리기 때문에 CPU가 입출력 완료 여부를 일일히 확인해야 한다.
- 이와 같은 문제를 인터럽트를 사용함으로써 해결 가능하다.
※ 인터럽트의 종류를 막론하고 인터럽트 처리 순서는 대동소이하다.
- 인터럽트 요청 신호 : CPU의 작업을 방해하는 인터럽트에 대한 요청
- 인터럽트 플래그 : 인터럽트 요청 신호를 받아들일지 무시할지를 결정하는 비트
- 인터럽트 벡터 : 인터럽트 서비스 루틴의 시작 주소를 포함하는 인터럽트 서비스 루틴의 식별 정보
- 인터럽트 서비스 루틴 : 인터럽트를 처리하는 프로그램
* 출처 : 혼자공부하는컴퓨터구조+운영체제