목차
CPU
- CPU 구성
- 계산을 담당하는 ALU
- 명령어를 읽어들이고 해석하는 제어장치
- 작은 임시 저장장치 레지스터 (레지스터는 여러개 존재)
- CPU가 명령어를 실행하는 과정
- 제어장치가 메모리에 저장된 명령어를 읽어 들이기 위해 메모리에 "메모리 읽기" 제어 신호를 보냄
- 메모리가 저장된 명령어를 CPU에 건네주면, CPU는 이 명령어를 레지스터에 저장
- CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느림. 따라서 우선적으로 ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장함.
- 제어장치는 읽어 들인 명령어를 해석한뒤, 명령에 필요한 데이터를 가져오기 위해 메모리에 "메모리 읽기" 제어 신호를 보냄
- 다시 메모리는 저장된 데이터를 CPU에 건네주고, CPU는 이 데이터를 서로 다른 레지스터에 저장
- ALU는 레지스터를 통해 읽어 들인 데이터를 받아오고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들인 뒤 연산 수행. 계산된 결괏값은 레지스터에 저장 (연산 결과에 대한 추가적인 상태 정보 플래그(flag)는 플레그 레지스터에 저장)
- 첫 번째 명령어가 끝나면, 다음 명령어에 대해서 (1~5) 반복 수행
- 모든 명령이 끝나고 계산 결과를 저장하기 위해 제어장치는 계산 결과와 메모리에 "메모리 쓰기" 제어 신호를 함께 보냄.
ALU
- ALU는 레지스터를 통해 읽어 들인 데이터를 받아오고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들인 뒤 연산 수행. 계산된 결괏값은 레지스터에 저장
- ALU가 받아들이는 정보
- 레지스터 -> 피연산자
- 제어창치 -> 수행할 연산을 알려주는 제어신호
- ALU가 내보내는 정보
- 연산을 수행한 결과 -> 레지스터에 저장
- CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느림. 따라서 우선적으로 ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장함.
- 연산 결과에 대한 추가적인 상태 정보 플래그(flag) -> 플레그 레지스터에 저장
- 부호 플래그, 제로 플래그,캐리 플래그, 오버플로우 플래그, 인터럽트 플래그, 슈퍼바이저 플래그 등
- 연산을 수행한 결과 -> 레지스터에 저장
- ALU가 받아들이는 정보
제어장치
- 제어장치는 제어 신호를 내보내고, 명령어를 해석하는 부품
- 제어장치는 CPU 제조사마다 제어장치의 구현 방식이나 명령어를 해석하는 방식, 받아들이고 내보내는 정보에는 조금씩 차이 존재 (대표적인 예시만 살펴볼 것)
- 제어장치가 받아들이는 정보
- 제어장치는 클럭 신호를 받아들임
- 클럭(Clock)
- 클럭이란 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위
- 클럭의 "똑-딱-똑-딱" 주기에 맞춰 한 레지스터에서 다른 레지스터로 데이터가 이동되거나, ALU에서 연산이 수행되거나, CPU가 메모리에 저장된 명령어를 읽어들이는 것
- 그렇다고 컴퓨터의 모든 부품이 한 클럭마다 작동한다라고 이해하면 안됨. 컴퓨터의 부품들은 클럭이라는 박자에 맞춰 작동할 뿐 한 박자마다 작동하는 것이 아님.
- 하나의 명령어가 여러 클럭에 걸쳐 실행될 수 있음.
- 클럭은 단어만 보면 시계처럼 클럭 속도가 매번 읽정하게 유지된다고 생각할 수 있지만, 실제로는 그렇지 않음. 기본 클럭 속도(Base)와 최대 클럭 속도(Max)로 나뉘어져 있음. (고성능을 요하는 순간에는 순간적으로 클럭 속도를 높이고, 그렇지 않을 때는 유연하게 클럭속도를 낮추기도 함.)
- 최대 클럭 속도를 갖에로 더 끌어올릴 수도 있는데, 이런 기법을 오버클럭킹(overclocking)이라고 함
- 클럭(Clock)
- 제어장치는 해석해야 할 명령어를 받아들임
- CPU가 해석해야 할 명령어는 명령어 레지스터라는 특별한 레지스터에 저장됨.
- 제어장치는 이 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려줌.
- 제어장치는 플래그 레지스터 속 플래그 값을 받아들임
- 제어장치가 제어 신호를 컴퓨터 부품들을 제어할 때, ALU 연산에 대한 추가적인 상태 정보를 무시하면 안되기 때문에 제어장치는 플래그 값을 받아들이고 이를 참고하여 제어 신호를 발생시킴.
- 제어장치는 시스템 버스, 그중에서 제어 버스로 전달된 제어 신호를 받아들임.
- 제어 신호는 CPU뿐만 아니라 입출력장치를 비롯한 CPU 외부 장치도 발생시킬 수 있음.
- 제어장치는 제어 버스를 통해 외부로부터 절달된 제어 신호를 받아들이기도 함.
- 제어장치는 클럭 신호를 받아들임
- 제어장치가 내보내는 정보
- CPU 외부에 전달하는 제어 신호
- 제어장치가 CPU 외부에 제어 신호를 전달한다는 말은 곧, 제어 버스로 제어 신호를 내보낸다는 말과 같음
- 이러한 제어 신호에는 크게 메모리에 전달하는 제어 신호와 입출력장치에 전달하는 제어 신호가 있음.
- 메모리에 저장된 값을 읽거나 메모리에 새로운 값을 쓰고 싶을 경우 메모리에 제어 신호 내보냄
- 제어장치가 입출력장치의 값을 읽거나 입출력장치에 새로운 값을 쓰고 싶을때는 입출력장치로 제어 신호를 내보냄.
- CPU 내부에 전달하는 제어 신호
- 제어장치가 CPU 내부에 전달하는 제어 신호에는 크게 ALU에 전달하는 제어 신호와 레지스터에 전달하는 제어 신호가 있음.
- ALU에는 수행할 연산을 지시하기 위해 제어 신호 전달
- 레지스터에는 레지스터 간에 데이터를 이동시키거나 레지스터에 저장된 명령어를 해석하기 위해 제어 신호를 내보냄.
- 제어장치가 CPU 내부에 전달하는 제어 신호에는 크게 ALU에 전달하는 제어 신호와 레지스터에 전달하는 제어 신호가 있음.
- CPU 외부에 전달하는 제어 신호
레지스터
- 레지스터의 대표적인 8가지
- 프로그램 카운터(PC : Program Counter)
- 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장
- 프로그램 카운터를 명령어 포인터(IP: Instruction Pointer)라고 부르는 CPU도 존재
- 명령어 레지스터(IR, Instruction Register)
- 해석할 명령어, 즉 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터.
- 제어장치는 명령어 레지스터 속 명령어를 받아들이고 이를 해석한 뒤 제어신호를 내보냄
- 메모리 주소 레지스터(MAR, Memory Address Register)
- 메모리의 주소를 저장하는 레지스터
- CPU가 읽어들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거치게 됨.
- 메모리 버퍼 레지스터(MBR, Memory Buffer Register)
- 메모리와 주고받을 값(데이터와 명령어)를 저장하는 레지스터
- 즉, 메모리에 쓰고 싶은 값이나 메모리로부터 전달 받은 값은 메모리 버퍼 레지스터를 거침.
- CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고받을 값은 메모리 버퍼 레지스터를 거치게 됨.
- 메모리 데이터 레지스터(MDR, Memory Data Register)라고도 부름
- 플래그 레지스터
- ALU 연산 결과에 따른 플래그를 플래그 레지스터에 저장
- 플래그 레지스터는 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장
- 범용 레지스터
- 이름 그대로 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
- 메모리 버퍼 레지스터는 데이터 버스로 주고 받을 값만 저장하고, 메모리 주소 레지스터는 주소 버스로 내보낼 주소값만 저장하지만, 범용 레지스터는 데이터와 주소를 모두 저장할 수 있음.
- 일반적으로 CPU 안에는 여러개의 범용 레지스터들이 있고, 현대 대다수 CPU는 모두 범용 레지스터를 가지고 있음.
- 스택 포인터
- 스택 포인터는 스택 주소 지정 방식이라는 주소 지정 방식에 사용
- 스택 주소 지정 방식은 스택과 스택 포인터를 이용한 주소 지정 방식.
- 스택 포인터란 스택의 꼭대기를 가리키는 레지스터
- 스택은 메모리 안에 존재.
- (정확히는 메모리 안에 스택처럼 사용할 영역이 정해져 있음 = 스택 영역(이 영역은 다른 주소 공간과는 다르게 스택처럼 사용하기로 암묵적으로 약속된 영역)
- 스택 포인터란 스택의 꼭대기를 가리키는 레지스터
- 베이스 레지스터
- 프로그램 카운터와 베이스 레지스터는 변위 주소 지정 방식에 사용됨.
- 프로그램 카운터(PC : Program Counter)
- 레지스터 예시
- CPU로 실행할 프로그램이 1000번지부터 1500번지까지 저장되어 있다고 가정
- 1000번지에는 1101(2)이 저장되어 있음.
- 프로그램을 처음부터 실행하기 위해 프로그램 카운터에는 1000이 저장됨. 이는 메모리에서 가져올 명령어가 1000번지에 있다는 걸 의미
- 1000번지를 읽어들이기 위해서는 주소 버스로 1000번지를 내보내야 함. 이를 위해 메모리 주소 레지스터에는 1000이 저장됨.
- 메모리 읽기 제어 신호와 메모리 주소 레지스터 값이 각각 제어 버스와 주소 버스를 통해 메모리로 보내짐.
- 메모리 1000번지에 저장된 값은 데이터 버스를 통해 메모리 버퍼 레지스터로 전달되고, 프로그램 카운터는 증가되어 다음 명령어를 읽어들일 준비를 함
- 메모리 버퍼레지스터에 저장된 값은 명령어 레지스터로 이동함.
- 제어장치는 명령어 레지스터의 명령어를 해석하고 제어 신호를 발생시킴.
- 프로그램 카운터 값이 증가했으니 1000번지 명령어 처리가 끝나면 CPU는 다음 명령어(1001번지)를 읽어 들임
- (참고: 인터럽트가 발생할 경우 프로그램의 순차적인 실행 흐름이 끊어집니다. )
- CPU로 실행할 프로그램이 1000번지부터 1500번지까지 저장되어 있다고 가정
출처
'Computer Science > 컴퓨터구조(Computer Architecture)' 카테고리의 다른 글
명령어 사이클과 인터럽트 (1) | 2024.03.28 |
---|---|
컴퓨터 정보 표현(명령어) (0) | 2024.03.27 |
컴퓨터 정보 표현(데이터) (0) | 2024.03.27 |
컴퓨터 4가지 핵심 부품과 메인보드(시스템 버스) (0) | 2024.03.27 |