Zestaw-A.
Podstawy systemów komputerowych, architektura komputerów.
1. Maszyna von Neumanna: Ogólna idea maszyny liczącej wg koncepcji von Neumanna.
Podstawowy format rozkazu maszynowego.
Maszyna von Neu manna
Proces programowania mógłby być ułatwiony, jeśliby program mógł być reprezentowany w formie odpowiedniej do przechowywania w pamięci razem z danymi. Komputer pobierałby wtedy rozkazy przez odczytywanie ich z pamięci, a program mógłby być instalowany lub zmieniany przez
zmianę zawartości części pamięci.
Idea ta, znana jako koncepcja przechowywanego programu, jest zwykle przypisywana projektantom ENIAC-a, głównie zaś matematykowi Johnowi von Neumannowi, który był konsultantem w tym przedsięwzięciu. Po raz pierwszy idea ta została opublikowana w roku 1945 w propozycji von Neumanna opracowania nowego komputera pod nazwą EDVAC (skrót od ang. ElectronicDiscrete Yariable Computer).W roku 1946 von Neumann i jego koledzy rozpoczęli projektowanie nowego komputera wykorzystującego program przechowywany w pamięci. Miało to miejsce w Princeton Institute for Advanced Studies, a komputer określono skrótem IAS. Komputer IAS, chociaż nie został ukończony do roku 1952, był prototypem wszystkich następnych komputerów o ogólnym przeznaczeniu.
a)Pamięć główna, w której są przechowywane zarówno dane, jak i rozkazy(zapis-odczyt). Zawartość pamięci może być adresowana przez wskazanie miejsca bez względu na rodzaj zawartych tam danych.
b)Jednostka arytmetyczno-logiczna (ALU) mogąca wykonywać działania danych binarnych,
c) Jednostka sterująca, która interpretuje rozkazy z pamięci i powoduje i wykonanie. Wykonywanie rozkazów następuje rozkaz po rozkazie czyli w sposób szeregowy.
d) Urządzenia wejścia-wyjścia, których pracą kieruje jednostka sterująca.
-----------------------
Rozkazy maszynowe operują na danych. Najważniejsze, ogólne kateorie danych to; adresy,
a liczby, znaki ,dane logiczne.
Działanie procesora jest określone przez rozkazy, które on wykonuje. Rozkazy te nazywamy rozkazami
maszynowymi. Zbiór różnych rozkazów wykonywanych przez procesor nazywa się listami rozkazów. Każdy
rozkaz musi zawierać informacje wymagane przez procesor do jego wykonania, elementy rozkazu
maszynowego:
a) Kod operacji, Określa operację, jaka ma być przeprowadzona (np, ADD,I/O), Operacja jest precyzowana za pomocą kodu binarnego - kodu Operacji.
b) Odniesienie do argumentów źródłowych, Operacja może obejmować jeden lub wiele argumentów źródłowych; są one danymi wejściowymi operacji.
c ) Odniesienie do wyniku, Operacja może prowadzić do powstania wyniku
d) Odniesienie do następnego rozkazu, Mówi ono procesorowi, skąd ma on pobrać następny rozkaz po zakończeniu wykonywania bieżącego rozkazu.
2. System przerwań: Metody obsługi zdarzeń w urządzeniach wejścia/wyjścia. Pojęcie i rola
systemu przerwań. Współdziałanie sprzętu i oprogramowania przy obsłudze przerwań.
Metody obsługi zadarzeń w I/O:
a)DMA- w tym trybie moduł I/O i pamięć główna wymieniają dane bezpośrednio bez angażowania procesora.
b)I/O sterowane przerwaniami.
---------
Pojęcie:
Praktycznie we wszystkich komputerach przewidziano mechanizm, za pomocą którego inne moduły (wejście-wyjście, pamięć) mogą przerwać normalne przetwarzanie danych przez procesor. W tabeli poniżej są wymienione najczęściej występujące klasy przerwań.
Programowe |
Generowane przez warunek będący wynikiem wykonywania rozkazu, taki jak przepełnienie arytmetyczne, dzielenie przez zero. próba wykonania niedozwolonego rozkazu oraz odniesienie do przestrzeni pamięci zarezerwowanej dla użytkownika.
|
Zegarowe |
Generowane przez wewnętrzny zegar procesora; umożliwiające wykonanie pewnych funkcji przez system operacyjny |
I/O |
Generowane przez sterownik wejścia-wyjścia w celu zasygnalizowania normalnego zakończenia operacji lub w celu zasygnalizowania różnych warunków błędu. |
Uszkodzenie sprzętu |
Generowane przez uszkodzenie, takie jak defekt zasilania lub błąd parzystości pamięci |
Rola:
Przerwania były pierwotnie przewidywane jako sposób poprawiania efektywności przetwarzania. Na przykład wiele urządzeń zewnętrznych jest o wiele wolniejszych od procesora. Załóżmy, że procesor przenosi dane do drukarki, stosując schemat cyklu rozkazu przedstawiony wyżej. Po każdej operacji zapisu procesor musi pozostawać bezczynny, aż drukarka za nim nadąży. Długość lej pauzy może wy nosie setki lub nawet tysiące cykli rozkazu, które nie angażują pamięci, Jest to oczywiście bardzo rozrzutne wykorzystanie procesora.
Za pomocą przerwań procesor może byc zaangażowany w wykonywanie innych rozkazów, podczas gdy ma miejsce operacja wejścia-wyjścia.
Współdziałanie sprzętu i oprogramowania:
3. Cykl rozkazowy procesora. Pojęcie cyklu rozkazowego; opis faz cyklu rozkazowego,
opcjonalne fazy cyklu. Różnica pomiędzy cyklami rozkazowymi procesorów
nieposiadających i posiadających systemu przerwań.
Przetwarzanie wymagane dla pojedynczego rozkazu jest nazywane cyklem rozkazu ,składa się on z etapu
pobrania i wykonywania (wykonywanie przerwane jest wyłączeniem komputera, błędem krytycznym lub
rozkazem stop).
-------------------------
Fazy Cyklu Rozkazu.
a)Obliczanie adresu rozkaw (iac). Określenie adresu następnego rozkazu przeznaczonego do wykonania. Zwykle polega to na dodaniu ustalonej liczby do adresu poprzedniego rozkazu. Jeśli na przykład każdy rozkaz zawiera 16 bitów, a organizacja pamięci przewiduje słowa 16-bitowe, to dodaje się 1 do poprzedniego adresu. Jeśli w pamięci przewidziano adresowanie 8 bitowych bajtów, to dodaje się 2 do poprzedniego adresu.
b)pobieranie rozkazu(if).Wczytanie rozkazu z pamięci do procesora.
c) Dekodowanie operacji rozkazu (iod). Analizowanie rozkazu w celu określenia rodzaju operacji, która ma być przeprowadzona, oraz argumentu (argumentów).
d) Obliczanie adresu argumentu (oac). Określanie adresu argumentu, jeśli operacja odnosi się do argumentu znajdującego się w pamięci lub dostępnego przez wejście-wyjście,
e) Pobieranie argumentu {oj}. Pobranie argumentu z pamięci lub z wejścia-wyjścia,
f) Operacja na danych (do). Przeprowadzenie operacji wskazanej w rozkazie,
g) Przechowanie argumentu (os), Zapisanie wyniku w pamięci lub skierowa-
nie go do wejścia-wyjścia.
---------------
różnice w procesorach z przerwaniami:
4. Reprezentacje liczb stosowane w arytmetyce procesorów. Arytmetyka liczb całkowitych -
operacje dodawania, odejmowania i mnożenia (algorytm Bootha).
Liczby:
Wszystkie języki maszynowe obejmują dane numeryczne. Nawet w przypadku przetwarzania danych nienumerycznych potrzebne są liczby występujące w licznikach określające szerokości pól itd. Ważną różnicą między liczbami używanymi w zwykłej matematyce a liczbami przechowywanymi w komputerze jest to, że te ostatnie są ograniczone. Jest to prawda w podwójnym sensie. Po pierwsze, istnieje granica wielkości liczb reprezentowalnych w komputerze, a po drugie, w przypadku liczb zmiennopozycyjnych, granica ich dokładności. Programista powinien więc znać konsekwencje zaokrąglania, przepełnienia i niedomiaru.
W komputerach są powszechne trzy rodzaje danych numerycznych:
Q całkowite lub stałopozycyjne,
Q zmiennopozycyjne,
a dziesiętne.
Dwa pierwsze rodzaje przeanalizujemy poniżej dość szczegółowo .Pozostaje więc powiedzieć kilka słów o liczbach dziesiętnych.
Chociaż wszystkie wewnętrzne operacje komputera są z natury binarne, użytkownicy systemu operują liczbami dziesiętnymi. Istnieje więc konieczność konwersji liczb dziesiętnych na binarne na wejściu oraz binarnych na dziesiętne na wyjściu. W przypadku zastosowań, w których występuje wiele operacji wejścia-wyjścia oraz raczej mało stosunkowo prostych obliczeń, wygodniej jest przechowywać i przetwarzać liczby w postaci dziesiętnej. Najbardziej powszechną reprezentacją służącą do tego celu są upakowane liczby dziesiętne.
W przypadku upakowanych liczb dziesiętnych każda cyfra dziesiętna jest reprezentowana w kodzie 4-bitowym, tworzonym w oczywisty sposób. Wobec tego O = 0000, l = 0001, ... , 8=1000 i 9 = 1001. Zauważmy, że jest to kod raczej nieefektywny, ponieważ używa tylko 10 spośród możliwych 16 wartości 4-bitowych. W celu utworzenia liczb 4-bitowe kody są zestawiane szeregowo, zwykle w wielokrotnościach 8 bitów. Kodem 246 jest więc 0000001001000110. Kod ten jest oczywiście mniej zwarty niż prosta reprezentacja binarna, jednak
pozwala uniknąć konwersji. Liczby ujemne mogą być reprezentowane przez dołączenie 4-bitowej cyfry znaku albo z lewej, albo z prawej strony ciągu upa kowanych cyfr dziesiętnych. Na przykład kod 1111 może reprezentować znak minus.
REPREZENTACJA LICZB CAŁKOWITYCH
W systemie binarnym (patrz dodatek 8A) dowolne liczby mogą być reprezentowane po prostu za pomocą cyfr O i l, znaku minus oraz przecinka. Dla celów przechowywania i przetwarzania w komputerze nie dysponujemy jednakże znakami minus i przecinka. Tylko cyfry binarne (O i l) mogą służyć do reprezentowania liczb. Gdybyśmy używali wyłącznie nieujemnych liczb całkowitych, reprezentacja byłaby prosta. Słowo 8-bitowe mogłoby reprezentować liczby od O do 255. Na przykład: 00000000=0,11111111=255,00101001=41.
Reprezentacja znak-moduł
Używanie liczb całkowitych bez znaku jest niewystarczające w wielu przypadkach; na przykład wtedy, kiedy wymagane jest reprezentowanie również liczb ujemnych. Istnieje kilka konwencji, które można zastosować. Wszystkie z nich polegają na traktowaniu najbardziej znaczącego (położonego po lewej stronie) bitu słowa jako bitu znaku: jeśli ten bit jest równy O, to liczba jest dodatnia, a jeśli l -ujemna. Najprostszą formą reprezentacji, w której jest używany bit znaku, Jest reprezentacja znak-moduł. W słowie n - bitowym n - l bitów znajdujących się po prawej stronie określa moduł liczby całkowitej. Na przykład:
+18=00010010
-18=10010010 (znak-moduł)
Reprezentacja uzupełnienia do dwóch1
Reprezentacja uzupełnienia do dwóch została opracowana w celu wyeliminowania głównych niedogodności reprezentacji znak-moduł: nieefektywnego dodawania i odejmowania oraz dwóch reprezentacji zera..
Podobnie jak w notacji znak-moduł, w reprezentacji uzupełnienia do dwóch uzywa się najbardziej znaczącego bitu jako bitu znaku, co ułatwia sprawdzanie, czy liczba całkowita jest dodatnia, czy ujemna. Natomiast różni się ona od reprezentacji znak-moduł sposobem interpretowania pozostałych bitów. Reprezentację uzupełnienia do dwóch można najlepiej zrozumieć, definiując ją za pomocą ważonej sumy bitów, jak to czyniliśmy powyżej w przypadku re prezentacji bezznakowej i znak-moduł. Rozważmy n-bitową liczba całkowitą A wyrażoną za pomocą uzupełnienia do dwóch. Jeśli A jeśli dodatnia, to bit znaku a„-1 ma wartość 0. Pozostałe bity reprezentują moduł liczby w ten sam sposób jak w przypadku notacji znak-moduł:
Konwersja między różnymi długościami bitowymi
Jest czasem pożądane przechowanie liczby n-bitowej w postaci m bitów, gdzie m > n. W przypadku notacji znak-moduł można tego dokonać z łatwością : prostu trzeba przesunąć bit znaku do najdalszej lewej pozycji oraz wypełnic pozostałe wolne pozycje zerami. Na przykład:
+18= 00010010 (znak-moduł, 8 bitów)
+18= 0000000000010010 (znak-moduł, 16 bitów)
-18= 10010010 (znak-moduł, 8 bitów)
-18= 1000000000010010 (znak-moduł, 16 bitów)
Procedura taka nie działa w przypadku całkowitych liczb ujemnych w reprezentacji uzupełnienia do dwóch. Postępując jak w powyższym przykładzie otrzymamy:
+18= 00010010 (uzupełnienie do dwóch, 8 bitów)
+18= 0000000000010010 (uzupełnienie do dwóch, 16 bitów i
-18= 11101110 (uzupełnienie do dwóch, 8 bitów)
-3 2 65 8 = 1000000001101110 (uzupełnienie do dwóch, 16 bitów i
Zamiast tego, w przypadku uzupełnienia do dwóch stosuje się następującą regułę: wykonuje się przesunięcie bitu znaku do najdalszej lewej pozycji, po czym wypełnia się powstałe puste pozycje kopiami bitu znaku. W przypadku
liczb dodatnich wypełnia się zerami, w przypadku ujemnych - jedynkami my więc:
-18= 11101110 (uzupełnienie do dwóch, 8 bitów)
-18= 1111111111101110 (uzupełnienie do dwóch, 16 bitów)
Dodawanie Odejmowanie
Dodawanie w notacji uzupełniania do dwóch jest pokazane na rys.Pierwsze cztery przykłady ilustrują operacje udane. Jeśli wynik operacji jest dodatni, to otrzymujemy dodatnią liczbę w zwykłej notacji binarnej. Jeśli wynikoperacji jest ujemny, to otrzymujemy liczbę ujemną w reprezentacji uzupełnienia do dwóch. Zauważmy, że w pewnych przypadkach poza końcem słowa występuje bit przeniesienia. Jest on ignorowany.
Przy dodawaniu wynik może być większy, niż można zmieścić w ramach przyjętej długości słowa. Warunek ten jest nazywany przepełnieniem. Gdy występuje przepełnienie, ALU musi sygnalizować ten fakt, nie są więc podejmowane próby wykorzystania wyniku. W celu wykrywania przepełnienia stonowana jest następująca reguła:
Regula przepełnienia
Jeśli są dodawane dwie liczby dodatnie lub dwie ujemne, to przepełnienie
następuje wtedy i tylko wtedy, gdy wynik ma znak przeciwny.
Odejmowanie jest również łatwe; wykonuje się je, wykorzystując następującą regułę:
Reguła odejmowania
W celu odjęcia od jednej liczby (odjemnej) drugiej liczby (odjemnika) iuzupełnienie do dwóch odjemnika i dodaj je do odjemnej.Odejmowanie jest więc realizowane poprzez dodawanie.
Np.(-7)+(+5)= 1001 (-4)+(+4)= 1100 (-5)-(2)=1011 (5)-(-2)=0101
0101 0100 1110 0010
------ ------ ----- ------
1110=-2 0000=0 1001=-7 0111=7
Mnożenie, algorytm Bootha.
W porównaniu z dodawaniem i odejmowaniem mnożenie jest operacją złożoną niezależnie od tego. czy Jest realizowane sprzętowo, czy przez oprogramowanie. W różnych komputerach wykorzystywano wiele różnych algorytmów. Tekst tego punktu ma służyć czytelnikowi jako podstawa do wyrobienia sobie poglądu
na temat zwykle stosowanego podejścia.
Rozpoczniemy od prostego problemu mnożenia dwóch bezznakowych (nie-
ujemnych) liczb całkowitych.,
1011 Mnożna (11)
xll0l Mnożnik(13
101l
0000 iloczyny cząstkowe
1011
+101l
10001111 iloczyn (143)
Mnożnik nie może więc być używany bezpośrednio w sposób opisany wyżej. Istnieje wiele sposobów rozwiązania tego problemu. Jeden z nich polega na przekształceniu mnożnej i mnożnika na liczby dodatnie, przeprowadzeniu mnożenia i utworzeniu reprezentacji wyniku w postaci uzupełnienia do dwóch wtedy
i tylko wtedy, gdy znaki dwóch liczb oryginalnych różniły się. Projektanci wolą jednak stosować metody, które nie wymagają tej ostatniej transformacji. Jedną z najpowszechniejszych jest algorytm Bootha [BOOT51]. Algorytm ten ma także tę zaletę, że przyspiesza proces mnożenia w porównaniu z prostszymi
rozwiązaniami.Algorytm Bootha przedstawiony na rys: można opisać następująco, Jak poprzednio, mnożnik i mnożna są umieszczane odpowiednio w rejestrach Q i M. Istnieje także rejestr l-bitowy, umieszczony logicznie na prawo od
najmniej znaczącego bitu (Qo) rejestru Q i oznaczony Q-1; jego zastosowanie wyjaśnimy wkrótce. Wyniki mnożenia będą się pojawiały w rejestrach A i Q Rejestry A i q-1 są początkowo ustawiane na 0. Jak poprzednio, układy logiczne sterowania przeglądają mnożnik bit po bicie. Podczas badania każdego bitu ba-
dany jest również bit znajdujący się z jego prawej strony. Jeśli oba bity są takie same (1-1 lub 0-0). to wsz.ystkie bity rejestrów A, Q i Q-1 są przesuwane prawo o jeden bit. Jeśli te dwa bity różnią się, to mnożna jest dodawana lub odejmowana od zawartości rejestru A, zależnie od tego, czy bity te są 0-1, czy 1-0. Po dodawaniu lub odejmowaniu następuje przesunięcie w prawo. W każdym przypadku przesunięcie w prawo jest takie, że najdalej na lewo położony bit A, tzn. An-1, nie tylko jest przesuwany do An-2, ale także pozostaje w An-1. Jest
to wymagane dla zachowania znaku liczby w A i Q. Jest to określane jako przesunięcie arytmetyczne, ponieważ jest zachowywany bit znaku .Na rysunku powyżej widać sekwencję zdarzeń w algorytmie Bootha w przypadku ku mnożenia 7 przez 3. W sposób bardziej skondensowany ta sama operacja poniżej (rys-a):
5. Przetwarzanie potokowe i jego wpływ na zwiększenia szybkości działania Jednostki
centralnej komputera.
W miarę rozwoju systemów komputerowych możliwe stało się osiąganie większej wydajności poprzez wykorzystywanie udoskonaleń technologicznych, takich jak szybsze układy. Ponadto, wydajność może być zwiększana przez lepszą organizację procesora. Widzieliśmy już tego przykłady, takie jak stosowanie
wielu rejestrów zamiast pojedynczego akumulatora oraz użycie pamięci podręcznej. Innym rozwiązaniem organizacyjnym, obecnie powszechnym, jest potokowe przetwarzanie rozkazów.
Strategia przetwarzania potokowego
Przetwarzanie potokowe rozkazów jest podobne do użycia linii montażowej w zakładzie produkcyjnym, Dzięki zorganizowaniu procesu produkcyjnego w formie linii montażowej, możliwa jest jednoczesna praca nad wyrobami w różnych stadiach produkcji. Proces ten nazwano przetwarzaniem potokowym, ponieważ, tak jak w potoku, na jednym końcu są przyjmowane nowe elementy wejściowe, zanim jeszcze elementy poprzednio przyjęte ukażą się na wyjściu. W celu zastosowania tej koncepcji do wykonywania rozkazów musimy zauważyć, że w rzeczywistości wykonywanie rozkazów ma wiele etapów. Na przykład cykl rozkazu został podzielony na 10 kolejno realizowanych zadań. Jest oczywiste, że istnieją tu warunki umożliwiające zastosowanie przetwarzania potokowego. Rozpatrzmy najpierw prosty podział przetwarzania rozkazu na dwa etapy:
pobranie rozkazu i wykonanie rozkazu. Występują 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. Rozwiązanie to jest przedstawione na rys. 11.1 la. 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 zbuforowanego 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. instruction prefetch) lub pobieraniem na zakładka (ang. fetch overlap}.
Powinno być jasne, że ten proces przyspiesza wykonywanie rozkazów. Jeśli etapy pobierania i wykonywania zajmowałyby tyle samo czasu, czas cyklu rozkazu zmniejszyłby się do połowy. Jeśli jednak przyjrzymy się bliżej przetwarzaniu potokowemu (rys. 11.11 b), to zobaczymy, że z dwóch powodów to podwojenie szybkości wykonywania nie jest prawdopodobne:
1. 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.
2. 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.
Strata czasu z tego drugiego powodu może być zmniejszona przez zgadywanie. Prosta reguła jest następująca. Gdy rozkaz rozgałęzienia warunkowego przechodzi z etapu pobierania do etapu wykonywania, na etapie pobierania następuje pobranie następnego rozkazu z pamięci po rozkazie rozgałęzienia. Wtedy, jeśli nie nastąpi rozgałęzienie, czas nie jest stracony. Gdy rozgałęzienie na-
stąpi, pobrany rozkaz musi być usunięty, a pobrany nowy.
Chociaż powyższe czynniki powodują zmniejszenia potencjalnej efektywności 2-etapowego potoku, pewne przyspieszenie jednak następuje. Aby uzyskać większe przyspieszenie, potok musi być przetwarzany na większej liczbie etapów. Rozważmy następującą dekompozycję przetwarzania rozkazu:
* 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.Dla celów dyskusji przyjmijmy, że czasy te są równe. Przy takim założeniu, jak pokazano na rys. 11.12, stosując 6-etapowy potok zmniejsza się czas wykonywania 9 rozkazów z 54 jednostek czasu do 14.
6. Podstawowe różnice w architekturze procesorów typu RISC i CISC.
7. Organizacja (przyczyny i konsekwencje) stosowania we współczesnych procesorach
pamięci typu cache.