명령어 파이프라인과 명령어 fetch 장치
명령어 파이프라인을 위주로 살펴보겠습니다. 명령어 파이프라인이 어떠한 원리로 운영되는지 알아보고 이의 취약점까지 알아보겠습니다.
명령어 파이프라인
파이프라인 처리는 데이타의 흐름 뿐만 아니라 명령어의 흐름에 대해서도 동작하는데, 명령어 파이프라인은 이전 명령어가 다른 세그멘트에서 실행되고 있는 동안에 메모리에 연속적으로 저장되어 있는 다음 명령어를 읽어옵니다. 즉 명 령어의 fetch 와 실행 단계가 중첩되어 동시에 수행되는 것입니다.
명령어 파이프라인의 취약점
이러한 방법이 가지는 한 가지 취약점은 명령어의 흐름에서 분기가 발생하는 경우입니다. 이때에는 파이프라인이 모두 비워져야 하고, 따라서 분기 명령어 이후에 메모리에서 읽어온 명령어는 모두 무시되어야 합니다. 명령어 fetch 장치와 명령어 실행 장치로서 두 세그멘트 파이프라인을 구성하는 컴퓨터를 생각해 보겠습니다.
명령어 fetch 장치
명령어 fetch 장치는 선입 선출(FIFO) 버퍼에 의한 큐 (queue) 로 구현됩니다. 실행 장치에서 메모리를 사용하지 않을 때에는 언제나 프로그램 카운터를 하나 증가시켜 FIFO버퍼로 다음 명령어를 읽어옵니다. 그러므로 명령어들은 큐 안에서 실행 장치가 디코딩하여 실행시켜 주기를 기다립니다.
즉 FIFO버퍼가 비어 있는 동안 계속해서 다음 명령어에 대한 fetch 단계가 수행되고, 실행 장치로부터의 요청에 대해서는 큐와 같은 동작으로 다음 명령 어를 인출해줍니다. 이와 같은 명령어 흐름에 대한 큐잉 (queueing) 기법은 명령어를 읽기 위한 평균 메모리 접근 시간을 효과적으로 줄여줍니다.
명령어 순차적 수행
일반적으로 보다 복잡한 명령어를 가진 컴퓨터에서는 명령어를 수행하기 위하여 다음과 같은 순차적 수행이 필요합니다.
1. 메모리에서 명령어를 fetch 한다.
2. 명령어를 디코딩한다.
3. 유효 주소를 계산한다.
4. 메모리에서 피연산자를 fetch 한다.
5. 명령어를 실행시킨다.
6. 결과를 적당한 곳에 저장한다.
명령어 파이프라인의 단점
명령어 파이프라인이 최고 속도로 동작하는 데에는 몇 가지 어려움이 있습니다. 각 세그멘트들의 수행 시간이 서로 다르고, 어떤 명령어에 대해서는 수행되지 않는 세그멘트도 있습니다. 예를 들어 레지스터 모드 명령어인 경우에 유효 주소의 계산이 필요하지 않습니다.
또 두개 이상의 세그멘트가 동시에 메모리 참조를 요 구하는 경우가 있어서, 한 세그멘트의 메모리 참조가 끝날 때까지 다른 것들이 기다려야 합니다. 이와 같은 메모리 참조시에 일어나는 충돌은 명령어와 데이타 참조에 대해 분리된 메모리 모듈에 별도의 메모리 버스를 둠으로써 해결할 수 도 있습니다. 결국, 명령어 파이프라인은 명령어 사이클이 모두 동일한 시간의 세그 멘트로 나누어졌을 때 가장 효율적으로 수행됩니다.