Wykład Potokowe wykonywanie operacji i rozkazów, stos, podprogramy, przerwania, układ sterowania, zarys historii komputera elektronicznego. Zawartość wykładu: 1. Potokowe wykonywanie operacji obliczeniowych 2. Potokowe wykonywanie rozkazów 3. Pamięć stosowa w komputerze 4. Wywołania podprogramów 5. Przerwania i wyjątki 6. Budowa układów sterowania komputerów 7. Zarys historii komputera elektronicznego
Potokowe wykonywanie operacji obliczeniowych Potokowe przetwarzanie danych (ang. pipelined processing) polega na zorganizowaniu wykonywania operacji w komputerze, w sposób podobny do wytwarzania produkowania wyrobów w fabryce przy pomocy taśmy produkcyjnej. Taśma produkcyjna (ang. production pipeline) jest to urządzenie, które przesuwa wytwarzane produkty między kolejnymi stanowiskami, na których wykonywane są kolejne składowe operacje na produktach potrzebne do wytworzenia całego wyrobu. Stanowiska są ustawione w szereg wzdłuż taśmy w kolejności odpowiadającej kolejnym fazom procesu produkcyjnego.
Przed każdym przesunięciem taśmy na jej początek wstawia się kolejny nieobrobiony przez taśmę produkt inicjalny (mogą to być surowce lub produkt w stanie inicjalnym). Produkt jest przesuwany następnie przez wszystkie stanowiska robocze. Na każdym stanowisku produkt jest wzbogacany o wyniki wykonanych na nim odpowiednich operacji. Po przejściu przez wszystkie stanowiska produkt zamienia się w gotowy wyrób. Czas wykonania operacji na wszystkich stanowiskach na taśmie jest w przybliżeniu taki sam. W czasie między kolejnymi przesunięciami taśmy, muszą zakończyć się operacje na wszystkich stanowiskach, by taśma mogła być przesunięta o jedno stanowisko w kierunku ostatniej operacji w procesie produkcyjnym. Podczas pracy taśmy produkcyjnej na której jest n stanowisk, obrabianych jest jednocześnie n produktów.
Po każdym przesunięciu taśmy schodzi z niej gotowy produkt, o ile na początek taśmy stale podawane są produkty w stanie inicjalnym. Przy produkcji taśmowej na n stanowiskach, szybkość uzyskiwania gotowych wyrobów jest n razy większa w porównaniu z taką organizacją produkcji, gdzie nie ma przesuwającej się taśmy a cały wyrób jest wytwarzany od początku do końca na jednym stanowisku.
W informatyce taśmowe wykonywanie operacji obliczeniowych jest nazywane przetwarzaniem potokowym (ang. pipelined processing). Aby operacje obliczeniowe mogły być wykonywane w sposób potokowy musimy zbudować układ wykonawczy, który będzie działał podobnie jak taśma produkcyjna.
W celu zaprojektowania potokowego wykonania danej operacji obliczeniowej należy: podzielić operację obliczeniową na pewną liczbę n operacji składowych, wykonywanych sekwencyjnie - jedna po drugiej, takich, że czas wykonania wszystkich operacji składowych jest w przybliżeniu identyczny, zbudować dla każdej operacji składowej odrębny układ wykonawczy tzw. stopień potoku (ang. pipeline stage), połączyć stopnie potoku w taki sposób, aby wyjście z poprzedniego stopnia było podawane na wejście następnego stopnia, zbudować układ synchronizacji przekazywania danych między stopniami, aby dane przekazywane były między wszystkimi stopniami jednocześnie, w odstępach czasu równych czasowi wykonania operacji składowych, zwanych taktami potoku,
zapewnić, aby w chwili przekazywania danych między stopniami na wejście pierwszego stopnia podawane były nowe argumenty operacji obliczeniowej, odbierać co każdy takt wyniki z ostatniego stopnia potoku, stanowiące wyniki wykonania całej operacji obliczeniowej.
Rzadko udaje się podzielić operacje obliczeniową na dokładnie równe czasowo operacje składowe. Dlatego, między stopniami potoku wstawia się układy buforowe, do których wpisuje się wyniki działania stopni (patrz rysunek poniżej po prawej stronie). Każdy układ buforowy stanowi układ dwu rejestrów: rejestru wyjściowego stopnia poprzedniego i rejestru wejściowego stopnia następnego. Rejestr wyjściowy służy do asynchronicznego zapamiętania wyniku stopnia poprzedniego. Rejestry w obrębie jednego bufora są połączone ze sobą równolegle, w taki sposób, że co takt potoku następuje przepisanie zawartości rejestru wyjściowego do wejściowego. Przepisanie następuje we wszystkich buforach równocześnie, co zapewnia układ sterowania potoku.
Wyznacza się najdłuższy czas wykonania operacji wśród wszystkich stopni, włączając w to zapis wyniku stopnia do wyjściowego rejestru buforowego i ten czas przyjmuje się za długość taktu potoku. Wyniki działania stopni przekazuje się ze wszystkich buforów na wejście następnego stopnia w odstępach czasu równych przyjętemu taktowi potoku, równemu najdłuższemu czasowi działania stopnia. Pojedyncze rejestry buforowe umieszcza się również na wejściu pierwszego stopnia i wyjściu ostatniego stopnia potoku. Tak zbudowany potok pozwala na wykonanie przetwarzania potokowego również dla operacji, które nie dają się podzielić na dokładnie równe czasowo operacje składowe.
Struktura potoku dla wykonania operacji obliczeniowej rejestr we Stopień 1 (operacja 1) bufor 1 Sterowanie przesłaniem danych między stopniami Stopień 2 (operacja 2) bufor 2 Stopień n-1 (operacja n-1) bufor n-1 Stopień n (operacja n) rejestr wy
Budowa bufora między stopniami potoku Z poprzedniego stopnia Rejestr buforowy wy Sterowanie przesłaniem danych między stopniami Rejestr buforowy we Do następnego stopnia
Łatwo zauważyć, że przez n-1 pierwszych taktów działania potoku na wyjściu potoku nie pojawi się żaden wynik. Pierwszy wynik operacji pojawi się po n-tym takcie i odtąd po każdym takcie będziemy odbierać wynik operacji obliczeniowej. Pomijając początkowe opóźnienie, potok obliczeniowy zawierający n stopni przyspiesza więc wykonanie operacji obliczeniowej n krotnie.
Potokowe wykonywania rozkazów Ideę przetwarzania potokowego można z powodzeniem zastosować do wykonania rozkazów w procesorze. Jak wiadomo cykl wykonawczy rozkazu można podzielić na następujące operacje składowe: Pobranie rozkazu Zdekodowanie rozkazu Wyznaczenie adresu argumentów Pobranie argumentów Wykonanie operacji Zapis wyników do pamięci
Sprzęt wykonawczy komputera możemy zbudować w ten sposób, że każda z podanych operacji składowych cyklu rozkazu będzie wykonana przez odrębny układ wykonawczy. Układ ten jest wstawiony jako stopień do potoku wykonania rozkazu, jak pokazano na rysunku poniżej. Założymy, że takt potoku ustalimy równy czasowi wykonania najdłuższej z powyższych operacji składowych. Między stopniami potoku wstawimy buforowe układy pamiętające, które będą przechowywać wyniki wykonania stopnia poprzedniego jako wejście dla stopnia następnego. Na wejście potoku będziemy podawać adresy kolejnych rozkazów programu wykonywanego przez procesor.
Stopnie potoku wykonującego rozkazy komputera adres rozkazu Pobranie rozkazu Zdekodowanie rozkazu Wyznaczenie adresu arg. Pobranie argumentu Wykonanie rozkazu Zapis wyniku
W kolejnych taktach potoku coraz to nowe adresy rozkazów będą wprowadzane do pierwszego stopnia potoku i pobierane będą z pamięci operacyjnej kolejne rozkazy programu. Po 6-tym takcie potoku otrzymamy wykonanie pierwszego rozkazu programu i po każdym następnym takcie będziemy mięć wykonany kolejny rozkaz programu, o ile potok będzie pracował bez przestojów - tzn. każdy stopień potoku będzie miał w każdym takcie gotowe dane wejściowe. Potok wykonania rozkazów zawierający 6 stopni, pracujący bez przestojów, przyspiesza wykonanie programu 6-ciokrotnie. Dzieje się tak dlatego, że przy pomocy potoku wykonanie programu zostaje zrównoleglone. Każdy stopień potoku pracuje dla innego rozkazu.
+ Wykonanie potokowe rozkazów takty zegara 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 Stopnie potoku: pobranie rozkazu 1 2 3 4 5 6 7 zdekodowanie rozkazu 1 2 3 4 5 6 wyznaczenie adresu operandów 1 2 3 4 5 pobranie argumentów 1 2 3 4 wykonanie operacji rozkazu 1 2 3 zapis wyniku nr rozkazu
Przy wykonywaniu programów metodą potokową występują problemy z wykonaniem pewnych typów rozkazów oraz z wykonaniem programów o pewnych strukturach następstwa rozkazów. Rozkazy te powodują tzw. przestoje w potoku, z powodu braku danych na wejściu stopni potoku. Brak danej wejściowej uniemożliwia pracę danego stopnia, brak wyniku do przesłania do następnego stopnia a w konsekwencji, z pewnym opóźnieniem, brak wyniku na wyjściu potoku. Jeśli brak danych wejściowych trwa więcej niż jeden takt, powoduje to zatrzymanie pracy całego potoku (jego końcowego stopnia) na tyle taktów, dla ilu brak było danych wejściowych.
Problem rozkazów skoku Pierwszym typem rozkazów, które powodują przestoje w potoku wykonania rozkazów są rozkazy skoku. Wynikiem rozkazu skoku jest wprowadzenie do licznika rozkazów adresu następnego rozkazu do wykonania tj. adresu wytworzonego (lub zawartego) w tym rozkazie.
Przykład 0 1 2 3 4 5 6 7 8 9 10 11 12 13 czas adres rozkazu R 1 Pobranie rozkazu R 2 R 3 rozkaz skoku Zdekodowanie rozkazu Wyznaczenie adresu arg. R 4 Pobranie argumentu R 5 Wykonanie rozkazu R 6 Zapis wyniku Dla pobrania rozkazu R 4, jego adres powinien znaleźć się w liczniku rozkazów już w chwili 3. Natomiast rozkaz skoku R 3 dostarczy ten adres dopiero w chwili 8. Tak więc, pierwszy stopień potoku nie będzie mógł pracować w chwilach od 3 do 7, powodując w konsekwencji przestoje dalszych stopni potoku i brak wyników na wyjściu potoku.
Sytuację tę można poprawić w trakcie kompilacji programu. Kompilator umieszcza w programie za rozkazem skoku odpowiedniej liczby rozkazów nic nie rób, które zastępuje następnie rozkazami obliczeniowymi obojętnymi z punktu widzenia miejsca ich wykonania w programie. W ten sposób lukę w ciągłej pracy potoku może być wypełniona. Metoda ta nosi nazwę opóźnionych skoków (ang. delayed branches).
Problem wzajemnej zależności kolejnych rozkazów Inną sytuacją w programie, w której potok zostaje wstrzymany jest bezpośrednia zależność kolejnych rozkazów ze względu na dane. Dzieje się tak, gdy następny rozkaz wykonuje operację na wyniku poprzedniego. Przykład M (125) := M (125) + R1 (ADD) R2 := R2 M (125) (MUL) gdzie: ADD, MUL oznacza rozkazy dodaj, pomnóż; M(125), R1, R2 oznaczają odpowiednio zawartości: komórki pamięci o adresie 125, rejestru R1, rejestru R2.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 czas adres rozkazu r 1 r 2 r 3 ADD r 4 MUL Przestój potoku z powodu braku danej M (125) wytworzonej przez ADD Zdekodowanie rozkazu Wyznaczenie adresu arg. Pobranie argumentu Pobranie rozkazu Wykonanie rozkazu r 5 Zapis wyniku Przestój potoku w wyniku zależności sąsiednich instrukcji Na rysunku wykonania programu powyżej, widzimy przerwę długości 2 taktów potoku w wykonywaniu instrukcji MUL z powodu braku wyliczonego i odesłanego do pamięci wyniku dodawania ADD. Przerwa ta może być wypełniona przez wykonanie dwu obojętnych instrukcji obliczeniowych, wstawionych przez kompilator do programu bezpośrednio po instrukcji ADD.
Pamięć stosowa w komputerze Pamięć stosowa (ang. stack memory) jest specjalnym rodzajem pamięci wykorzystywanym w komputerze dla tymczasowego przechowywania informacji, gdy chcemy odczytywać informacje w dokładnie odwrotnym porządku w stosunku do kolejności zapisu, nie zajmując się problemami adresacji informacji Pamięć stosowa jest pamięcią szeregową ze szczególnymi ograniczeniami dostępu na zapis i odczyt do tylko jednej komórki tej pamięci tzw. wierzchołka (szczytu) stosu (ang. top of the stack).
Pamięć stosowa zachowuje się tak jak kolejka, w której informacja może być wpisywana do wierzchołka stosu, powodując przesunięcie informacji przechowywanych w kolejnych komórkach stosu o jedna pozycję w głąb tej kolejki. Odczyt ze stosu jest możliwy tylko z wierzchołka stosu a więc można odczytać tylko ostatnio zapisaną informację. Odczyt powoduje usunięcie wiadomości ze szczytu stosu i wprowadzenie na jej miejsce pierwszej informacji z głębi stosu, z przesunięciem wszystkich pozostałych informacji o jedno miejsce w kierunku szczytu stosu. Jest to więc kolejka typu Ostatni- Wpisany - Pierwszy - Odczytany (ang. Last-In-First-Out czyli LIFO).
Pamięć stosowa działa podobnie do magazynku karabinu, w którym wprowadzenie kolejnego naboju wpycha pozostałe naboje w głąb magazynka, a użycie naboju powoduje jego usunięcie i wprowadzenie na wierzch magazynka pierwszego naboju, który znajdował się pod tym zużytym.
Dla obsługi pamięci stosowej używane są trzy rozkazy: Wprowadź do stosu (ang. Push) Czytaj wierzchołek stosu (ang. Read Stack) Usuń ze stosu (ang. Pop ) Aby wpisać informację D do stosu wykonujemy operacje Push D. Aby odczytać informacje z wierzchołka stosu wykonujemy operacje Read stack. Aby usnąć informacje ze szczytu stosu wykonujemy operacje Pop.
Czasami stosowane są operacje arytmetyczne stosowe, które wykonują się na argumentach zapisanych w dwu kolejnych komórkach na szczycie stosu. Po wykonaniu operacji arytmetycznej wykonywana jest operacja Pop i wynik jest umieszczany na szczycie stosu. Wierzchołek Wierzchołek C B A Wierzchołek Dana C Dana B Dana A D C B A C B A Stan początkowy Po operacji PUSH D (wprowadź D do stosu) Po operacji POP (usuń ze stosu)
Budowa pamięci stosowej Pierwsze realizacje pamięci stosowej polegały na wykorzystaniu rejestrów, między którymi informacja była przesuwana równolegle, przy operacjach Push i Pop. Współcześnie pamięć stosowa jest realizowana w pamięci operacyjnej ze wspomaganiem sprzętowym w postaci rejestrów obsługujących mechanizm dostępu do stosu. Stos jest nieprzerwanym ciągiem komórek o kolejnych adresach zarezerwowanym w pamięci operacyjnej przy pomocy dwu specjalnych rejestrów procesora, przechowujących adresy komórek stanowiących górną i dolną granicę stosu. Są to tzw. rejestry podstawy i granicy stosu (ang. stack base register, stack limit register). Obszar pamięci pomiędzy tymi adresami jest wyłączony z innego wykorzystywania niż dla realizacji pamięci stosowej. Wierzchołek stosu jest określony przez adres przechowywany w trzecim rejestrze tzw. rejestrze wskaźnika stosu (ang. stack pointer register).
Przed rozpoczęciem wykonywania programów komputera, rejestr wskaźnika stosu jest ustawiany na zawartość rejestru podstawy stosu. Po każdej operacji Push, zawartość rejestru wskaźnika stosu jest zmieniana o liczbę bajtów odpowiadających jednemu słowu stosu w kierunku adresu granicy stosu. Po każdej operacji Pop, zawartość rejestru wskaźnika stosu jest zmieniana o liczbę bajtów odpowiadających jednemu słowu stosu w kierunku adresu podstawy stosu.
Pamięć operacyjna Rejestry specjalne procesora Rejestr granicy stosu Rejestr wskaźnika stosu Rejestr podstawy stosu Dane zapisane w stosie Obszar Stosu Realizacja stosu w pamięci operacyjnej komputera wierzchołek stosu w pamięci
Rysunek powyżej pokazuje przypadek realizacji stosu w pamięci operacyjnej gdzie wierzchołek stosu jest przechowywany bezpośrednio w pamięci. Inne rozwiązanie, pokazane na rysunku poniżej, zakłada, że wierzchołek stosu oraz komórka stosu bezpośrednio poniżej wierzchołka są przechowywane w specjalnych rejestrach procesora: rejestr wierzchołka stosu i rejestr pod-wierzchołka stosu.
Rejestry specjalne procesora Pamięć operacyjna Rejestr wierzchołka stosu Rejestr pod-wierzchołka stosu Rejestr granicy stosu Rejestr wskaźnika stosu Rejestr podstawy stosu Dane zapisane w stosie Obszar Stosu Realizacja stosu w pamięci operacyjnej z wierzchołkiem stosu w rejestrach
Wywołania podprogramów Wśród sterujących rozkazów wewnętrznych komputera wyróżniliśmy rozkazy wywołania podprogramów (ang. subroutine call) o symbolu Call i rozkazy powrotu z podprogramu (ang. subroutine return) o symbolu Ret. Podprogram (ang. subroutine) jest to sekwencja rozkazów zakończona rozkazem powrotu Ret. Z rozkazem wywołania podprogramu jest zawsze związany adres pierwszego rozkazu w podprogramie, zwany adresem podprogramu. Mechanizm wywoływania podprogramów i realizacja rozkazów Call i Ret opiera się na wykorzystaniu stosu.
Wykonanie rozkazu wywołania podprogramu Call polega na: 1. wprowadzeniu do stosu bieżącej zawartości licznika rozkazów (a więc adresu powrotu do rozkazu, następnego do wykonania po rozkazie Call ) poprzez operację Push, 2. wpisaniu następnie do licznika rozkazów adresu podprogramu z rozkazu Call, 3. pobranie rozkazu według nowej zawartości licznika rozkazów. Adres zapisywany do stosu będzie wykorzystany przez rozkaz powrotu z podprogramu Ret, do automatycznego powrócenia po wykonaniu podprogramu do następnego rozkazu po rozkazie Call.
Wykonanie rozkazu powrotu z podprogramu Ret polega na: 1. odczytaniu z wierzchołka stosu zapisanego tam adresu powrotu (do rozkazu następnego po rozkazie Call ), 2. wpisaniu tego adresu powrotu do licznika rozkazów, 3. wykonaniu operacji Pop na stosie, 4. pobraniu rozkazu według nowej zawartości licznika rozkazów. Adres powrotu zapisywany do stosu przy wywołaniu podprogramu nazywany jest czasem śladem (ang. trace) a rozkaz wywołania podprogramu nazywany jest inaczej skokiem ze śladem.
Istnieją zagnieżdżone wywołania podprogramów (ang. nested calls)), tzn. z wywołanego podprogramu można znowu wywołać następny podprogram, z niego następny, itd. Mechanizm powrotu z podprogramu według śladu zapisanych w stosie zapewnia automatyczne powroty do kolejnych podprogramów przy zachowaniu poprawnej kolejności.
Pamięć operacyjna Adresy 000 Program wiodący Stos 100 101 CALL 500 Zapisz 101 do stosu Stos 101 500 Podprogram 1 Stos 101 Pobierz ze stosu 600 601 670 CALL 900 RET Zapisz 601 do stosu Stos 601 101 900 Podprogram 2 Stos 601 101 Pobierz ze stosu 950 RET Wykorzystanie stosu przy wywołaniach podprogramów
Rysunek powyżej przedstawia czynności związane z zagnieżdżonym wywołaniem podprogramów z programu wiodącego. Przy wywołaniu podprogramu 1 (Call 500 zapisany pod adresem 100) do stosu zostaje wpisany adres 101 powrotu z wywołanego podprogramu. Przy wywołaniu podprogramu 2 (Call 900 zapisany pod adresem 600) do stosu zostaje wpisany adres powrotu 601. Przy wykonaniu powrotu z podprogramu 2 ze stosu pobierany jest adres 601. Przy wykonaniu powrotu z podprogramu 1 ze stosu pobierany jest adres 101.
Przerwania i wyjątki Przerwania (ang. interrupts) umożliwiają sprzętową ingerencję z zewnątrz komputera w przebieg wykonywania programu. Procesor ma zazwyczaj 2 końcówki przerwań (końcówka maskowalna i niemaskowalna), na które układy zewnętrzne w stosunku do komputera mogą wysłać sygnały w celu wymuszenia wykonania programu obsługi przerwania. Zgłoszenie przerwania powoduje ( po dokończeniu aktualnie wykonywanego rozkazu) zawieszenie normalnego toku wykonywania bieżącego programu (następny rozkaz tego programu nie jest wykonywany) a zamiast tego następuje sprzętowe wymuszenie wywołania podprogramu obsługi przerwania spod adresu ustalonego w odpowiednim specjalnym rejestrze lub tablicy w pamięci procesora.
Operacje związane z obsługą przerwania Rozkaz Rozkaz Wywołanie podprogramu obsługi Zapamiętanie stanu wybranych rejestrów mikroprocesora w stosie Wykonanie podprogramu obsługi przerwania Przywrócenie stanu rejestrów mikroprocesora ze stosu Powrót (RET) Rozkaz
Podprogram obsługi przerwania zapamiętuje w stosie stan podstawowych rejestrów procesora, które potrzebne będą do odtworzenia stanu wykonywanego programu przy powrocie do jego wykonywania, tzw. kontekst programu. Są to licznik rozkazów, rejestr stanu procesora, wskaźnik stosu procesora, inne rejestry specjalne i często stan akumulatora lub paru podstawowych rejestrów uniwersalnych zawierających dane. Następnie wykonywany jest właściwy podprogram obsługi przerwania, który zwykle wypełnia jakieś operacje wyższej konieczności ( bardziej priorytetowe niż bieżący program) wywoływane asynchronicznie metodą zgłoszenia przerwania. Po zakończeniu programu obsługi przerwania, zawartości rejestrów procesora potrzebne do wznowienia przerwanego programu są jedna po drugiej pobierane ze stosu ( poprzez wykonania rozkazów read stack do akumulatora oraz Pop oraz rozkazów przesłania między rejestrem akumulatora i innymi rejestrami). Po przywróceniu stanu potrzebnych rejestrów wykonywany jest rozkaz powrotu z podprogramu przerwania, który pobiera rozkaz według licznika rozkazów.
Badanie obecności zgłoszenia przerwania odbywa się w cyklu wykonania rozkazów po każdym rozkazie, po którym przerwania są dozwolone. Wydłuża to cykl rozkazowy o trzecią fazę: fazę obsługi przerwań. Nie po wszystkich rodzajach rozkazów przerwania są dozwolone. Przerwania nie są dozwolone po rozkazach w których zbadano lub ustawiono stan komputera, który musi być zachowany przy wykonaniu następnego rozkazu. Rozkazy, po których nie może nastąpić obsługa przerwania są nazywane rozkazami nieprzerywalnymi. Obsługa przerwań może być zablokowana również w sposób programowy - poprzez maskowanie przerwań w wyniku wykonania związanego z tym rozkazu wewnętrznego. Nie dotyczy to jednak przerwań przychodzących na końcówkę przerwań niemaskowalnych. Te muszą być zawsze obsłużone, jednak tylko po rozkazach przerywalnych.
Obsługa przerwań a cykl wykonania rozkazów Start Pobierz następny rozkaz Faza pobierania rozkazu Przerwania zablokowane Wykonaj rozkaz Przerwania dozwolone Faza wykonania rozkazu Sprawdź, czy jest przerwanie: obsłuż przerwanie Faza obsługi przerwań Koniec
Na końcówkę przerwań może przychodzić sygnał, który jest sumą logiczną sygnałów przerwań pochodzących z wielu źródeł. Powstaje problem rozpoznania z jakich źródeł pochodzi dany sygnał przerwania i jeśli tych źródeł jest wiele na raz, powstaje dalszy problemsygnał z którego źródła obsłużyć, gdyż procesor może obsługiwać tylko jedno przerwanie w danej chwili. Problemami tymi zajmują się tzw. kontrolery obsługi przerwań (ang. interupt controllers), o których będzie mowa w wykładzie dotyczącym kontrolerów układów wejścia/ wyjścia. Obsługa przerwań może być zorganizowana z jednym lub wieloma poziomami priorytetów przerwań pochodzących z różnych źródeł. Kontrolery obsługi przerwań dostarczają do komputera oprócz sumarycznego sygnału przerwania, również kod identyfikacyjny przerwania o najwyższym priorytecie.
Przy jednym poziomie priorytetu, programy obsługi przerwań nie są przerywalne przez następne przychodzące przerwania. Przy obsłudze przerwań z wieloma priorytetami, przerwania o wyższym priorytecie przerywają obsługę przerwań o niższym priorytecie, na zasadzie zagnieżdżonego wywoływania podprogramów obsługi z użyciem stosu na zapis stanów przerywanych programów.
Zasada obsługi przerwań z jednym poziomem priorytetu Priorytet 2 Przerwanie 1 Przerwanie 2 Przerwanie 3 1 Obsługa przerwania 1 Obsługa przerwania 2 Obsługa przerwania 3 0 Priorytet przerwania 3 = priorytet przerwania 2 = priorytet przerwania 1 czas
Zasada obsługi przerwań z wieloma poziomami priorytetów. Priorytet 7 Przerwanie 1 Przerwanie 2 Przerwanie 3 Przerwanie 4 Priorytet przerwania 4 > priorytet przerwania 2 > > priorytet przerwania 1 > priorytet przerwania 3 6 5 4 3 2 1 0 czas Obsługa przerwania 1 Obsługa przerwania 4 Obsługa przerwania 2 Obsługa przerwania 3
Wyjątki (ang. exceptions) są swego rodzaju przerwaniami wewnętrznymi komputera, które są wywoływane bądź przez specjalne rozkazy wewnętrzne bądź przez wyjątkowe sytuacje zagrażające integralności systemu, jakie mogą pojawiać się przy wykonywaniu programów. Wyjątki są obsługiwane podobnie jak przerwania przychodzące na końcówkę przerwań niemaskowalnych.
Budowa układu sterowania komputera Zadaniem układu sterowania (układu sterującego) komputera (ang. control unit) jest pobieranie rozkazów programu z pamięci operacyjnej do rejestru rozkazów komputera i generowanie na podstawie kodu operacyjnego rozkazów sygnałów sterujących wykonaniem rozkazów. Sygnały te są rozsyłane do wszystkich bloków komputera, które biorą udział w wykonaniu rozkazu. W komputerach występują dwa typy układów sterowania: sprzętowe (układowe) układy sterowania (ang. hardwired control units) mikroprogramowane układy sterowania (ang. microprogrammable control units).
Schemat sprzętowego układu sterowania komputera Rejestr rozkazów Część operacyjna Część adresowa Sygnał prostokątny z zegara kwarcowego Dekoder rozkazów Układ taktujący Generator następnego stanu ster. Matryca sygnałów sterujących Sygnały sterujące dla układów wykonawczych Flagi i zmienne Sygnały zewnętrzne
Nazwa sprzętowy (układowy) układ sterujący pochodzi od tego, że część tego układu generator sygnałów sterujących potrzebnych do wykonania rozkazów, jest zaszyty w sprzęcie (ang. hardwired). Oznacza to, że pożądane sygnały sterujące są wytwarzane przez specjalnie zaprojektowane sprzętowe układy logiczne, w których nie można zmienić sposobu generowania sygnałów bez fizycznej zmiany (przebudowy) ich struktury. Podstawowe dane dla generowania sygnałów sterujących są zawarte w części operacyjnej rozkazu. Część operacyjna jest dekodowana w dekoderze rozkazów. Dekoder rozkazów jest to w ogólności zespół wielu dekoderów dekodujących różne pola części operacyjnej rozkazu. W wyniku zdekodowania rozkazu, zwykle kilka linii wychodzących z dekodera rozkazów uzyskuje aktywną wartość sygnału. Sygnały z tych linii są następnie stale podawane na wejście matrycy generującej sygnały sterujące dla układów wykonawczych komputera. Matryca ta realizuje kombinacje logiczne tych sygnałów z wyjściami matrycy wytwarzającej kolejne stany sterowania i z sygnałami przychodzącymi z zewnątrz komputera, np. sygnałami przerwań. Jest ona zbudowana podobnie do programowalnych układów logicznych.
Sygnały sterujące dla danego rozkazu muszą być wytwarzane zwykle nie w jednej chwili lecz w przeciągu interwału czasowego zawierającego wiele taktów czasowych, który odpowiada cyklowi wykonania danego rozkazu. Ten cykl jest zorganizowany w postaci szeregu stanów, które osiąga układ sterowania. Część sygnałów wyjściowych generowanych przez matryce sygnałów sterujących jest podana zwrotnie na wejście matrycy generatora następnego stanu sterowania. Ta matryca kombinuje te sygnały z sygnałami czasowymi wytwarzanymi w układach taktujących z podstawowego przebiegu zegarowego dostarczanego zwykle w wyniku działania generatora kwarcowego. W momencie dostarczenia nowego rozkazu do układu sterującego, układ ten przebywa w stanie inicjalnym - pobrania nowego rozkazu. Zdekodowanie rozkazu powoduje, poprzez linie sprzężenia zwrotnego, przejście do pierwszego stanu wykonania danego rozkazu, który trwa tak długo jak długo są niezmienione: sygnał taktujący lub inne sygnały wejściowe: flagi i zmienne stanu komputera.
Po zmianie każdego wejść generatora, następuje zmiana stanu sterowania, która powoduje wygenerowanie odpowiedniego wejścia dla matrycy generatora sygnałów sterujących. Pojawienie się sygnału zewnętrznego : np. sygnału przerwania, spowoduje, że następnym stanem sterowania, będzie stan związany z reakcja na ten sygnał zewnętrzny np. przerwanie. Wartości flag i zmiennych stanu komputera powodują wybranie odpowiednich stanów cyklu wykonawczego rozkazu. Ostatnimi stanami w cyklu są stany sterowania wywołujące pobranie następnego rozkazu programu: przesłanie zawartości licznika rozkazów do rejestru buforowego adresu pamięci operacyjnej a następnie odczyt z pamięci do rejestru rozkazów komputera. Gdy wykonywanym rozkazem jest rozkaz stopu, kończący wykonanie programu, układ sterowania zostaje wprowadzony w stan pracy systemu operacyjnego, w którym oczekuje on na następną dyrektywę użytkownika.
Struktury mikroprogramowanych układów sterowania Zasadniczą różnicą w budowie tych układów porównaniu ze sprzętowym układem sterowania jest obecność pamięci sterowania, która służy do przechowywania słów zawierających zakodowane sygnały sterujące, potrzebne dla wykonania rozkazów. W mikroprogramowanym układzie sterowania kolejne rozkazy są pobierane do rejestru rozkazów. Jednak część operacyjna rozkazu nie jest bezpośrednio dekodowana dla celów generacji sygnałów sterujących, lecz stanowi adres początkowy mikroprogramu zawartego w pamięci sterowania.
Działanie mikroprogramowanego układu sterowania z jednopoziomową pamięcią sterowania W wyniku podania kodu z części operacyjnej rozkazu do pamięci sterowania (do jej rejestru adresowego) odczytany jest do rejestru mikrorozkazów pierwszy mikrorozkaz z mikroprogramu, który interpretuje (realizuje poprzez interpretację przez mikrorozkazy) wykonanie tego rozkazu. Mikrorozkaz zawiera w części operacyjnej zakodowane sygnały sterujące, przeważnie w postaci wielu pól bitowych. Część operacyjna podlega dekodowaniu w zespole dekoderów pól mikrorozkazu. Oprócz części operacyjnej, w mikrorozkazie znajduje się adres następnego mikrorozkazu w mikroprogramie interpretującym dany rozkaz oraz pole sterujące układem generacji adresu mikrorozkazu.
Pole sterujące układem generacji adresu określa tryb adresowania (operacje adresowa) do wykonania na adresie pochodzącym z bieżącego mikrorozkazu. Przy mikrorozkazach z warunkowym trybem adresowania następnego mikrorozkazu, adres jest modyfikowany przez wartości bitów z przerzutników warunków (flag), które reprezentują informacje o stanie obliczeń w komputerze. Ostatnim mikrorozkazem mikroprogramu danego rozkazu jest zwykle mikrorozkaz pobrania następnego rozkazu z pamięci operacyjnej do rejestru rozkazów.
Schemat mikroprogramowanego układu sterowania z jednopoziomową pamięcią sterowania Pamięć sterowania (mikroprogramów) Dekoder Rejestr adresu mikrorozkazu Z pamięci operacyjnej Rejestr rozkazów Część operacyjna Adres Część operacyjna Cz.ster. Adres Rejestr mikrorozkazów Dekoder DEK1 DEKp Sygnały sterujące Układy generacji adresu mikrorozkazu Informacje stanu z układów wykonawczych
W układzie sterowania z dwupoziomową pamięć sterowania, oprócz pamięci mikrorozkazów, występuje pamięć tzw. nanorozkazów. W takim układzie sterowania, mikrorozkazy nie zawierają zakodowanych sygnałów sterujących. W miejsce tego, w części operacyjnej mikrorozkazu podany jest adres słowa w pamięci nanorozkazów, które zawiera zakodowane sygnały sterujące. Pamięć nanorozkazów zawiera wszystkie możliwe kombinacje sygnałów sterujących występujące w mikroprogramach interpretujących zbiór wszystkich rozkazów danego komputera, zapisane jednokrotnie w postaci nanorozkazów. W ten sposób unika się wielokrotnego pamiętania tych samych części operacyjnych w mikrorozkazach.
Słowo mikrorozkazu jest w tym przypadku znacznie krótsze niż przy jednopoziomowej pamięci sterowania. Daje to znacznie mniejszą objętość w bitach pamięci mikrorozkazów a w rezultacie znacznie mniejszą objętość całej pamięci sterowania. W pamięci mikrorozkazów zapisane jest sterowanie wybieraniem kolejnych mikrorozkazów, natomiast sygnały sterujące są generowane na podstawie nanorozkazów. W nanorozkazach sygnały sterujące są często zakodowane metodą 1 bit na 1 sygnał, co eliminuje potrzebę dekodowania. Jednakże możliwe jest kodowanie sygnałów w polach wielobitowych, wymagających wprowadzenia dekoderów.
Schemat mikroprogramowanego układu sterowania z dwupoziomową pamięcią sterowania Pamięć mikrorozkazów Dekoder Rejestr adresu mikrorozkazu Z pamięci operacyjnej Rejestr rozkazów Część operacyjna Adres Część operacyjna Cz.ster. Adres Rejestr mikrorozkazów Układy generacji adresu mikrorozkazu Informacje stanu z układów wykonawczych Dekoder Pamięć nanorozkazów Sygnały sterujące zakodowane w słowie nanorozkazu
Mikroprogramowane układy sterujące nie są rzadkością w wykorzystywanych obecnie mikroprocesorach. Mikroprocesory firmy Intel serii x86 (USA), wykorzystywane do budowy komputerów personalnych typu IBM PC, mają układy sterowania z jednopoziomowymi pamięciami sterowania. Mikroprocesory firmy Motorola serii 68xxx (USA), wykorzystywane do budowy komputerów personalnych typu Mackintosh firmy Apple, mają mikroprogramowane układy sterowania z dwupoziomowymi pamięciami sterowania. Mikroprocesory typu RISC firm DECAlpha, Hewlett-Packard, SUN mają sprzętowe układy sterowania.
Zarys historii komputera elektronicznego 1935 1936-1942 1937-1940 1937-1944 J. Atanasoff, (pochodzenia bułgarskiego), Uniwersytet Iowa, USA, projekt komputera binarnego, częściowo elektronicznego o architekturze zbliżonej do architektury von Neumana, komputer ABC (1942) nie zrealizowany do końca fizycznie. K. Zuse, Niemcy, komputery Z1, Z2, Z3, budowa mechaniczno-elektryczno - przekaźnikowa, arytmetyka binarna, Z3 sterowany taśmą perforowaną, 8 bitowe instrukcje. B. Williams, firma Bell Telephone, USA, komputery zbudowane na przekaźnikach. H. Aiken, Uniwersytet Harvard, USA, komputer Mark I (ASCC), automatyczny kalkulator, z
pamięcią danych na przekaźnikach i pamięcią rozkazów programu na kartach perforowanych. 1938-1947 1943-1946 1948 1945-1952 J. Ragazzini, R,. Randall, F. Russel, USA, komputer analogowy. J. Mauchly, J.P. Eckert, Universytet Pensylvania, USA, komputer ENIAC, pierwszy komputer na lampach elektronicznych, stały program programowany przewodami i przełącznikami, 20 rejestrów. J. Mauchly, J.P. Eckert, Universytet Pensylvania, USA, komputer programowany tablicami - przewody + przełączniki, pamięć 312 słów 12 cyfrowych. J. von Neuman, (pochodzenia węgierskiego), Uniwersytet Pensylvania, USA, komputer EDVAC, komputer na lampach elektronicznych, pamiętany wymienialny program w pamięci operacyjnej, pamięć na rtęciowej linii
opóźniającej, następnie komputer IAS. 1946-1949 1946-1955 1946-1951 1947-1951 1946-1952 M. Wilkes, Uniwersytet Cambridge, Anglia, komputer EDSAC, elektroniczny z pamięcią rtęciową, następnie komputer BINAC, USA, z pamięcią rtęciową. A. Turing, Uniwersytet Cambridge, Anglia, komputer ACE, elektroniczny z pamięcią rtęciową. J. Eckert, J. Mauchly, firma i komputery rynkowe UNIVAC, wzorowane na ENIAC F. Williams, komputer z pamięcią na lampie kineskopowej. J von Neuman, Uniwersytet Princeton, USA, model komputera ORDVAC z pamięcią na lampie kineskopowej Williamsa. 1947-1951 MIT, Politechnika Massachussets, USA,
komputer WHIRLWIND I, z pamięcią na lampie kineskopowej. 1948-1954 1957 1957 1960 1965 Sperry RAND, CALDIC, USA, komputery z magnetyczną pamięcią bębnową. NCR, RCA, USA, pierwsze komputery tranzystorowe. DEC, USA, pierwszy minikomputer tranzystorowy PDP-1. IBM, USA, komputery tranzystorowe 7090 (7094), z magnetyczną pamięcią rdzeniową RAM i centralnym przełączaniu dostępu kanałów zewnętrznych do procesora. IBM, USA, pierwszy komputer serii IBM System 360, architektura oparta na centralnym przełączaniu kanałów. 1965 DEC, USA, minikomputer PDP-8 ze strukturą
modularną opartą na centralnej magistrali systemowej, pamięć rdzeniowa. 1971 1972 INTEL, USA, mikroprocesor 4-bitowy Intel 4004. INTEL, USA, mikroprocesory 8-bitowe Intel 8008 i Intel 8080. 1975 1978 1980 DEC, USA, mikrokomputer PDP-8/A z pamięcią półprzewodnikową i procesorem zmiennoprzecinkowym. INTEL, USA, mikroprocesory 16-bitowe Intel 8086. Berkeley University, Kalifornia, USA, komputery RISC I i II. 1981 Stanford University, Kalifornia, USA, komputer
typu RISC Stanford MIPS. 1981 1983 1983 1985 1985 1989 IBM, USA, komputer personalny IBM PC XT, (Intel 8086 16-bitowy). MIT, USA, komputer sterowany przepływem danych MIT Static Data Flow. INTEL, USA, mikroprocesor 16-bitowy Intel 80286, stosowany w komputerach personalnych IBM PC AT. INMOS, Anglia, pierwsze procesory transputerowe T414, potem T800. INTEL, USA, mikroprocesory 32-bitowe Intel 80386, zewnętrzna pamięć cache i koprocesor zmiennoprzecinkowy. INTEL, USA, mikroprocesory 32-bitowe Intel 80486, wbudowana pamięć cache i wewnętrzna jednostka zmiennoprzecinkowa, przetwarzanie
potokowe. 1992 1992 1993 1993 1995 DEC, USA, początek rodziny 64-bitowych mikroprocesorów DECAlpha, model DECAlpha 21064. Hewlett-Packard, USA, początek rodziny mikroprocesorów PA-RISC, 32-bitowe INTEL, USA, mikroprocesory 32-bitowe Intel Pentium, przetwarzanie superskalarne i potokowe. IBM/Motorola/Apple, USA, początek rodziny mikroprocesorów PowerPC, model PowerPC 601. INTEL, USA, mikroprocesory 32-bitowe Intel Pentium Pro, przetwarzanie superskalarne, konwersja instrukcji CISC na RISC, przetwarzanie out of order.
1998 2000 2001 2002 2002 2003 Japonia, pierwszy mikroprocesor RISC z zegarem 1GHz. IBM, USA, pierwszy procesor dwurdzeniowy (dual core) - IBM Power4. INTEL, USA, mikroprocesory 64-bitowe IA-64 Itanium, architektura EPIC, format instrukcji typu VLIW. INTEL, USA, pierwsza wewnętrzna pamięć cache trzeciego poziomu (łączna) 3 Mbajty, (rozdzielna L1-16 Kbajtów każda, wbudowana łączna L2 256 Kbajtów ) Itanium 2. INTEL, USA, mikroprocesor Pentium 4 z zegarem 2,8 GHz. AMD, mikroprocesory 64-bitowe Athlon 64 FX z zegarem 2,2 GHz
2003 2005 2005 2006 2007 INTEL, USA, mikroprocesor Pentium 4 z architekturą Hyper Threading z zegarem 3,06 GHz INTEL, USA, mikroprocesor dwurdzeniowy Intel Pentium Extreme Edition 840 z zegarem 3,2 GHz AMD, USA, mikroprocesor dwurdzeniowy Athlon 64 X2 4800+, z zegarem 2,4 GHz AMD, USA, 64-bitowy mikroprocesor dwurdzeniowy Opteron Dual Core. INTEL, USA, mikroprocesor czterordzeniowy Intel Core 2 Extreme Quad-Core z zegarem 2,8 GHz SUN, USA, 8-rdzeniowy procesor Niagara 2 (UltraSPARC T2) z zegarem do 1,4 GHz, 64 wątki, technologia 65 nm.
2008 2008 2009 2010 2010 AMD, USA, 4-rdzeniowy procesor Phenom X4 z zegarem do 2,6 GHz, technologia 65 nm. Procesory 3-rdzeniowe Phenom X3. Intel, USA, 4-rdzeniowy procesor Intel Core i7 z zegarem do 3,2 GHz, pamięci podręczne L1, L2, zintegrowana pamięć podręczna L3-8MB, kontroler pamięci w układzie procesora. Tilera, USA, rodzina 16-100 rdzeniowych procesorów TILE Gx stanowiących macierze 64-bitowych procesorów z lokalnymi pamięciami L1, L2, L3, zegar do 1,5 GHz. Procesory 6-rdzeniowe Intel Core i7 980X oraz AMD Phenom II X6, z lokalnymi pamięciami podręcznymi L1, L2, L3. Oracle, USA, (dawniej SUN Microsystems), procesor SPARC T3 (Niagara-3), 16 rdzeni z 8 wątkami SMT na rdzeń, 1.67 GHz.
2011 AMD, USA, 8-rdzeniowe procesory serii Buldozer - AMD FX 81xx.