4. CPU 의 작동원리
1. ALU 와 제어장치
ALU
ALU 는 레지스터를 통해서 피연산자를 받아들이고, 제어장치로부터 제어신호를 받아들인다. 이를 기반으로 다양한 연산을 수행한다.
그리고 연산의 결과값을 직접 메모리에 저장하는 것이 아닌, 일시적으로 레지스터에 저장한다.
ALU 가 연산할 때마다 결과를 메모리의 저장한다면, CPU 는 메모리에 자주 접근하게 되고, 이는 CPU 가 프로그램 실행 속도를 늦출 수 있다. 그래서 ALU 연산 결과를 메모리에 저장하는 것이 아닌, 레지스터에 저장하는 것이다.
또한, ALU 는연산에 대한 추가적인 정보를 내보내야 할 때 플래그를 내보낸다.
플래그 레지스터라는 곳에 저장하는데, 이곳에 연산 결과에 대한 추가적인 결과를 저장한다.
제어장치
제어장치는 제어 신호를 내보내고, 명령어를 해석하는 부품이다.
그리고 제어 신호는 컴퓨터 부품을 관리하고 작동시키는 일종의 전기 신호이다.
제어장치가 받아들이는 정보를 알아보자
첫째, 제어장치는 클럭 신호를 받아들인다.
클럭 : 컴퓨터의 모든 부품을 일사불란하게 움직이게 하는 시간 단위이다.
클럭 주기에 맞추어서 데이터가 이동되거나, ALU 에서 연산이 수행되거나, CPU 가 메모리에 저장된 명령어를 읽는다.
둘째, 제어장치는 해석해야 할 명령어(명령어 레지스터)를 받아들인다.
CPU 가 해석해야 할 명령어는 명령어 레지스터에 저장된다.
제어장치는 명령어 레지스터로부터 해석할 명령어를 받아들이고, 제어 신호를 발생시켜 컴퓨터 부품들이 수행해야 할 내용들을 알려준다.
셋째, 제어장치는 플래그 레지스터 속 플래그 값을 받아들인다.
제어장치는 플래그 값을 받아들이고 참고하여 제어 신호를 발생 시킨다.
넷째, 제어장치는 시스템 버스, 그중에서 제어 버스로 전달된 제어 신호를 받아들인다.
CPU 외부에 전달 하는 제어 신호는 곧, 제어 버스로 신호를 내보낸다는 말과 같다.
CPU 외부(메모리) 에서 전달하는 제어 신호
CPU 외부(입출력장치) 에서 전달하는 제어 신호
CPU 내부에 전달 하는 제어 신호
ALU 에 전달하는 제어신호
레지스터에 전달하는 제어신호
2. 레지스터
프로그램 속 명령어와 데이터는 실행 전후로 반드시 레지스터에 저장된다.
반드시 알아야 할 레지스터
프로그램 카운터(명령어 포인터) : 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장
메모리 주소 레지스터 : 메모리의 주소를 저장하는 레지스터, CPU 가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거치게 된다.
메모리 버퍼 레지스터 : 메모리와 주고 받을 값을 저장하는 레지스터 -> 데이터와 명령어 모두 저장 가능
명령어 레지스터 : 메모리에서 읽어 들인 명령어를 저장하는 레지스터
메모리에 저장된 프로그램을 실행하는 과정
프로그램 실행을 위해 프로그램 카운터에 임의의 메모리 주소를 저장
프로그램 카운터의 값을 메모리 주소 레지스터에 저장
제어 신호와 메모리 주소 레지스터 값이 버스를 통해 메모리로 보내진다.
해당 제어의 결과가 메모리 버퍼 레지스터에 저장되고, 프로그램 카운터가 증가되어 다음 명령어를 받을 준비를 한다.
메모리 버퍼 레지스터의 저장된 값은 명령어 레지스터로 이동한다.
제어장치는 명령어 레지스터의 명령어를 해석하고 제어 신호를 발생시킨다.
범용 레지스터 : 다양하고, 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터 -> 데이터와 주소 모두 저장 가능
플래그 레지스터 : ALU 의 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장한다.
3. 명령어 사이클과 인터럽트
인터럽트 : CPU 는 정해진 흐름에 따라 명령어를 처리해 나가지만, 간혹 이 흐름이 끊어지는 상황이 발생하는데, 이를 인터럽트라 부른다.
명령어 사이클
프로그램 속 명령어들은 일정한 주기를 반복하며 실행되는데, 이 주기를 명령어 사이클이라고 한다.
명령어 사이클을 세분화 해보자
인출 사이클 : 메모리에 있는 명령어를 CPU 로 가지고 오는 사이클
실행 사이클 : CPU 로 가져온 명령어를 실행하는 사이클 -> 제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생시키는 단계
간접 사이클 : 메모리에서CPU 로 가져온 명령어를 실행 사이클로 돌입할 수 없을 때, 메모리에 한번 더 접근하게 되는데, 이를 간접사이클이라고 부른다.
인터럽트 : CPU 작업을 방해하는 신호
인터럽트
동기 인터럽트(예외) : CPU 에 의해 발생하는 인터럽트
CPU 가 실행하는 프로그래밍 상의 오류와 같은 예외적인 상황에 마주쳤을 때 발생하는 인터럽트
비동기 인터럽트(하드웨어 인터럽트) : 입출력장치에 의해 발생하는 인터럽트
입출력장치에 입력을 받아들일 때 이를 처리하기 위한 인터럽트
프린트 작업을 끝냈을 때 완료 인터럽트 등등 ..
CPU 보다 입출력장치의 속도가 현저히 느리기 때문에, CPU 는 동기적으로 동작하는 것이 아닌, 비동기적으로 작동한다.
CPU 가 인터럽트를 처리한다는 말은 '인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다' 라는 말과 동일하다
하드웨어 인터럽트 작동 순서
입출력장치는 CPU 에 인터럽트 요청 신호를 보낸다.
CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
CPU 는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 판단한다. -> 인터럽트 플래그 : 레지스터의 종류로, 인터럽트를 실행할 수 있는지 여부를 저장한다.
인터럽트를 받아들일 수 있다면 CPU 는 지금까지의 작업을 백업한다.
CPU 는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다. -> 인터럽트 백터 : CPU 가 수많은 인터럽트 서비스 루틴을 구분하는 방식 -> 인터럽트 서비스 루틴 : 인터럽트를 처리하기 위한 프로그램
인터럽트 서비스 루틴 실행이 끝나면, 백업해둔 작업을 복구해 실행을 재개한다.
Last updated