Wprowadzenie do architektury komputerów Pamięci w systemach komputerowych Pamięć podręczna
Typy pamięci półprzewodnikowych
RAM 4 Pamięć półprzewodnikowa RAM Pamięć o dostępie swobodnym Odczyt/Zapis Utrata informacji przy braku zasilania Tymczasowe przechowywanie Statyczna lub dynamiczna Operacje na komórce pamięci
Pamięć dynamiczna RAM Komórka pamięci to kondensator Upływ ładunków Wymaga odświeżania Prosta konstrukcja Mała powierzchnia na jeden bit Stosunkowo tania Wymaga organizacji procesu odświeżania Stosunkowo wolna Stosowana jako pamięć główna operacyjna Ma analogowy charakter Poziom ładunku określa wartość
Komórka pamięci dynamicznej Linia adresowa aktywna przy odczycie i zapisie Klucz tranzystorowy zamknięty (przepływ prądu) Zapis Ustawienie napięcia na linii danej 1 bit Wysokie przy 1 niskie przy 0 Uaktywnienie linii adresowej Ładowanie kondensatora Odczyt Linie adresowe ustawione Klucz tranzystorowy załącza się Ładunek z kondensatora dociera do wzmacniacza Porównanie z napięciem referencyjnym w celu ustalenia 0 czy 1 Odświeżenie ładunku w kondensatorze
Pamięć statyczna RAM Bity pamiętane jako stan klucza Nie występuje upływ ładunków Niepotrzebne odświeżanie Bardziej złożona budowa Większa powierzchnia na jeden bit Droższa niż DRAM Niepotrzebne obwody odświeżające Większa szybkość działania Wykorzystywana jako pamięć CACHE Ma naturę cyfrową Wykorzystuje przerzutniki
Komórka pamięci statycznej Układ tranzystorów tworzy przerzutnik bistabilny Stan 1 C1 wysoki, C2 niski T1 T4 wyłączone, T2 T3 załączone Stan 0 C2 wysoki, C1 niski T2 T3 wyłączone, T1 T4 załączone Tranzystory linii adresowej T5 T6 załączone Zapis wartość na linii B & negacja na linii NOT B Odczyt wartość na linii B
ROM Pamięć stała Nie traci zawartości przy braku napięcia Używana w układach mikroprogramowania Podprogramy biblioteczne Programy podstawowe (BIOS) Tablice funkcji
Typy pamięci ROM Zapisane na etapie produkcji Bardzo drogie przy krótkich seriach Programowalne jednorazowo (przez użytkownika) PROM Potrzebne specjalne programatory Reprogramowalne Kasowalne, wielokrotnie zapisywane EPROM Kasowane promieniami UV Kasowalne, wielokrotnie zapisywane EEPROM Kasowane i programowane elektrycznie, kasowana pojedyncza komórka Flash memory Kasowanie blokami po min. 32kB
Typowy układ 16Mb DRAM (4M x 4)
SDRAM Dostęp synchronizowany zewnętrznym zegarem SDRAM przesyła dane zgodnie z zegarem systemowym, CPU wie kiedy dane będą gotowe CPU nie musi czekać, może wykonywać inne operacje Tryb Burst umożliwia sformatowanie danych w strumień i przekazanie ich blokowo DDR-SDRAM wysyła dane dwa razy na 1 takt (narastające i opadające zbocze)
SDRAM cykl odczytu
DDR SDRAM SDRAM wystawia dane raz na 1 takt Double-data-rate SDRAM może wysyłać dwa razy na takt Zbocze narastające i zbocze opadające
Pamięci zewnętrzne Służą do długotrwałego przechowywania informacji podział: o dostępie sekwencyjnym taśmy magnetyczne o dostępie bezpośrednim dyski magnetyczne wymienne stałe dyski optyczne tylko do odczytu jednokrotnego zapisu wielokrotnego zapisu karty pamięciowe - tzw. dyski półprzewodnikowe
Budowa fizyczna dysku twardego
Dyski optyczne powierzchnia nośnika ma właściwości optyczne powodujące, że światło lasera odbija się i trafia na fotodetektor lub ulega rozproszeniu (pity i landy) dane zapisywane są na spiralnej ścieżce (ok. 5km długości) odległość między ścieżkami: 1.6um, szerokość ścieżki 0.5um gęstość zapisu zależy od średnicy plamki, związanej z długością promieniowania lasera i rozmiarem pitów i landów
Dyski optyczne - napęd napęd CD zawiera mechanizm napędu płyty oraz układ pozycjonowania lasera czytniki CD stosują zmienną prędkość obrotową w celu zachowania stałej prędkości liniowej 1.25 m/s laser pracuje w podczerwieni z falą o długości 780nm
Karty pamięci elektroniczne nośniki informacji wykorzystujące technikę Flash-ROM istnieją tzw. Stałe Dyski, tj. karty wyposażone w interfejs EIDE, widziane przez PC jak standardowe dyski do aplikacji przemysłowych karty ISO7816 pierwotnie zawierały jedynie proste układy pamięciowe z szyną I 2 C, obecnie posiadają mniej lub bardziej skomplikowany sterownik (asynchroniczny lub synchroniczny względem hosta) wyposażony w funkcje kryptograficzne i ochrony danych są stosowane do identyfikacji (GSM), przechowywania danych i operacji płatniczych różne parametry rozwiązań cywilnych i przemysłowych
Pamięć podręczna - podstawy Warstwa hierarchii pamięci umieszczona pomiędzy rejestrami a pamięcią operacyjną Niewidoczna w użytkowym modelu programowym Współcześnie oprogramowanie użytkowe może mieć ograniczoną kontrolę nad pracą kieszeni Stanowi bufor dla pamięci operacyjnej Niezbędna we współczesnych komputerach z powodu znaczącej dysproporcji pomiędzy wydajnością procesora i pamięci operacyjnej Pierwszy raz wprowadzona w komputerach serii IBM S/370 około 1968 Może być umieszczona w jednym układzie z CPU lub wbudowana w moduł zawierający CPU
Pamięć podręczna (kieszeń)
Działanie kieszeni Przy każdym odwołaniu procesora do pamięci następuje sprawdzanie, czy dana spod określonego adresu znajduje się w kieszeni Brak danej w kieszeni chybienie kieszeni (cache miss) Dana zostaje odczytana z pamięci i przesłana do procesora po drodze dana wraz z jej adresem jest zapisywana do kieszeni (jeśli kieszeń była pełna trzeba z niej coś usunąć) Przy następnym odwołaniu dana będzie już w kieszeni Odnalezienie danej w kieszeni trafienie kieszeni (cache hit) Dana zostaje odczytana z kieszeni Odwołanie do pamięci operacyjnej jest zbędne Czas odwołania do danej w kieszeni jest znacznie krótszy, niż czas dostępu do pamięci operacyjnej
Zasada lokalności odwołań W ograniczonym odcinku czasu odwołania są skupione na niewielkim fragmencie przestrzeni adresowej Wykres przedstawia orientacyjny rozkład prawdopodobieństwa odwołań do poszczególnych adresów w czasie od t 0 do t 0 +Δt, przy założeniu, że w chwili t 0 nastąpiło odwołanie do A 0
Lokalność odniesień Idea realizacji pamięci podręcznej (cache memory) bazuje się na zasadzie lokalności (locality), postrzeganej jako lokalność przestrzenna (spatial) oraz czasowa (temporal) Zasada lokalności przestrzennej polega na tym, że kolejne odwołania do pamięci zachodzą zwykle w pewnym niewielkim obszarze. Istnieje duże prawdopodobieństwo, że kolejne odwołanie do pamięci będzie wykonano do lokacji sąsiedniej wobec bieżącej (np. przy wykonywaniu pętli) Zasada lokalności czasowej oznacza, że istnieje duże prawdopodobieństwo, iż dane których procesor właśnie potrzebuje będą niedługo znów potrzebne Zasada 90/10 - większość programów spędza 90% czasu nad przetwarzaniem 10% swojego kodu i danych
Wnioski z zasady lokalności Zakres odwołań jest ograniczony Zakres adresów, do których odwołuje się procesor w ograniczonym odcinku czasu nazywa się zbiorem roboczym Stosunkowo niewielki bufor może przechowywać znaczącą część obiektów, do których w danym odcinku czasu odwołuje się procesor Odwołania są na ogół powtarzane Należy zapamiętywać dane, do których procesor wykonuje dostęp, bo zapewne wkrótce będzie znów ich potrzebował Bardzo prawdopodobne są kolejne odwołania do kolejnych adresów Przy napełnianiu bufora wskutek dostępu ze strony procesora warto pobrać z pamięci kilka kolejnych komórek na zapas
Kieszeń pełnoasocjacyjna Najbardziej intuicyjny typ kieszeni Trudna i niezbyt efektywna w implementacji Małe pojemności Obecnie nie stosowana Zbudowana na bazie pamięci asocjacyjnej Pamięć asocjacyjna nie ma adresów Dostęp do danej następuje poprzez porównanie danej w kieszeni z wzorcem dostarczonym z zewnątrz Pamięć odpowiada poprzez wystawianie danych zgodnych ze wzorcem lub informacji, że takich danych nie ma w pamięci Działanie można wytłumaczyć na przykładzie książki telefonicznej Szukamy znanego nazwiska Odczytujemy numer telefonu Nie zwracamy uwagi na położenie nazwiska w książce (nr strony, kolumnę)
Kieszeń pełnoasocjacyjna - model
Kieszeń pełnoasocjacyjna - charakterystyka W każdej komórce kieszeni może być przechowywana dana spod dowolnego adresu Kieszeń może równocześnie przechowywać dane spod dowolnych adresów duża elastyczność w porównaniu z następnymi architekturami Wyznaczanie linii do zastępowania LRU (Last Recently Used zastępowanie pierwszej najdawniej używanej danej) lub losowe LRU algorytm kosztowny w implementacji sprzętowej Algorytm losowy daje zróżnicowane wyniki Każda komórka wyposażona w komparator znacznika Trudna implementacja Niewielka pojemność (do ok. 16 KB), ograniczenie szybkości dostępu Jeśli rozmiar zbioru roboczego przekracza pojemność kieszeni wszystkie odwołania będą kończyły się chybieniami
Konstrukcja kieszeni Dane są przechowywane w kieszeni nie w postaci pojedynczych słów czy bajtów, lecz bloków, zazwyczaj o długości 4x większej od rozmiaru słowa pamięci Bloki te są wyrównane naturalnie adres pierwotnego bajtu jest podzielony przez długość bloku Element kieszeni zawierający blok danych i związane z nim znaczniki ( w tym znacznik adresu) jest nazywany linią Najmniej znacząca część adresu służy do wyboru bajtu lub słowa z linii Kolejne, bity adresu są używane do stwierdzenia, czy poszukiwana dana znajduje się w kieszeni
Kieszeń bezpośrednio adresowana Zbudowana na bazie zwykłej, szybkiej pamięci RAM i jednego komparatora Bardzo prosta w realizacji, szybka i wydajna Dzięki prostocie budowy może mieć stosunkowo dużą pojemność Proste, lecz zupełnie nieintuicyjne działanie Najmniej znaczące bity adresu służą do wyboru bajtu linii środkowa, mniej znacząca część adresu procesora służy jako adres pamięci RAM; na jej podstawie w każdym cyklu dostępu jest wybierana pojedyncza linia Każda linia zawiera znacznik adresu i dane Pole znacznika adresu zawiera bardziej znaczącą część adresu danej zapamiętanej w polu danych jest ono porównywane z najbardziej znaczącą częścią adresu wystawionego przez procesor
Kieszeń bezpośrednio adresowana
Kieszeń bezpośrednio adresowana - działanie W każdym cyklu następuje wybór jednej linii, zaadresowanej przez mniej znaczącą część adresu Kieszeń stwierdza trafienie, jeśli znacznik adresu wybranej linii jest równy najbardziej znaczącej części adresu wystawionego przez procesor W przypadku trafienia dane są transmitowane z kieszeni do procesora W przypadku chybienia wymianie podlega wybrana linia W polu znacznika zostaje zapisana najbardziej znacząca część adresu W polu danych zostają zapamiętane dane odczytane z pamięci
Kieszeń bezpośrednio adresowana - charakterystyka Niskie koszty, duża pojemność, wysoka wydajność Algorytm zastępowania linii wymuszony przez budowę kieszeni Dane spod określonego adresu mogą znaleźć się wyłącznie w jednej, z góry określonej linii kieszeni W kieszeni nie można zapamiętać dwóch danych, których środkowe części adresu są identyczne W praktyce nie jest to bardzo częsty przypadek, ale niekiedy się zdarza Przy ciągłym zakresie adresów zbioru roboczego (pętla programu, tablica) kieszeń przyspiesza odwołania do pamięci, dopóki zbiór roboczy jest mniejszy niż 2x pojemność kieszeni Lepiej niż w przypadku kieszeni pełnoasocjacyjnej
Kieszeń zbiorowo asocjacyjna Powstaje przez połączenie pewnej liczby kieszeni bezpośrednio adresowanych (zwanych blokami) Dana spod określonego adresu może być przechowywana w tylu miejscach, ile jest bloków W każdym cyklu dostępu następuje poszukiwanie danej w pojedynczej linii każdego z bloków Zestaw linii wybieranych w każdym cyklu jest nazywany zbiorem Liczba bloków jest zwana stopniem asocjacyjności kieszeni Używa się również określeń kieszeń dwudrożna lub czterodrożna Kieszeń zbiorowo-asocjacyjna może być rozpatrywana również jako złożenie pewnej liczby kieszeni pełnoasocjacyjnej
Kieszeń zbiorowo asocjacyjna
Kieszeń zbiorowo asocjacyjna - działanie Budowa kieszeni musi gwarantować, że dana spod określonego adresu może zostać zapisana tylko w jednym bloku W przypadku chybienia należy wyznaczyć ze zbioru jedną linię do zastąpienia Można użyć algorytmu LRU, który przy małej liczbie linii daje się zrealizować w sprzęcie Przy większej liczbie linii algorytm pseudolru lub losowy Charakterystyka ogólnie podobna do kieszeni bezpośrednio adresowanej, ale z eliminacją przypadku z pokrywającymi się środkowymi częściami adresu Mniejsza wrażliwość kieszeni na nakładanie się adresów danych podobnie jak w przypadku kieszeni pełnoasocjacyjnej
Rodzaje kieszeni - podsumowanie Najczęściej spotykanym typem kieszeni są kieszenie zbiorowo asocjacyjne Charakterystyka lepsza od bezpośrednio adresowanych przy niewielkim wzroście komplikacji Tam, gdzie jest krytyczny czas dostępu używa się kieszeni o małej asocjacyjności Przy bardzo ostrych wymaganiach na szybkość używa się kieszeni bezpośrednio adresowanych lub dwudrożnych zbiorowo asocjacyjnych Kieszenie pełnoasocjacyjne nie są stosowane do przechowywania danych i kodu Niekiedy znajdują one zastosowanie w innych miejscach komputera
Współczynnik trafień (hit ratio) Definiowany jako stosunek liczby trafień do całkowitej liczby odwołań w badanym przedziale czasu h= n cache n total Zależy od: Pojemności kieszeni Organizacji kieszeni i wynikającego z niej algorytmu wymiany Wykonywanego programu Dla każdej kieszeni można podać przykład programu o h=0 i innego, o h bliskim 1 Wiarygodny pomiar i porównanie współczynnika trafień wymaga uzgodnienia budowy testu Zwykle używa się serii programów o zróżnicowanej charakterystyce odwołań, np. kompilatora, edytora, bazy danych, programu obliczeniowego
Współczynnik trafień Wykres przedstawia orientacyjny przebieg zależności współczynnika trafień od pojemności kieszeni W zakresie wartości od 0 do 0,9 h zależy głównie od pojemności kieszeni Wartość 0,9 jest osiągana przy pojemności kieszeni rzędu 8 KB W zakresie powyżej 0,9 istotny wpływ ma również organizacja i algorytm wymiany Wyższa asocjacyjność daje wyższy współczynnik trafień
Współczynnik trafień a wydajność Współczynnik trafień jest liczbą niemianowaną Nie wyraża wzrostu wydajności wynikającego z użycia kieszeni Kieszeń służy przyspieszaniu odwołań do hierarchii pamięci Wydajność może być wyrażona poprzez odniesienie ilości danych do czasu Poprzez szybkość transmisji, np. w MB/s Poprzez średni czas transmisji, w jednostkach czasu na transfer Niezależnie od częstotliwości procesora w cyklach procesora na transfer
Średni czas dostępu Średni czas dostępu dla hierarchii pamięci złożonej z kieszeni i pamięci operacyjnej: t AVG =h t cache +(1 h) t mem h współczynnik trafień kieszeni m = 1 h współczynnik chybień kieszeni (miss ratio) Kieszeń dołączona do procesora musi być skonstruowana tak, aby mogła dostarczać dane z szybkością wymaganą przez procesor (bez zatrzymań) Dla dalszych rozważań przyjmujemy t cache =1
Średni czas dostępu Tabelka przedstawia średni czas dostępu w zależności od współczynnika trafień i dysproporcji wydajności pamięci i kieszeni Wartości odpowiadają wartości spowolnienia procesora w stosunku do sytuacji idealnej W zakresie czerwonym procesor pracuje kilkakrotnie wolniej niż przy idealnej hierarchii pamięci
Wydajność kieszeni - wnioski Intuicyjnie wysoki współczynnik trafień nie zapewnia zbalansowania wydajności procesora i hierarchii pamięci Istotny jest nie tyle współczynnik trafień, co dysproporcja pomiędzy wydajnością kieszeni i pamięci We współczesnych komputerach czas dostępu pamięci może być ponad 100 razy dłuższy od czasu cyklu procesora Z tabelki wynika, że nawet bardzo wysoki współczynnik trafień nie umożliwi wyrównania wydajności Pojedyncza kieszeń może skutecznie zniwelować różnicę wydajności nie przekraczającą jednego rzędu dziesiętnego Poprawa średniego czasu dostępu wymaga poprawy czasu dostępu poza kieszenią można to uzyskać zastępując pamięć operacyjną kolejnym poziomem kieszeni i pamięci W ten sposób powstaje wielopoziomowy system kieszeni
Kieszenie wielopoziomowe Wymóg nadążania kieszeni pierwszego poziomu (L1) ogranicza jej pojemność i asocjacyjność Im większa kieszeń tym wolniejsza Im wyższa asocjacyjność tym dłuższy czas dostępu Kieszeń drugiego poziomu (L2) może być wolniejsza (np. 5 razy) dzięki temu: Może mieć wyższą asocjacyjność Może być znacząco większa Jeśli kieszeń L2 nie zapewnia odpowiednio krótkiego średniego czasu dostępu, w strukturze komputera umieszcza się kieszeń L3, większą i wolniejszą od L2
Kieszenie inkluzywne Implementowane do ok. 2000 roku Przepływ danych: pamięć L2 i L1 procesor Każdy obiekt zawarty w wyższej warstwie jest również obecny w warstwie niższej Efektywna sumaryczna pojemność kieszeni jest równa pojemności największej z warstw kieszeni Pojemność L2 musi być znacząco większa od L1
Kieszenie wyłączne Od około 2000 roku Kieszeń L2 jest napełniana wyłącznie obiektami usuwanymi z L1 Jest to tzw. Kieszeń ofiar (victim cache) Określenie odnosi się do linii ofiar algorytmu zastępowania Przepływ danych: pamięć L1 procesor L1 L2 L2 zawiera głównie obiekty nieobecne w L1 Efektywna sumaryczna pojemność kieszeni jest równa sumie pojemności poszczególnych warstw kieszeni Pojemność L2 może być równa lub większa od L1 Asocjacyjna L2 powinna być większa od asocjacyjności L1 W przeciwnym przypadku sprawność przechwytywania ofiar byłaby niewielka Przykłady K7 i K8 firmy AMD, Pentium 4 i Core firmy Intel
Kieszenie wyłączne główne ścieżki danych