01. 프로그램의 실행 (Program Execution)
CPU의 전체적인 실행과정을 살펴보기 위해서는 레지스터 중 특별한 용도가 지정되어 있는 명령 레지스터(Instruction Register)와 프로그램 카운터(Program Counter)를 살펴봐야 한다. 명령 레지스터는 실행할 명령을 차례대로 저장하는 레지스터이며, 프로그램 카운터는 다음에 실행할 명령의 주소를 가지고 있으며 현재 프로그램이 어디까지 실행됐는지 추적하는 수단으로 사용된다.
01. 프로그램의 실행 (Program Execution)
프로그램의 실행, 즉 CPU의 작업은 기계 주기(machine cycle)이라는 3단계 과정을 반복함으로써 알고리즘을 실행시키는 것이다.
기계 주기는 인출(fetch), 해석(decode), 실행(execute)으로 구성되어 있다. 이 사이클을 반복해 명령어를 하나씩 불러와서 해석하고 실행하는 것이 CPU가 프로그램을 실행시키는 일이다. 이제 한 단계씩 차례차례 알아보자.
1. 프로그램 로드
먼저 보조기억장치에 저장되어 있던 컴파일된(이진화된) 프로그램을 주기억장치에 LOAD한다. 여담으로 고수준 언어의 경우에는 각각 다르겠지만 파이썬의 경우 우리가 작성한 파이썬 코드가 파이썬 인터프리터에 의해 저수준 표현인 바이트 코드로 컴파일되고, 이 바이트 코드가 메모리에 LOAD된다. 그리고나서 PVM(Python Virtual Machine)에서 각 바이트 코드를 순차적으로 해석하고 실행하게 된다.
다시 본론으로 돌아가서 컴파일된 프로그램이 주기억장치에 LOAD될 때 CPU의 프로그램 카운터는 프로그램을 실행하기 위해 프로그램의 가장 첫번째 주소로 초기화된다.
2. 인출(Fetch)
이제 CPU가 처음으로 인출(Fetch)을 수행한다. CPU의 제어장치(Control Unit)가 프로그램 카운터로부터 인출해야 할 명령어의 주소를 추적한다. 위의 경우 메모리의 B0이라는 주소를 추적해 B0, B1 주소의 12DA라는 값을 인출해 명령 레지스터에 등록한다. 한번에 몇 개의 셀을 읽을 것인지는 CPU마다 다르다. 위 CPU의 경우 한번에 2개의 셀, 즉 16bit를 읽어올 수 있다. 이를 CPU의 word length라 한다.
3. 해석(Decode)
다음으로 제어장치가 해석(Decode)를 실행한다. 해석은 명령 레지스터에 들어 있는 명령이 무슨 의미인지 해석한다는 의미다. 위 12DA명령은 DA 주소에 있는 셀의 내용을 2번 레지스터에 LOAD하라는 의미다. 1번이 왜 굳이 LOAD인지는 그냥 이 CPU의 ISA가 그렇게 설계되어 있기 때문이다.
그리고 또 한 가지 주목해야 할 것은 프로그램 카운터다. 인출 단계가 끝났을 때, 프로그램 카운터는 다음 추적해야 할 명령어의 주소를 가리키도록 2가 더해진다. 이로서 다음 주기가 시작되고 다시 인출 단계가 시작될 때 다음 명령어를 인출할 수 있다. 굳이 2가 더해지는 이유는 이 CPU의 word length가 16bit이기 때문이다.
4. 실행(Execute)
다음으로 제어장치는 명령에 따라 필요한 하드웨어와 상호작용해 명령을 수행한다. 위의 경우 '메모리의 DA 번지에 있는 셀 정보를 2번 레지스터에 LOAD해라' 라는 명령을 받았기 때문에 제어장치가 수행한 모습이다. 만약 '2, 3번 레지스터에 있는 정보를 더하라'라는 명령어였다면 연산 작업이 필요하기 때문에 제어장치는 ALU(연산장치)에게 요청한다. ALU는 덧셈을 수행하기 위해 2의 보수 덧셈을 수행하는 회로를 실행하고 그 결과를 명령에 따라 적절한 레지스터에 저장한다.
프로그램 로드를 제외하고 여기까지가 CPU가 프로그램을 실행하는 한 사이클이다. 이러한 과정이 짧은 시간 안에 무수히 반복되면서 우리가 사용하는 프로그램이 동작하는 것이다. 이 한 사이클을 수행하고 하면 컴퓨터 동작을 다시 조정하기 위해 발진기(oscillator)라는 컴퓨터의 회로가 동작한다. 발진기는 전기 신호를 진동에너지로 변환하는데, 이때 발생하는 펄스가 같은 시간 내에 더 많이 발생할수록 사이클이 더 빠르다는 뜻이다. 이를 클럭(clock)이라고 하며 1초에 CPU가 몇번의 사이클을 도는 지를 판단하는 척도가 된다. 일반적으로 데스크탑 컴퓨터에서는 수백 MHz ~ 수 GHz가 된다.