coding base/컴퓨터구조
CPU 작동 원리
ddo04
2024. 7. 31. 01:35
ALU
- 계산하는 장치
- 레지스터로부터 피연산자를 받아들임
- 제어장치로부터 제어신호를 받아들임
- 계산을 하기 위해서 피연산자와 수행할 연산이 필요
- 결과값을 레지스터에 저장 -> CPU가 레지스터에 접근하는 속도가 CPU가 메모리에 접근하는 속도보다 빠름
- 플래그 => 연산 결과에 대한 부과 정보, 결과값이 양수인지 음수인지를 결과값과 더불어 내보내짐 => 플래그 레지스터라고 하는 특수한 레지스터에 저장
- CPU마다 다르지만 공통적으로 포함하고 있는 플래그의 종류
플래그 종류 | 의미 | |
부호 플래그 | 연산한 결과의 부호를 나타냄 | 부호 플래그가 1일 경우 계산 결과는 음수, 0일 경우 계산 결과는 양수를 의미 |
제로 플래그 | 연산 결과가 0인지 여부를 나타냄 | 제로 플래그가 1일 경우 연산 결과는 0, 0일 경우 연산 결과는 0이 아님을 의미 |
캐리 플래그 | 연산 결과 올림수나 빌림수가 발생핬는 지를 나타냄 | 캐리 플래그가 1일 경우 올릶수나 빌림수가 발생했음을 의미. 0일 경우 발생하지 않았음을 의미 |
오버플로우 플래그 | 오버플로우가 발생했는지 나타냄 | 오버플로우 플래그가 1일 경우 오버플로우가 발생했음을 의미, 0일 경우 발생하지 않았음을 의미 |
인터랩트 플래그 | 인터랩트가 가능한지를 나타냄 | 인터랩트 플래그가 1일 경우 인터랩트가 가능함을 의미, 0일 경우 인터랩트가 불가능함을 의미 |
슈퍼바이저 플래그터 | 커널 모드로 실행 중인지, 사용자 모드로 실행 중인지 나타냄 | 슈퍼바이저 플래그가 1일 경우 커널 모드 실행 중임을 의미하고, 0일 경우 사용자 모드로 실행 중임을 의미 |
제어장치
- 제어 신호흘 발생시키고 병령어를 해석하는 장치
- 클럭 => 컴퓨터의 모든 부품을 일사분란하게 움직일 수 있게 하는 시간 단위
- 제어 장치가 해석할 명령어는 명령어 레지스터라고 하는 특수한 레지스터에 저장
- 제어장치는 해석할 명령어를 받아들이고 명령어를 해석하여 제어신호를 내보냄
- 플래그 레지스터 안에 있는 플래그 값도 받아들임
- 풀래그 레지스터 => CPU가 연상 결과로서 받아들이는 부가적인 정보
- 연상 결과가 0인지 아닌지 음수인지 아닌지 이런 부가적인 정보들도 명령어를 해석하는 과정에서 반드시 필요하기에 플래그 값을 받아들임
- 외부로부터 제어신호가 발생이 됐다면 CPU로 전달이 됐다면 어떤 신호인지를 제어장치가 받아들이게 됨
- 제어신호는 CPU 내부에 전달하는 제어신호가 있고 CPU 외부에 전달하는 제어신호가 있음
- CPU 내부에 전달하는 제어신호는 레지스터와 ALU에 내보내는 제어신호가 있음
- CPU 외부에 전달하는 제어신호는 메모리와 입출력장치에 내보내는 제어신호가 있음
- 레지스터에 내보내는 제어신호는 레지스터를 움직이게 하는 제어신호
- ALU에 내보내는 제어신호는 수행할 연산을 지시하는 제어신호
- 메모리에 전달하는 제어신호는 메모리를 지시하기 위한 제어신호
- 입출력장치에 내보내는 제어신호는 입출력장치의 동작을 지시하는 제어신호
레지스터
- CPU 내부의 작은 임시저장장치
- 프로그램 속 명령어 & 데이터는 실행 전후롤 레지스터 저장
- CPU 내부에는 다양한 레지스터들이 있고, 각기 다른 역할을 가짐
- 프로그램 카운터 : 메모리에서 가져올 명령어의 주소 (메모리에서 읽어 들일 명령어의 주소)
- 명령어 레지스터 : 해석할 명령어 (방금 메모리에서 읽어 들인 명령어)
- 메모리 주소 레지스터 : 메모리의 주소
- 메모리 버퍼 레지스터 : 메모리와 주고 받을 값(데이터와 명령어)
- 플래그 레지스터 : 연산 결과 또는 CPU 상태에 대한 부가적인 정보
- 범용 레지스터 : 다양하고 일반적인 상황에서 자유롭게 사용
- 스택 포인터 : 스택의 꼭대기 가리킴 (주소 지정에 사용)
- 베이스 레지스터 : 기준 주소 지정 (주소 지정에 사용)
- 프로그램의 순차적인 실행 흐름이 끊기는 경우
- 특정 메모리 주소로 실행 흐름을 이동하는 명령어 실행 시 (JUMP. CONDITIONAL JUMP, CALL, RET)
- 인터럽트 발생 시
- 특정 레지스터를 이용한 주소 지정 방식
- 스택 주소 지정 방식 => 스택과 스택 포인트를 이용한 주소 지정 방식
- 스택 포인트 : 스택의 꼭대기를 가리키는 레지스터 (스택이 어디까지 차 있는지에 대한 표시)
- 변위 주소 지정 방식 => 오퍼랜드 필드의 값과 특정 레지스터 (프로그램 카운터, 베이스 레지스터) 의 갑을 더하여 유효 주소 얻기
- 상대 주소 지정 방식 => 오퍼랜드 필드의 값(변위)과 프로그램 카운트의 값을 더하여 유효 주소 얻기
- 베이스 레지스터 주소 지정 방식 => 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더하여 유효 주소 얻기
명령어 사이클과 인터럽스
- CPU는 메모리 안에 있는 프로그램을 어떤 정해진 흐름대로 처리
- CPU가 메모리에 저장되어 있는 프로그램을 실행하는데 실행되는 과정이 일정한 패턴이 있음
- CPU는 메모리 안에 있는 프로그램을 어떤 정해진 흐름대로 처리하여 정해진 흐름 => 명령어 사이클
- CPU의 정해진 흐름을 끊는 신호를 인터럽트
명령어 사이클
- 프로그램 속 명령어들은 일정한 주기가 반복되며 실행
- CPU가 메모리 안에 있는 어떤 프로그램을 실행하기 위해서 메모리에 저장된 값을 CPU 내부로 갖고 오는 작업 => 인출
- 인출하는 주기 => 인출 사이클
- 실행 사이클은 갖고 왔다면 실행해야 함
- 일반적으로 CPU는 인출 사이클과 실행 사이클이 반복되면서 실행
- CPU로 명령어를 가지고 와도 바로 실행이 불가능한 경우도 있음
인터랩트
- 방해하다, 중단시키다
- 'CPU가 꼭 주목해야 할 때','CPU가 얼른 처리해야 할 다른 작업이 생겼을 때' 발생
- 인터럽트 종류
동기 인터럽트 (예외) |
비동기 인터랩트 (하드웨어 인터랩트) |
- 동기 인터럽트는 CPU가 예기치 못한 상황을 접했을 때 발생
- 인터럽트마다 고유한 인터럽트 서비스 루틴의 시작 주소를 가지고 있음
비동기 인터랩트 (하드웨어 인터럽트)
- 주로 입출력장치에 의해 발생
- 알림과 같은 역할
- 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트 사용
- 입출력장치는 CPU에 비해 느림
- 인터럽트가 없다면 CPU는 프린트 완료 여부를 확인하기 위해 주기적으로 확인해야 함
- 인터럽트가 있다면 입출력 작업 동안 CPU는 다른 일을 할 수 있음
- 인터럽트 처리 순서는 대동소이하다
- 입출력장치는 CPU에 인터럽트 요청 신호를 보냄
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부 확인
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업
- CPU는 인터럽트 백터를 참조하여 인터럽트 서비스 루틴을 실행
- 인터럽트 서비스 루틴 실행이 끝나면 백업해 둔 작업을 복구하여 실행을 재개
- 인터럽트 요청 신호 : CPU의 작업을 방해하는 인터럽트에 대한 요청
- 인터럽트 플래그 : 인터러트 요청 신호를 받아들일지 무시할지를 결정하는 비트
- 인터럽트 백터 : 인터럽트 서비스 루틴의 시작 주소를 포함하는 인터럽트 서비스 루틴의 식별 정보
- 인터럽트 서비스 루틴 : 인터럽트를 처리하는 프로그램