Professional Documents
Culture Documents
1.1.1 Komputer
1.1.2 Pamięć
1.1.3 Proces
Plik obiektowy ma logiczne adresy, pozwala dołączyć się do wielu programów, relokowalny
System po uruchomieniu pliku: przydziela procesowi pamięć operacyjną; wypełnia tą pamięć
instrukcjami i danymi z pliku; na etapie ładowania ładuje biblioteki (dzielona pamięć);
rozpoczyna wykonywanie z kontrolą stanu i reakcji na błędy
Każdy rozkaz to: identyfikacja danych (adresowanie); wykonanie działania (kopiowanie,
zmiana formatu, konwersja kodu, działania logiczne i arytmetyczne); sterowanie
rozgałęzieniami
Algorytm + dane (łańcuchy, umowy ASCII, interpretacje własne)
Lista rozkazów; tryby adresowania; rejestry; typy danych; sposób reagowania na wyjątki i
przerwania
Lista rozkazów zewnętrzny język procesora tłumaczony wewnątrz procesora na optymalny
ciąg mikrooperacji
Tryby adresowania INTEL
o Natychmiastowe – wartość argumentu jest w kodzie instrukcji, opcode+wartość
o Rejestrowe – bezpośrednie i pośrednie, podaje się nazwę rejestru
o Porty we/wy
o Bezpośrednie – liczba będąca adresem operandu (miejscem w pamięci)
o Pośrednie – w kodzie jest zawarta informacja na temat jak obliczyć adres
Fazy
https://sourceware.org/binutils/docs/as/i386_002dMemory.html#i386_002dMemory
Post lub pre -inkrementacja – aktualizowanie adresu bazowego po lub przed odwołaniem do
pamięci; przydatne do operacji na tablicach i przetwarzania sygnałów
Dane w pamięci mogą mieć różny rozmiar x*8 oraz typ (NB, U2, float, double) oraz ilość na
raz (wektory np. 16*8 na raz)
BIG Endian – od najbardziej znaczącej do najmniej; Little Endian – najmniejsza część jest
umieszczana najpierw
Wyrównywanie – gdy najmniej znaczący bajt jest w komórce o numerze podzielnym przez
długość wektora to pobieranie danych jest szybsze
1.3.1 Instrukcje
1.3.2 Procedury
Loop – zmniejsza %ecx i skacze jeśli nie jest 0; trzeba zmniejszyć %ecx o jeden żeby wykonać
tyle instrukcji ile wartość %ecx; skakać można tylko w niewielkim zakresie +- 128 bajtów
Switch skacze do etykiety którą oblicza się za pomocą operacji logicznych, wartość
porównywana musi mieć mały zakres przewidywanych wartości
1.3.3 Stos
W Intelu stos rośnie w dół; zaczyna się od wysokiego adresu, stos jest na końcu programu,
dane dynamiczne (sterta) są alokowane od początku
Wskaźnik stosu wskazuje na ostatni element (nie na pierwsze wolne miejsce)
Push zmniejsza wskaźnik stosu po czym zapisuje element
Dane na stosie muszą być wyrównane do 32 bitów
1.4 Funkcje
przez funkcję; adres powrotu jest odkładany na szczyt stosu przez call, później na stos jest
wkładana wartość ebp z poprzednią wartością stosu; zmienne lokalne są na kolejnych
miejscach stosu
Funkcje mogą korzystać z parametrów globalnych, lecz są wtedy jednowejściowe, co
pogarsza wywoływanie równoległe kilku instancji oraz wywoływanie rekurencyjne
W średnich przypadkach często szybkość działania programu nie jest zależna od szybkości
procesora lecz od szybkości magistrali między procesorem a pamięcią główną DDR RAM
Pamięć o dostępie swobodnym RAM, bardzo szybka i wygodna ale zbyt droga
SAM – sekwencyjna, zawiera duże opóźnienia
CAM – skojarzeniowa, wyszukuje za pomocą wzorca
SRAM – static RAM – korzysta z półprzewodników, 1 bit potrzebuje 6 tranzystorów;
problemem jest skok poboru mocy oraz małe pojemności
DRAM – dynamic RAM – korzysta z kondensatorów i jednego tranzystora, mały rozmiar
układu, ale ładunek upływa z kondensatora wraz z upływem czasu; wymaga odświeżania co
kilkanaście kilkadziesiąt milisekund (doładować jedynki, rozładować 0); odświeżenie polega
na ponownym zapisaniu tych samych danych
1.5.2 DDR4
grupy banków, banki są podzielone na wiersze i kolumny, na magistralę podaje się najpierw
wiersz, później kolumnę, zwracane jest zawsze 32 bity, kilka układów scalonych pozwala na
zwracanie 64 bitów
jeśli zakres żądanych danych jest mniejszy niż 8 kB to można czytać i pisać z jednego wiersza
co przyspiesza działanie gdyż pozwala uniknąć czasu przeładowania; korzystanie z dalszych
zakresów wymaga przeładowania banku;
występuje zawsze opóźnienie między podaniem kolumny a otrzymaniem danych, ale można
podać kilka numerów kolumn i uzyskać cały wiersz w jednym żądaniu; aktywacja
Występuje również opóźnienie między podaniem wiersza a podaniem kolumny –
przeładowanie wiersza
Najdłuższe opóźnienie na ogół ma czas aktywacji nowego wiersza
Opóźnienia zależą od banków i grupy banków; łącznie osiąga się 80% efektywnej
przepustowości
Kilka układów na jednej płytce wybiera się za pomocą sygnału Rank, kontroler pamięci
korzysta z jednej magistrali ale wielu sygnałów wyboru rzędu układów, układu itp.
Macierze komórek (wiersze, kolumny) – banki – grupy banków – aktywuj wiersz i kolumnę a
w kilku cyklach wartości zostaną zwrócone – układ scalony DRAM – rzędy Rank (niezależnie
adresowany) – moduł DIMM (1 lub 2 rzędy Rank) – kontroler/kanał pamięci (może być kilka
kanałów i kontrolerów pamięci)
Bardzo duże taktowanie powoduje powstanie dużych sinusoid o długości okresu 30cm, co
powoduje problem przesunięcia ładunku w zależności od długości drutu, dlatego magistrale
są tak tworzone, żeby wszystkie druty miały taką samą długość
Opóźnienie l – czas od wydania polecenia do jego wykonania
Przepustowość t – liczba operacji wykonywanych w jednostce czasu
1.7 Cache
Linie to bloki danych zawierające uporządkowany zbiór słów z kolejnych lokacji w pamięci,
same bloki są nieuporządkowane, ale w jednej linii dane są uporządkowane; identyfikatorem
słów jest jego adres w pamięci
Każda linia zawiera przestrzeń na dane z pamięci; status potrzebny do zarządzania (kilka
bitów); etykieta linii pozwalająca zidentyfikować do jakiego RAMu się odnosi (identyfikuje
fragment bloku RAM)
Dane powinny być tylko w jednej linii na raz na danym poziomie
Istnieje optymalna wielkość linii, która optymalizuje wykorzystanie linii, czas zastępowania
linii, historię pamięci (lokalność tymczasowa) – kilkadziesiąt bajtów; małe linie dobrze
zapewniają lokalność tymczasową; duże linie słabiej przechowują historię i dłużej się
wymieniają; na ogół optymalne są 64 bajty tak samo jak wyjście DDR
Migotanie linii – odwoływanie się do danych, które były przed chwilą, ale zostały usunięte z
cache; należy je ponownie załadować do cache. Przy unieważnianiu linii na których był zapis
należy też zaktualizować ich odpowiedniki w RAM
Całkowicie skojarzeniowe – wolne i kosztowne; linia może zawierać dowolny blok z RAM; dla
każdej linii trzeba sprawdzać czy zawiera szukaną daną – tyle układów porównujących ile linii;
najlepsze wykorzystanie linii ale najdłuższy czas wymieniania linii i najbardziej
skomplikowane przeszukiwanie RAM; nie występuje migotanie; zawsze wymienia się inną
linię niż ostatnia użyta
chybienia i migotanie
Wielodrożna z przeplotem – wiele dróg z odwzorowaniem bezpośrednim
zawierają etykietę bloku; zbiór komórek z pamięci głównej pasuje do kilku linii; zazwyczaj 4
drogi
Wielodrożne bez przeplotu – sąsiednie adresy pasują do jednej drogi
Przyczyny wypełniania:
o Pierwsze odwołanie do pamięci, po włączeniu lub po załadowaniu ogromną ilością
danych
o Zapełnienie całej pamięci, trzeba coś usunąć żeby móc załadować nowe dane
o Konflikt w grupie/drodze cache, trzeba wymienić linie mimo iż inne linie z innych
grup są niewykorzystywane (tylko dla nie całkowicie skojarzeniowych)
o Spójność – inny rdzeń albo DMA zmienił komórkę w międzyczasie
Redukcja chybień
o Optymalizacja rozmiaru linii
o Zwiększanie rozmiaru pamięci cache
o Lepszy efekt skojarzeniowości –
zwiększanie liczby dróg, algorytmy
usuwania linii
o Pamięci wilu poziomów
o Priorytet danych do odczytu – mogą być
częściej używane wielokrotnie; specjalne
dodatkowe instrukcje gwarantują
zakończenie wcześniejszych operacji na
pamięci
o Unikanie translacji adresu wirtuaonego
Opóźnienia pamięci cache wielu poziomów
Organizacje cache
o Organizacja hierarchiczna inkluzywna – w pamięciach niższego poziomu są te same
dane co w wyższych
o Organizacja równoległa nieinkluzywna – w każdym poziomie są inne dane, np. w
wyższym sa dane usunięte z niższego
Sposoby zapisu wymuszające spójność; cel jest taki żeby jak najwięcej danych było
pobieranych i zapisywanych w pamięci cache
o Gdy dana jest w pamięci podręcznej:
Zapis skrośny write through – zapis danych do linii poziomu oraz do
wszystkich wyższych poziomów od razu; możliwe jest zapisywanie do
wyższych tylko od określonego poziomu albo dla określonego poziomu
Zapis lokalny copy-back – zapisujemy tylko do linii pamięci podręcznej a do
wyższych poziomów dopiero później (gdy linia jest zdejmowana)
o Gdy nie ma w pamięci podręcznej
Allocate on write – przed zapisaniem danych wypełnia się linię pamięci
cache, po czym wykonywany jest zapis na RAM skrośny albo lokalny; dane
przesyła się wtedy dwukrotnie – przepustowość zapisu 2x wolniejsza
No allocate on write – wykonuje tylko zapis na RAM, pomija cache; osobne
układy służą tylko do zapisu i do zachowania spójności
Model Mesi/Moesi dla każdej linii sposób zachowania spójności danych; zmienia statusy
linii; na początku linia jest w stanie nieważnym I, jak procesor chybia podczas odczytu z linii
to w trypie skrośnym linia przechodzi do tryby współdzielonego S – wszystkie poziomy mają
te same dane w tej linii; odczyt danych nie wpływa na stan S, zapis w trybie skrośnym nie
zmienia stanu, bo zawsze w linii na każdych poziomie jest ta sama dana; unieważnienie linii
gdy inne urządzenie zapisuje coś do linii – stan I; stan E oznacza że linia zawiera właściwe
dane, ale pozostałe poziomy niekoniecznie – zapis w trybie lokalnym, odczytywanie ze stanu
E nie zmienia stanu, bo po prostu odczytywane są właściwe dane, zapisywanie zmienia stan
na zmodyfikowany M bo dane są lokalnie zmodyfikowane, ale na zewnątrz na innych
poziomach dane pozostają przestarzałe; gdy ktoś z zewnątrz potrzebuje tych danych trzeba
wstrzymać jego odczyt i przesłać najnowsze dane wyżej co zmienia stan na E; stany lokalne
wymagają uaktualniania wyższych poziomów; modyfikacja z zewnątrz zawsze unieważnia
linię – zachowanie to śledzi sterownik pamięci; zapisywanie stanu M wymaga wysyłania tej
linii na zewnątrz do wyższych poziomów przed unieważnieniem, żeby wszystkie bajty w linii
były najnowsze – zapobieganie false cache sharing – dwa procesy kłócą się o tę samą linię
Strategia zapisu jednorazowego – pierwszy zapis jest skrośny a kolejne lokalnie – podobno
zwiększa szybkość
Będąc w trybie współdzielonym S pierwszy zapis jest wykonywany w trybie skrośnym i
zmienia stan na zgodny E, odczyt z tego stanu wymaga przesłania danych do wyższych
poziomów i powrotu do stanu współdzielonego, zapis w trybie zgodnym E daje stan M który
oznacza że linię trzeba wysłać wyżej w przypadku odczytu lub zapisu z zewnątrz; kolejne
zapisy w stanie E są wykonywane lokalnie a więc jak ktoś z zewnątrz potrzebuje odczytać
daną to trzeba ją wysłać do wyższych poziomów a więc przechodzi się do stanu S;
Bufor prognozy rozgałęzień – pamięć asocjacyjna, przechowuje adresy rozkazów skoku oraz
adresy docelowe, stany automatu prognozy, dodatkowe bity służące do wymiany linii; bufor
wkłada do Program countera następny rozkaz, adres docelowy z bufora lub z rozkazu (za
pierwszym razem); potem aktualizuje stan linii w zależności od jakości prognozy
Optymalizowanie potoku – opóźnianie rozkazu za skok, żeby mieć pewność że potok będzie
działał, wyrównanie potoku NOPami; umieszczenie instrukcji wyznaczających wartości użyte
w skoku warunkowym kilka instrukcji przed skokiem żeby potok miał czas je wyliczyć
Rejestrowa load store – ALU pobiera i zapisuje dane tylko i wyłącznie z rejestrów
Żeby mieć pewność że procesor nie użyje starej wartości w nowym potoku, stare instrukcje
mogą być dopełniane NOPami
By walczyć z read after write można też poprzestawiać instrukcje żeby wynik instrukcji nigdy
nie był używany zaraz po swoim wyliczeniu
Read after write normlanie powoduje powstanie bąbla (procesor zatrzyma potok), który
propaguje się do końca wykonywania programu; by temu zapobiec można zastosować
techniki prorgamowe
ALU może mieć za wejście bufor układu potoku innej fazy żeby przyspieszyć przetwarzanie
Konflikty danych – dwuportowy dostęp do rejestru polega na przełączaniu wyjściowej
magistrali rejestru żeby umożliwić dostęp równoległy dostęp samego rejestru
Przemianowanie rejestrów – czasami ten sam rejestr jest używany w wielu operacjach po
kolei, ale operacje te nie są zależne od swoich wyników, wtedy zamiast używać tego samego
rejestru (co spowalnia potok, bo trzeba czekać na zapis poprzedniej instrukcji) można użyć
dodatkowych ukrytych rejestrów do realizacji tych operacji; w sztuczny sposób rejestr jest
zwielokrotniony jeśli wynik nie będzie potrzebny w następnych instrukcjach
Algorytm Tomasulo – stacja rezerwacyjna to zbiór rejestrów podłączonych na wejście ALU
(zbiór argumentów wejściowych), każde ALU może mieć wiele stacji, każda stacja
przechowuje jeden cały zestaw argumentów; mechanizm pozwala na zwiększenie
wykonywanych egzekucji poprzez posiadanie argumentów wejściowych w stacji przez co nie
musi czekać na wynik poprzedniego etapu; w rejestrze stacji bit zajętości mówi o tym że
instrukcja działa właśnie na danym rejestrze i zwróci jego wynik zaraz; jeśli instrukcja korzysta
z rejestru który jest w stacji, to nie musi go pobierać z potoku lecz szybciej pobierze go ze
stacji;
Do rejestru dołączony jest też tag (identyfikator), który mówi o tym z której stacji i z którego
ALU dana powinna zostać pobrana; następna instrukcja nie musi czekać na wykonanie
poprzedniej instrukcji, może zacząć się wykonywać pamiętając że czeka na dane które
zostaną wytworzone w stacji o numerze zdefiniowanym przez tag
Używana jest wspólna magistrala danych – gdy stacja oblicza wynik to wysyła go wszystkim
innym razem z numerem stacji która go wytworzyła; do samego rejestru wynik jest
kopiowany dopiero kończą się instrukcje które na nim działają
Pozwala na wykonywanie instrukcji kolejnych przed zakończeniem poprzedniej jeśli jest
długa, kolejność jest wymuszona przez zależności między rejestrami; rejestry nie są
zapisywane rzadziej niż na to wskazuje kod; zgłaszanie wyjątków jest wtedy nieprecyzyjne, bo
kilka instrukcji są wykonywane w różnych kolejnościach
Nawet mając nieskończone zasoby nie da się przyspieszyć programu bardziej, niż to wynika z
części nieprzyspieszalnej; 1-p to część programu którego nie da się zrównoleglić; p to część
którą da się zrównoleglić
1000 procesorów daje 17krotne przyspieszenie dla programu z p=5%
Dla konkretnej instancji problemu gdzie część szeregowa p=1s, nie da się przyspieszyć
programu bardziej niż do 1s
Mierzone jest silne skalowanie problemu dla ustalonej liczby procesorów i ustalonego
rozmiaru problemu
1.10.4 Proces
Aktualny stan procesu (rejestry, pamięć itp.) to kontekst procesu. Przy wywłaszczaniu
kontekst procesu musi zostać zapisany.
Kontekst procesora – stan procesora - W procesorach Intela istnieje segment stanu zadania,
który przechowuje rejestry i różne identyfikatory i sprzętowo aktualizuje wznawiane procesy
Kontekst pamięci – adresy i rozmiary bloków pamięci procesu, reguły dostępu;
przeładowywanie tego kontekstu jest długie bo zawiera wiele danych
Procesy należy synchronizować gdy procesy komunikują się i wykorzystują swoje dane oraz
gdy współzawodniczą o unikatowy zasób
Sekcja krytyczna to fragment kodu który może być wykonywany tylko przez jeden proces.
Przed wejściem do niej proces musi zażądać dostępu do sekcji krytycznej i poczekać aż
procesor przydzieli mu ten zasób, gdy proces wychodzący zakończy sekcję krytyczną;
Tylko określona liczba procesów (na ogół 1) może mieć jednocześnie dostęp do sekcji
krytycznej
Trzeba też zagwarantować, że wszystkie procesy wejdą kiedyś do sekcji krytycznej i nie
zostaną zagłodzone
Problemy współzawodnictwa
o Schemat blokady można rozwiązać przez modyfikację algorytmu tak żeby procesy
żądały danego zasobu w tej samej kolejności
o Instrukcje atomowe gwarantują że instrukcja wykona się w całości albo wcale; gdy
instrukcje nie są atomowe może wystąpić wyścig gdy procesy działają współbieżnie i
operują na tych samych danych; wyścig jest zależny od sprzętu (ilości wątków);
można zwiększyć prawdopodobieństwo wyścigu zatrzymując proces po odczytaniu
wartości ale przed jej aktualizacją, można też uruchomić podejrzany fragment kodu
wielokrotnie
Wzajemne wykluczanie – uniemożliwia jednoczesny dostęp do dzielonego zasobu, blokuje
pozostałe procesy gdy jeden ma dostęp do sekcji krytycznej; nie broni przed blokadą, gdy
procesy blokują się wzajemnie ani przed zagłodzeniem gdy tylko procesów ma dostęp do
zasobu a pozostałe są zagładzane
Mechanizmy sprzętowe synchronizacji procesów:
o Atomizowanie instrukcji – wszystkie podoperacje zostaną wykonane po sobie, można
osiągnąć przez dodanie prefiksu w as
o Zablokowanie przerwań w trakcie działania sekcji krytycznej, gdy przerwania
modyfikują dane wykorzystywane przez kod; przerwanie nie może czekać na
zwolnienie sekcji krytycznej żeby nie było ryzyka zatrzymania programu; można
ignorować przerwania lub zakolejkowanie ich; przeważnie wystarczy zmienić flagę
wykonywania przerwań; przerwania można blokować też w procedurze przerwania;
zmienna volatile może być modyfikowana przez wiele źródeł i nie może być
buforowana w rejestrze; kwalifikator restricted mówi że zmienna zajmuje osobny
obszar w pamięci i nie może być aktualizowana przez inne źródła
o Pamięć tymczasowa – prefiksy i odpowiednie instrukcje (Intel i AMD różne)
pozwalają oznaczyć rejestry i komórki pamięci przed sekcją krytyczną, jeśli w trakcie
sekcji krytycznej ktoś inny zmienił te dane to sekcja krytyczna zostanie wykonana
ponownie; wykonanie sekcji krytycznej jest spekulatywnie i zapisy są buforowane
Mechanizmy programowe synchronizacji procesów:
o Kolejki procesów sekcji krytycznej – dostęp do sekcji zależny od kolejki zapobiega
wyścigom oraz zagłodzeniu (chyba że kolejka jest priorytetowa)
o Blokowanie dostępu do sekcji krytycznej i użycie semaforów, przed wejściem do
sekcji krytycznej proces jest uśpiony i nie zajmuje czasu procesora
o Monitory, muteksy, futeksy – wymagają sprzętowego wspomagania
o Skomplikowane algorytmy nie wymagające sprzętu np. Algorytm Dijkstry dla 2
procesów
o Funkcje usypiające proces wywłaszczają proces
1.11.1 Segment
Segment to ciągły blok pamięci, ma adres początkowy, rozmiar, prawa dostępu; w rejestrze
segmentowym przechowywany jest offset oraz selektor segmentu. Procesowi zawsze
przydzielana jest określona liczba segmentów
Istnieje globalna tablica deskryptorów segmentów oraz lokalna dla każdego procesu. Istnieje
też tablica deskryptorów przerwań
W trybie rzeczywistym każdy segment ma 16 bajtów i adres początkowy jest podzielny przez
16 bajtów, adres rzeczywisty oblicza się mnożąc rejestr segmentowy razy 16 + dowolne
przesunięcie; 1 rejestr adresuje 1 MB pamięci
W trybie chronionym w rejestrze segmentu znajduje się selektor segmentu (selektor
segmentu odnosi się do globalnej tablicy selektorów, żeby znaleźć adres początkowy
segmentu) do znalezionego przez selektor adresu dodaje się offset (adres logiczny)
1.11.2 Stronicowanie
Stronicowanie jest opcjonalnym procesem. Daje większą kontrolę i granulację. Nie można
odwoływać się do cudzych stron
Strony dzielą pamięć procesu na strony o ustalonym rozmiarze (przez jądro, ale użytkownik
może zwiększyć rozmiar strony) i adresach początkowych podzielnych przez rozmiar; wymaga
to znacznie więcej struktur danych, ale pozwala na różne zarządzanie uprzywilejowaniem
Segment wymaga ciągłego obszaru pamięci, strony mogą być wpisywane w dowolne miejsce
w pamięci
Strony są zawartością ramek, struktury opisujące strony muszą przechowywać informację o
ramce i stronie
Adres liniowy po segmentacji jest dzielony na offset, adres tablicy strony oraz adres zakresu
stron z katalogu stron
Katalog stron zawiera informację o tablicy stron, tablica stron zawiera informację o stronie,
dodatkowe bity w tablicy stron zawierają informację o tym czy strona się zmieniła, czy strona
jest w pamięci głównej ( jak nie ma to trzeba zgłosić wyjątek i ją wymienić), bity sterowania
pamięcią podręczną
W nowych procesorach może być obecne wiele tablic stron z których za każdym razem trzeba
sekwencyjnie odczytywać i interpretować zawartość. Żeby przyspieszyć ten proces
wprowadzono dodatkową pamięć podręczną stron – bufor TLB. Pamięć podręczna wyłącznie
na opisy stron, do adresu liniowego jest przypisywany adres strony który może zostać użyty
do wyznaczenia adresu fizycznego. Właściwe wykorzystanie TLB ma ogromny wpływ na czas
wykonywania programu
TLB zawiera informację pozwalające przekodować adres liniowy na fizyczny, adres fizyczny to
adres początkowy ramki oraz przesunięcia na stronie
Identyfikator procesu jest dedukowany z deskyptora segmentu i strony
TLB jest przeładowywany po wywłaszczeniu procesu za wyjątkiem tych wpisów które mają
ustawioną flagę G – są to procesy współdzielone
Wpisy w TLB można unieważnić jawnie z poziomem uprzywilejowania systemu
Odpowiednie wpisy w tablicy stron pozwalają na zmapowanie różnych adresów logicznych na
te same adresy fizyczne co ułatwia współbieżność lecz daje ryzyko wyścigu
Jedna struktura zapewnia mapę pamięci dla całej pamięci fizycznej. Przechowywane wpisy
zawierają informację o tym co jest aktualnie w pamięci fizycznej (ramki). Adres wirtualny ma
w tablicy funkcję skrótu, która pozwala identyfikować wpisy. Adres wirtualny jest
porównywany z wierszem do którego pasuje w celu znalezienia adresu ramki
Zawiera informacje o stronach dla różnych procesów dlatego adres wirtualny musi zawierać
informację o procesie
Pobieranie na żądanie – stronę trzeba załadować gdy nie ma jej w pamięci głównej
Strategia przydziału – gdzie wstawić daną stronę lub segment. Strony wstawia się w pierwszą
wolną ramkę. Pamięć jest odgórnie podzielona na ramki tych samych długości.
Segmenty mogą mieć różne rozmiary, usuwanie segmentów może powodować powstawanie
dziur
Strategie wymiany – reguły wymieniania stron gdy cała pamięć jest zajęta. Można stosować
algorytm LRU. Wymiana to długie i kosztowne algorytmy gdyż wymaga odczytu z dysku
Fragmentacja zewnętrzna – niewykorzystane obszary pamięci za małe do wstawienia
segmentu pojawiają się po usuwaniu segmentów. Niewykorzystane bloki są na zewnątrz
segmentów
Fragmentacja wewnętrzna – strona jest zawsze przydzielana w całości, choć czasami proces
nie potrzebuje całej strony. Niewykorzystane bloki są wewnątrz strony, do 50% jest
niewykorzystane
Fałszywe współdzielenie danych – gdy procesy są obok siebie w pamięci może się zdarzyć że
ich zmienne są w tej samej linii pamięci cache co prowadzi do migotania
Model zbioru roboczego – zbiór roboczy to zapotrzebowanie procesu na pamięć w danym
momencie. Zbiór roboczy zmienia się i pomiędzy wywłaszczeniami proces może mieć
przydzielone różną ilość zasobów. Dobrze jest w kodzie w zakresie kodu nie odwoływać się
do dalekich miejsc w pamięci
Szamotanie występuje gdy nie ma przestrzeni fizycznej oraz gdy wymieniamy stronę, która
będzie zaraz potrzebna
Przeszukiwanie pustych bloków między segmentami
1.11.5 Partycje
1.12.1 Przerwanie
Można ignorować przerwania o niższym priorytecie niż aktualne; urządzenia mogą zachować
sygnał o przerwaniu by być obsłużonym później
Wektor przerwania – każde przerwanie obsługuje się w inny sposób; wektor przerwania to
indeks procedury przerwania w tabeli deskryptorów przerwania, w których są informację o
tym gdzie jest kod obsługujący przerwanie; tablica wektorów jest umieszczana na początku
pamięci; źle obsłużone wyjątki resetują procesor
Przerwania zewnętrzne są w Intelu obsługiwane przez zewnętrzny kontroler przerwań, który
priorytetyzuje i kolejkuje przerwania; kontroler ma z procesorem osobną magistralę;
wprowadza to opóźnienia
Przerwania mogą być zgłaszane przez urządzenia I/O, dyski, układy do komunikacji (myszki,
klawiatury, monitory), czujniki, konwertery A/C C/A, sterowniki
Wiele urządzeń może być podłączonych do jednego przerwania; identyfikacja przerwania
komplikuje i wydłuża obsługę
Sposoby operowania
o Ciągłe odpytywanie w pętli czy urządzenie ma coś do powiedzenia – bardzo
nieefektywne
o Uchwyty przerwań / obsługa w trybie przerwań – gdy urządzenie ma jakieś dane do
przesłania to zgłasza przerwanie, sterownik urządzenia odpowiada na przerwanie;
procesor musi mieć zapisane odpowiednie kody odpowiednich przerwań; w trakcie
oczekiwania na przerwanie procesor może być uśpiony
o Autonomiczne DMA – dodatkowe układy przesyłają dane pomiędzy urządzeniem a
pamięcią; po całym przesłaniu urządzenie zgłasza przerwanie
Rodzaje pracy DMA
o Blokowy – jak dostanie magistralę to korzysta z niej do końca dopóki ma coś do
przesłania. Cały blok danych jest wysyłany za jednym razem
o Z wykradaniem taktów – procesor daje magistralę DMA jak akurat z niej nie korzysta.
Procesor ma bez przeszkód dostęp do magistrali
o Zgodnie z zapotrzebowaniem – DMA przekazuje tyle ile dostał w transmisji
wejściowej
1.13 Magistrale
Magistrala zazwyczaj zawiera szynę danych, adresu oraz kontrolne sygnały; można przesyłać
wszystko równolegle lub szeregowo
Im dłuższa magistrala tym trudniej uzyskać wysokie częstotliwości przez przesłuch i czas
propagacji
Do jednej magistrali można podłączyć wiele urządzeń równocześnie, by zapobiec konfliktom
mogących uszkodzić magistralę (wspólna próba wysłania) stosowane są min. Bramki
trójstanowe, logika na kablu – wymuszanie stanu niskiego w bezpieczny sposób; używanie
multiplekserów
Magistrale niemltipleksowane – osobne linie na adres, dane i kontrolę
Magistrale multileksowane – na tych samych liniach są przesyłane dane i adresy w osobnym
czasie
Etapu używania magistrali
Arbitraż – przydzielanie dostępu do magistrali odpowiednim urządzeniom, może być
zarządzane przez nadrzędny układ lub protokół; najprostszy sposób to przydzielanie
odpowiednich kwantów czasu dla każdego urządzenia – spowalnia to znacznie
przepustowość
Lepszym sposobem jest przydzielanie w zależności od potrzeb, urządzenia i zdarzenia są
odpowiednio priorytetowane, ale odpowiednio kolejkowane żeby każde urządzenie miało
dostęp; algorytmy te są realizowane sprzętowo
Magistrala musi jawnie wybrać urządzenie źródłowe i docelowe (adresowanie),
identyfikatory mogą być przypisywane przez system przy włączaniu urządzenia
Przyczyny błędów – mogą to być błędy zewnętrzne mechaniczne
Magistrala może być oddawana gdy urządzenie zakończy transmisję, inne urządzenie o
wyższym priorytecie zarząda magistrali, arbiter magistrali zakończy transmisję
Błędy pojawiają się przez uszkodzenie lub przez chwilowe zmiany w otoczeniu, błąd w
protokole magistrali; transmisję z błędem można unieważnić lub poprawić
1.14 Niezawodność
1.14.1 Pojęcia
Poufność security – zapewnienie tajemnicy informacji, nikt niepowołany nie może dostać się
ani odczytać danych
Bezpieczeństwo safety – zapewnienie odporności na zagrożenia
Spolegliwość rzetelność dependability – zapewnienie poprawnego wykonania zadania
Gotowość availability – dostępność do środków które są w stanie dobrze wykonać zadanie
Niezawodność reliability – zapewnienie satysfakcjonującej obsługi błędów, zmniejszanie
szansy na wystąpienie uszkodzenia, takich jak uszkodzenia fizyczna, promieniowanie
kosmiczne itp., ale też błędy użytkownika np. błędny adres
Techniki nadmiarowe:
o Nadmiar informacji – pozwalających sprawdzić poprawność danych
o Nadmiar czasu – zapas czasu potrzebny do wykonania czynności kontrolnych
o Nadmiar sprzętu – dodatkowe urządzenia do równoległego wykonywania tych
samych obliczeń czy sprawdzania poprawności
o Na ogół wszystkie techniki łączą się
o Przykładem jest bit parzystości
Celem jest zapobieganie błędom oraz radzenie sobie z błędami gdy zostaną wykryte
Ryzyko powstania błędów zmniejsza się tworząc lepsze systemy
Kontynuowanie pomimo błędów np. rezerwa zimna lub gorąca
Można też szybko wykryć i poprawić dane
1.14.3 Kody
Błędy można wykryć (kody detekcyjne – nity parzystości, CRC) albo korygować (kody
Hamminga, BCH, Reeda Solomona)
Po zidentyfikowaniu błędu można poprosić o powtórzenie transmisji
Każda pamięć masowa stosuje kody korekcyjne
Odległość Hamminga – liczba pozycji na których różnią się dwa słowa
Kody blokowe – dzielimy informację na bloki i do każdego bloku dodawane są odpowiednie
informacje, bloki są niezależne od siebie
Kody splotowe – nieustannie przetwarzają szeregowo podawany strumień informacji na inny
strumień informacji
Syndrom błędu – wyliczony element liczba określająca czy błąd wystąpił oraz jaki błąd
wystąpił; zapewnia że po wykryciu danych można łatwo zidentyfikować błąd i poprawić go
Ograniczenie Hamminga – żeby można było poprawić t błędów w n-bitowym słowie, to słów
kodowych powinno być tyle ile możliwych słów może zostać wysłanych (każda ilość błędów
to inne słowo)
Zasada maksymalnej wiarygodności – zakładamy że w danym modelu błędów częściej
występują jedne rodzaje błędów niż inne np. częściej przekłamany jest 1 bit niż 2 bity
Kody liniowe – słowa kodowe są kombinacjami liniowymi innych słów kodowych
Kody cykliczne – powstają w wyniku cyklicznych przesunięć słów kodowych według jakiejś
ustalonej zasady z użyciem rejestru przesuwnego
Przykładem jest kod CRC (detekcyjny) – dla słowa obliczana jest reszta z dzielenia przez inny
wielomian – suma kontrolna; szybkie metody obliczania sum zmniejszają narzut czasowy
Intel posiada specjalne instrukcje przyspieszające liczenie sum kontrolnych
Średni czas pomiędzy błędami MTBF – dla urządzenia stabilnego parametr ten określa ile
średnio należy czekać na jeden błąd, jest niezależny od czasu działania; czas MTTF to czas do
wystąpienia błędu nienaprawialnego; z puli urządzeń wystąpienie uszkodzenia ma rozkład
wykładniczy lub Weibula; średni czas do uszkodzenia to MTBF, ale 1/3 uszkodzeń występuje
znacznie wcześniej; AFR to MTBF w skali roku czyli szansa na zepsucie się w ciągu roku
Błędy najczęściej występują na początku działania i po dłuższym działaniu
W rzeczywistości stopa błędu to 1/10^13 czyli co 1/10^13 bitów jest przekłamany, ale dysk
nadal działa poprawnie, można sobie z tym radzić rozpraszając dane
RAID 0 – macierzowanie 0 – rozpraszanie informacji pomiędzy różne dyski lub różne sektory
dysku, zwiększa przepustowość gdyż kontroler zrównolegla operacje odczytu; gdy
którykolwiek z dysków ulegnie uszkodzeniu to cały blok danych ma błąd
RAID 1 – macierzowanie 1 – Polega na podwajaniu danych na dyskach, gdy jeden się uszkodzi
to można odczytać z innego; zapis występuje na kilku dyskach równocześnie, odczyt
następuje z 1 lub wielu dysków
RAID 3 – Połączenie raid 0 z dodatkowym dyskiem na dane korekcyjne – z wszystkich dysków
czyta się równocześnie a dodatkowe dane z dysku korekcyjnego mogą służyć do korygowania
danych; jest wolniejszy niż 1 dysk gdyż trzeba zawsze czytać z dysku na dane korekcyjne
RAID 5 – Używa wielu dysków na których rozproszone są dane korekcyjne, większość operacji
można więc zrównoleglić, gdyż dane korekcyjne na pewno są na innym dysku niż dane; na
podstawie sumy i kilku bloków danych można odtworzyć błędne dane; w przypadku awarii
macierz może być nieodtwarzalna
RAID 6 – działa jak Raid 5 ale sumy kontrolne są podwojone co ułatwia odtwarzanie danych z
poprawnych danych
Sumy kontrolne mogą być wynikiem operacji XOR, co od razu pozwala na korekcję, to który
bit jest uszkodzony wynika w trakcie odczytu
RAID 1.0 – 4 dyski wewnętrzne są dzielone na pół i przechowują zdublowane dane do których
dostęp jest przez dyski logiczne zewnętrzne za pomocą RAID 1
RADI 5.0 – powielanie danych do których dostęp jest za pomocą RAID 5
Bardzo długie słowa kodowe, które pozwalają w 1 instrukcji zaprząc do pracy jak najwięcej
jednostek wykonawczych; na etapie kompilacji kilka kolejnych operacji koduje się wspólnie
Przetwarzanie superskalarne
Przetwarzanie data flow
Wiele procesorów
Przetwarzanie wątkowe – przełącza się wątki co jakąś liczbę operacji gdy wątek i tak musi
czekać na jakieś dane; podobne operacje wykonuje wiele wątków na raz, wątki są grupowane
w sploty wątków, grupowane w bloki, grupowane w siatki
Drobnoziarnista równoległość na poziomie instrukcji
Gruboziarnista równoległość na poziomie wątków
Symetryczna wieloprocesorowość SMP – wiele procesorów jest podłączone do pamięci
głównej, dlatego jeden rdzeń nie jest w stanie wykorzystać całą przepustowość pamięci
NUMA niejednorodny dostęp do pamięci – każdy procesor ma swoją pamięć fizyczną, ale
wspólną pamięć wirtualną, komunikacja jest kosztowna i wymaga dodatkowych operacji;
żeby przyspieszyć wywłaszczanie procesy są przypisywane do jednego procesora