Zadania procesora
Aby zrozumieć organizację procesora, rozważmy stawiane mu
wymagania, a więc zadania, które musi on realizować:
Pobieranie rozkazów. Procesor musi odczytywać rozkazy z pamięci.
Interpretowanie rozkazów. Rozkazy muszą być zdekodowane w
celu określenia, jakie działania są wymagane.
Pobieranie danych. Wykonywanie rozkazów może wymagać
odczytywania danych z pamięci lub z modułu wejścia-wyjścia.
Przetwarzanie danych. Wykonywanie rozkazów może wymagać
przeprowadzenia na danych pewnych operacji arytmetycznych lub
logicznych.
Zapisanie danych. Wyniki operacji mogą wymagać zapisania danych
w pamięci lub w module wejścia-wyjścia
Struktura procesora
Istnieje wyraźne podobieństwo między wewnętrzną strukturą
komputera jako całości a wewnętrzną strukturą procesora. W obu
przypadkach występuje niewielki zbiór głównych elementów
(komputer: CPU, we-wy, pamięć; CPU- jesdnostka sterująca,
ALU rejestry) połączonych ścieżkami danych.
Organizacja rejestrów
Rejestry w procesorze można podzielić na dwie grupy:
Rejestry „widzialne dla użytkownika”:
Rejestr widzialny dla użytkownika jest rejestrem, do którego można
się odnosić za pomocą języka maszynowego, którym posługuje się
procesor. Praktycznie we wszystkich współczesnych projektach
procesora przewidziano pewnąliczbęrejestrów widzialnych dla
użytkownika, w przeciwieństwie do dawniej stosowanego
pojedynczego akumulatora. Możemy je scharakteryzować, posługując
sięnastępującym podziałem: ogólnego przeznaczenia, czyli robocze,
danych, adresów, kodów warunkowych.
Rejestry sterowania i stanu. Są one używane przez jednostkę
sterującą do sterowania pracą procesora oraz przez uprzywilejowane
programy systemu operacyjnego do sterowania wykonywaniem
programów.
Rejestry „widzialne”
Rejestry ogólnego przeznaczenia(robocze) mogąbyćprzypisane
przez programistęwielu funkcjom. W pewnych przypadkach rejestry
ogólnego przeznaczenia mogąbyćużywane do funkcji adresowania
(np. pośredniego rejestrowego, przemieszczeniowe-go). W innych
przypadkach ma miejsce częściowa lub pełna separacja rejestrów
danych od rejestrów adresowych.
Rejestry danych mogą być używane tylko do przechowywania
danych i nie można ich używać do obliczania adresów argumentów.
Rejestry adresowe mogą być w pewnym stopniu uniwersalne lub
mogą być przypisane określonym trybom adresowania.
W rejestrach kodów warunkowych, które są przynajmniej częściowo
widzialne dla użytkownika, przechowuje się kody warunkowe
(nazywane także znacznikami stanu lub flagami). Kody warunkowe
są bitami ustalanymi sprzętowo przez procesor w wyniku operacji.
Podstawowe rejestry -cz. I
Cztery rejestry mają zasadnicze znaczenie dla wykonywania rozkazów:
Licznik programu (PC).Zawiera adres rozkazu przewidzianego do
pobrania.
Rejestr rozkazu (IR).Zawiera ostatnio pobrany rozkaz.
Rejestr adresowy pamięci (MAR).Zawiera adres lokacji w pamięci.
Rejestr buforowy pamięci (MBR).Zawiera słowo danych, które ma
być zapisane do pamięci lub które zostało ostatnio odczytane z pamięci.
Licznik programu zawiera adres rozkazu. Zwykle jest on aktualizowany
przez procesor po każdym pobraniu rozkazu, dzięki czemu zawsze
wskazuje on następny rozkaz przewidziany do pobrania. Rozkaz
rozgałęzienia lub pominięcia również modyfikuje zawartość licznika
PC. Pobrany rozkaz jest ładowany do rejestru rozkazu, gdzie
analizowane są kod operacji i specyfikator argumentu. Dane są
wymieniane z pamięcią za pośrednictwem rejestrów MAR i MBR.
W systemie magistralowym rejestr MAR jest połączony bezpośrednio
z magistralą adresową, a MBR -z magistralą danych. Z kolei rejestry
widzialne dla użytkownika wymieniają dane z rejestrem MBR.
Podstawowe rejestry
We wszystkich projektach procesora jest rejestr( -y) określany jako
słowo stanu programu(ang. program status word-PSW).
W rejestrach PSW są zwykle przechowywane kody warunkowe i
inne informacje o stanie.
Występują tam zwykle następujące pola (znaczniki stanu, czyli flagi):
Znak. Zawiera bit znaku wyniku ostatniej operacji arytmetycznej.
Zero. Ustawiane, gdy wynik jest równy zeru.
Przeniesienie. Ustawiane, gdy wynikiem operacji jest przeniesienie
(dodawanie) lub przeniesienie zanegowane (odejmowanie). Używane
przy operacjach arytmetycznych obejmujących wiele słów.
Równość. Ustawiane, gdy wynikiem porównywania logicznego jest
równość.
Przepełnienie. Używane do wskazywania przepełnienia
arytmetycznego.
Zezwolenie/blokowanie przerwania. Używane do obsługi przerwań.
Nadzorca. Wskazuje, czy procesor pracuje w trybie nadzorcy, czy w
trybie użytkownika. Niektóre rozkazy uprzywilejowane mogą być
wykonywane tylko w trybie nadzorcy. Również pewne obszary
pamięci mogą być dostępne tylko w trybie nadzorcy
Cykl rozkazu
Gdy rozkaz zostanie pobrany, muszą być zidentyfikowane jego
specyfikatory argumentów. Następnie pobierany jest z pamięci
każdy argument wejściowy; proces ten może wymagać adresowania
pośredniego. Argumenty przechowywane w rejestrach nie muszą być
pobierane. Gdy operacja zostanie wykonana, może zajść potrzeba
wykonania podobnego ciągu operacji w celu zapisania wyniku w
pamięci głównej.
Cykl rozkazu
Gdy rozkaz zostanie pobrany, muszą być zidentyfikowane jego
specyfikatory argumentów. Następnie pobierany jest z pamięci
każdy argument wejściowy; proces ten może wymagać adresowania
pośredniego. Argumenty przechowywane w rejestrach nie muszą
być pobierane. Gdy operacja zostanie wykonana, może zajść potrzeba
wykonania podobnego ciągu operacji w celu zapisania wyniku w
pamięci głównej.
Cykl pośredni i rozkazu
W trakcie cyklu pośredniego do rejestru MAR jest przenoszonych
N najbardziej znaczących bitów rejestru MBR, zawierających
odniesienie do adresu. Następnie jednostka sterująca zgłasza
zapotrzebowanie na odczyt z pamięci w celu wprowadzenia
pożądanego adresu argumentu do rejestru MBR.
Cykl rozkazu przybiera wiele postaci, ponieważ postać ta
zależy od tego, który z różnorodnych rozkazów maszynowych
znajduje się w rejestrze IR. Cykl rozkazu może obejmować
przesyłanie danych między rejestrami, odczytanie lub zapisanie
w pamięci, operację wejścia-wyjścia oraz (lub) wywołanie ALU
Cykl przerwania
Cykl przerwania jest prosty i przewidywalny. Bieżąca zawartość
licznika PC musi być zapisana, żeby procesor mógł wznowi normalną
działalność po przerwaniu. Wobec tego zawartość licznika PC jest
przenoszona do rejestru MBR w celu zapisania w pamięci. Zawartość
specjalnej, zarezerwowanej do tego celu lokacji pamięci jest ładowana
do MAR przez jednostkę sterującą. Może to być na przykład wskaźnik
stosu. Do licznika PC jest ładowany adres procedury przerwania. W
rezultacie rozpoczyna się następny cykl rozkazu przez pobranie
odpowiedniego rozkazu.
Pobieranie z wyprzedzeniem
Według najprostszego podziału przetwarzania rozkazu na dwa etapy:
pobranie rozkazu i wykonanie rozkazu, występują w nim takie
przedziały czasowe podczas wykonywania rozkazu, w których nie
następują odniesienia do pamięci głównej. Przedziały te mogłyby
być wykorzystane do pobrania następnego rozkazu równolegle z
wykonywaniem bieżącego. Zgodnie z rysunkiem niżej potok
przebiega na 2 niezależnych etapach. Na pierwszym etapie następuje
pobranie i zbuforowanie rozkazu. Gdy drugi etap jest wolny, następuje
przekazanie do niego buforowanego rozkazu. Podczas gdy na drugim
etapie ma miejsce wykonywanie rozkazu, na pierwszym etapie
wykorzystuje jeden z nieużywanych cykli pamięci w celu pobrania
i zbuforowania następnego rozkazu. Nazywa się to pobieraniem
rozkazu z wyprzedzeniem(ang.instruc-tion prefetch) lub pobieraniem
na zakładkę(ang.fetch overlap).
Wady stosowania wyprzedzeń
Czas wykonywania jest na ogół dłuższy niż czas pobierania.
Wykonywanie obejmuje odczytywanie i przechowywanie
argumentów oraz przeprowadzenie samej operacji. Wobec tego
etap pobierania musi zawierać oczekiwanie przez pewien czas, zanim
będzie mogło nastąpić opróżnienie bufora.
Rozkaz skoku warunkowego powoduje, że adres następnego rozkazu
przewidzianego do pobrania jest nieznany. Wobec tego realizacja
etapu pobierania może nastąpićdopiero po otrzymaniu adresu
następnego rozkazu, który zostanie określony po zakończeniu etapu
wykonywania. Następnie na etapie wykonywania następuje
oczekiwanie na pobranie kolejnego rozkazu.
Potoki wieloetapoweI
Pobranie rozkazu (FI).Wczytanie następnego spodziewanego rozkazu
do bufora.
Dekodowanie rozkazu (DI). Określenie kodu operacji i specyfikatorów
argumentu.
Obliczanie argumentów (CO). Obliczenie efektywnego adresu każdego
argumentu źródłowego. Może to obejmować obliczanie adresu z
przesunięciem, adresu rejestrowego pośredniego, adresu pośredniego
lub innych form.
Pobieranie argumentów (FO). Pobranie każdego argumentu z pamięci.
Argumenty w rejestrach nie muszą być pobierane.
Wykonanie rozkazu (El). Przeprowadzenie wskazanej operacji i
przechowanie wyniku, jeśli taki jest, w ustalonej lokacji docelowej.
Zapisanie argumentu (WO). Zapisanie wyniku w pamięci.
Przy takiej dekompozycji czas trwania różnych etapów może być
zbliżony.
Potoki wieloetapoweII
Nie zawsze każdy rozkaz przechodzi przez wszystkie 6 etapów potoku.
Na przykład rozkaz ładowania nie wymaga etapu WO. Dla uproszczenia
zakłada się jednak, że każdy rozkaz wymaga 6 etapów. Zakłada się
również, że wszystkie etapy mogą być realizowane równolegle.
W szczególności przyjmuje się, że nie występują konflikty dostępu
do pamięci. Na przykład etapy FI, FO i WO zawierają odniesienia
do pamięci. Na wykresie założono, że wszystkie te odniesienia mogą
następować jednocześnie. W większości systemów pamięci nie jest to
możliwe. Jednak pożądana wartość może się znajdować w pamięci
podręcznej lub te że etapy FO czy WO mogą nie być realizowane.
Potoki wieloetapoweIII
Poprawę wydajności ogranicza kilka czynników. Jeśli czasy trwania
6 etapów nie są równe, na różnych etapach wystąpi pewne oczekiwanie,
podobne do wykazanego w przypadku potoku 2-etapowego. Inną
trudność stanowi rozkaz rozgałęzienia warunkowego, który może
unieważnić kilka pobranych rozkazów. Podobnym nie
przewidywalnym zdarzeniem jest przerwanie. Etap CO może być
uzależniony od zawartości rejestru, która mogłaby być zmieniona
przez poprzedni rozkaz będący w dalszym ciągu w potoku. Mogą
występować inne takie konflikty rejestrów lub pamięci. System musi
zawierać rozwiązania logiczne zapobiegające konfliktom tego rodzaju.
Postępowanie z rozgałęzieniami:
Stosuje sięwiele sposobów postępowania z rozkazami rozgałęzienia
warunkowego: zwielokrotnienie strumienia; pobieranie docelowego
rozkazu z wyprzedzeniem; bufor pętli; przewidywanie rozgałęzienia;
opóźnione rozgałęzienie.
Zwielokrotnione strumienie i wyprzedzenia:
W przypadku prostego potoku występują straty spowodowane przez
rozkaz rozgałęzienia, ponieważ konieczne jest wybranie jednego z
dwóch możliwych rozkazów i wybór ten może się okazać niewłaściwy.
Brutalnym rozwiązaniem jest powielenie początkowych części potoku i
umożliwienie równoczesnego pobrania obu rozkazów za pomocą dwóch
strumieni. Rozwiązanie to stwarza pewne problemy przypadku
zwielokrotnionego strumienia występują opóźnienia wynikające
z rywalizacji o dostęp do rejestrów i pamięci. Następne rozkazy
rozgałęzienia mogą wejść do potoku (którymkolwiek strumieniem),
zanim zostanie przesądzone oryginalne rozgałęzienie. Każdy taki
rozkaz wymaga dodatkowego strumienia. Gdy rozpoznawany jest
rozkaz rozgałęzienia warunkowego, następuje wyprzedzające pobranie
rozkazu docelowego razem z rozkazem następującym po rozgałęzieniu.
Rozkaz docelowy jest następnie zachowywany, aż do czasu wykonania
rozkazu rozgałęzienia. W momencie rozgałęzienia rozkaz docelowy
jest już pobrany.
Bufor pętli
Bufor pętli jest małą, bardzo szybką pamięcią związaną z etapem
pobierania rozkazów potoku. Zawiera on kolejno n ostatnio pobranych
rozkazów. Jeśli ma nastąpić rozgałęzienie, sprawdza się czy cel
rozgałęzienia znajduje się wewnątrz bufora. Jeśli tak, to następny
rozkaz jest pobierany z bufora.
Dzięki pobieraniu z wyprzedzeniem bufor pętli zawiera pewne
rozkazy następujące po kolei po adresie pobrania bieżącego rozkazu.
Wobec tego kolejno pobierane rozkazy będą dostępne bez straty
czasu wymaganej na dostęp do pamięci.
Jeśli następuje rozgałęzienie do rozkazu znajdującego się o kilka
pozycji dalej od adresu rozkazu rozgałęzienia, to rozkaz docelowy
będzie się już znajdował w buforze. Jest to użyteczne w przypadku
sekwencji IF-THEN) oraz IF-THEN-ELSE Jeżeli bufor jest
dostatecznie pojemny, aby zmieścić wszystkie rozkazy składające się
na pętlę, to rozkazy te muszą być pobrane tylko raz, przy pierwszej
iteracji.
Przewidywanie rozgałęzień
Zastosowano wiele metod przewidywania, czy nastąpi rozgałęzienie.
Wśród nich często używane są następujące: przewidywanie zawsze
następującego rozgałęzienia; przewidywanie nigdy nie
następującego rozgałęzienia; przewidywanie za pomocą kodu
operacji; przełącznik nastąpiło/nie nastąpiło; tablica historii
rozgałęzień. Pierwsze trzy rozwiązania są statyczne: nie zależą
one od historii poprzedzającej rozkaz rozgałęzienia warunkowego.
Ostatnie dwa są dynamiczne: zależą od historii.
Przełączniki tak/nie wystąpiło
W strategiach dynamicznych próbuje się poprawić dokładność
przewidywania, rejestrując historię rozkazów rozgałęzienia
warunkowego w programie. Z każdym rozkazem rozgałęzienia
warunkowego można na przykład powiązać jeden lub dwa bity
odzwierciedlające najnowszą historię rozkazu. Bity te są określane
jako przełącznik nastąpiło/nie nastąpiło, który ukierunkowuje
procesor na podjęcie określonej decyzji po ponownym natrafieniu
tego rozkazu. Zwykle te bity historii nie są związane z rozkazem
w pamięci głównej. Są one raczej przechowywane w tymczasowej,
bardzo szybkiej pamięci.
Rozwiązanie jednobitowe: Wszystko, co można zapisać za pomocą
jednego bitu, to wystąpienie lub niewystąpienie rozgałęzienia
podczas ostatniego wykonywania rozkazu. Ograniczenie wynikające
ze stosowania pojedynczego bitu ujawnia się w przypadku rozkazu
rozgałęzienia warunkowego, które następuje prawie zawsze, np. w
przypadku rozkazu pętli. Przy zastosowaniu jednego bitu historii,
błędne przewidywanie wystąpi dwukrotnie przy każdym użyciu
pętli: raz przy wejściu do pętli i raz przy jej opuszczeniu.
Rozwiązania dwubitowe:
Jeśli stosowane są dwa bity, mogą one być użyte do zarejestrowania
wyników ostatnich dwóch przypadków wykonania stowarzyszonego
rozkazu lub do zapisania stanu w pewien inny sposób. Proces
decyzyjny może być reprezentowany za pomocą maszyny o
skończonej liczbie (czterech) stanów. Jeśli ostatnie dwa rozgałęzienia
danego rozkazu nastąpiły w ten sam sposób, to przewiduje się, że
należy wybrać tę samą ścieżkę. Jeśli to przewidywanie okazało się
błędne, pozostaje ono bez zmian, aż do ponownego napotkania tego
rozkazu. Jeśli przewidywanie okazało się ponownie błędne, to w
wyniku następnego przewidywania zostanie wybrana ścieżka
przeciwna. Wobec tego algorytm ten wymaga dwóch kolejnych
błędnych przewidywań do zmiany decyzji. Jeśli rozgałęzienie nastąpi
w nietypowy sposób tylko raz, na przykład w przypadku pętli,
przewidywanie będzie błędne tylko raz.
Tablica rozgałęzień
Tablica historii rozgałęzień jest małą pamięcią podręczną powiązaną
z etapem pobierania rozkazu w potoku. Każdy zapis w tablicy składa
się z trzech elementów: adresu rozkazu rozgałęzienia pewnej liczby
bitów historii wskazujących na używanie tego rozkazu informacji o
rozkazie docelowym. W większości dzisiejszych rozwiązań to trzecie
pole zawiera adres rozkazu docelowego. Inną możliwością jest to,
żeby trzecie pole zawierało sam rozkaz docelowy.