Podręcznik

Strona: SEZAM - System Edukacyjnych Zasobów Akademickich i Multimedialnych
Kurs: Architektura systemów komputerowych: pamięć fizyczna i pamięć podręczna
Książka: Podręcznik
Wydrukowane przez użytkownika: Gość
Data: czwartek, 19 września 2024, 03:06

1. Pamięci ROM

ROM (ang. Read Only Memory) jest to pamięć tylko do odczytu. Jest to pamięć stosunkowo wolna, ale zbudowana w taki sposób, że po odłączeniu napięcia zasilania przechowywane w niej dane nie giną. Pierwsze pamięci ROM były programowane już na etapie produkcji. Nie można było zmienić zapisanego w nich programu i danych. Było to oczywiście dużą niedogodnością. Dlatego opracowano pamięci PROM (ang. Programmable Read Only Memory). Można je było zaprogramować w specjalnych programatorach. Programatory te umożliwiały „przepalanie” połączeń zapisując instrukcje lub dane. Czystą pamięć ROM można było zaprogramować tylko jeden raz, jako że „uszkadzana” była struktura chipa. Był to pewnego rodzaju postęp, ale nadal chip mógł być wykorzystany tylko jednokrotnie. Przełomem było opracowanie pamięci EPROM (ang. Erasable  Programmable Read Only Memory). Tym razem zaprogramowana pamięć mogła być skasowana. Potrzebne do tego celu było specjalne urządzenie, jako że kasowanie przebiegało z użyciem promieniowania ultrafioletowego. Tak kasowalne pamięci miały specjalne okienko (Rys. 1).

 

Rys. 1 Pamięć EPROM kasowana promieniowaniem ultrafioletowym [https://pl.wikipedia.org/wiki/EPROM]

 

Dopiero pojawienie się pamięci EEPROM (ang. Electrically Erasable  Programmable Read Only Memory) dało pełną swobodę. W tym przypadku pamięć może być wielokrotnie kasowana z użyciem odpowiednio przyłożonego napięcia. System BIOS (bądź UEFI) jest przechowywany właśnie w tego typu pamięci.

1.1. Pamięci statyczne

Z wykorzystaniem pamięci statycznych buduje się obecnie pamięci podręczne (zintegrowanie z procesorem). Pamięci statyczne są bardzo szybkie. Nie wymagają odświeżania, czyli przeczytania w określonym (dość krótkim) czasie każdej komórki pamięci w celu zachowania (odświeżenia) danych. Pojedyncza komórka pamięci statycznej jest zbudowana z przerzutników i składa się zazwyczaj z kilku, kilkunastu tranzystorów. Zatem pojedyncza komórka pamięci zajmuje dość dużo przestrzeni w układzie scalonym (małe upakowanie pamięci, duża szybkość, ale również duży koszt). W pamięciach statycznych adresuje się w jednym takcie zegarowym jednocześnie rząd i kolumnę danych, a z macierzy pamięciowej pobierane jest najczęściej całe słowo (4, 8 bitowe). Należy zaznaczyć, że po zaniku zasilania dane z takiej pamięci są tracone. Szerzej pamięci statyczne są omówione w podrozdziale dotyczącym budowy pamięci podręcznych.

1.2. Pamięci dynamiczne

Z modułów pamięci dynamicznych (DRAM) jest skonstruowana pamięć RAM. Ich budowa jest bardzo prosta. Pojedyncza komórka pamięciowa składa się z kondensatora i tranzystora (Rys. 2). Obecność lub brak ładunku na kondensatorze oznacza zapis 0 lub 1 w komórce. Tranzystor działa jak klucz umożliwiający odczyt ładunku kondensatora i tym samym danych. Ładunek jest bardzo niewielki, co więcej kondensatory samoistnie rozładowują się. Żeby dane były zapisywane w wiarygodny sposób, ładunek musi być odczytany w określonym czasie (np. co 20 ms). Ten maksymalny czas odczytu wyznacza tzw. częstotliwość odświeżania. Odświeżanie polega na odczytaniu i zapisaniu tej samej informacji. Operacja odczytu z pamięci DRAM jest niszcząca, informacja jest kasowana w wyniku rozładowania kondensatora przez współpracujący z nim tranzystor, dlatego należy powtórnie zapisać odczytane dane tak, aby nie uległy zmianie. Wszystkie pomięci dynamiczne muszą być odświeżane. Obecnie odczyt każdej komórki w określonym czasie jest zapewniany i realizowany przez logikę układu pamięci. Zaletą pamięci dynamicznych jest niski koszt i możliwość uzyskania wysokiego stopnia upakowania (dużej liczby bitów na jednostkę powierzchni).

 

Rys. 2. Komórka pamięci dynamicznej złożona z kondensatora i tranzystora CMOS

 

Wcześniejsze pamięci dynamiczne działały jako układy asynchroniczne. W układach asynchronicznych zmiana sygnałów wejściowych natychmiast powoduje zmianę wyjść. W związku z tym układy te są szybkie, ale jednocześnie podatne na zjawisko hazardu i wyścigu. Zjawisko wyścigu występuje, gdy co najmniej dwa sygnały wejściowe zmieniają swój stan w jednej chwili czasu. Jednak, ze względu na niezerowe czasy przełączania bramek i przerzutników, zmiana jednego z sygnałów może nastąpić wcześniej niż innych, powodując trudne do wykrycia błędy.

Najstarszym rodzajem pamięci asynchronicznych były pamięci FPM RAM (ang. Fast Page Mode). W tego typu pamięciach sygnały sterujące matrycą komórek pamięci generowane są niezależnie od taktów zegara. Tak więc informacja na wyjściu ukazuje się po czasie wynikającym z konstrukcji układu. Występuje też problem z zsynchronizowaniem taktów zegara systemowego i taktów pamięci. Pamięci asynchroniczne działały z częstotliwościami 66 MHz i później 100 MHz. Kolejnymi typami pamięci asynchronicznych były EDO (ang. Extended Data Out) i BEDO (ang. Burst EDO). Różnice między nimi były ukryte w sposobie adresowania.  Dostęp do danych w typowej pamięci asynchronicznej wymagał 4 cykli zegara. Czas dostępu często był przedstawiany w postaci czterech liczb, np.  4-4-4-4, gdzie każda liczba oznacza czas dostępu do danych liczony w cyklach zegarowych,  tu w czterech kolejnych cyklach dostępu do pamięci. W pamięciach FPM adres rzędu był zmieniany raz na cztery cykle, czyli w pozostałych trzech cyklach dostęp do danych był trochę szybszy (4-3-3-3). W pamięciach EDO zmieniony został tylko cykl odczytu, gdzie dzięki pozostawieniu danych dłużej na magistrali jednocześnie był realizowany odczyt danych i wystawianie adresu następnej kolumny. Pozwoliło to skrócić cykl odczytu (4-2-2-2). W pamięciach BEDO adres rzędu i kolumny był zmieniany raz na cztery cykle odczytu/zapisu. Adresy w pozostałych cyklach były generowane automatycznie (najczęściej były to kolejne adresy). Dostęp był tu więc najszybszy (4-1-1-1). Pamięci BEDO nie doczekały się szerszego zastosowania, bo zostały wyparte z rynku przez pamięci synchroniczne.

 W synchronicznych układach pamięci (SRAM) zmiana stanu wewnętrznego następuje wyłącznie w określonych chwilach, które wyznacza sygnał zegarowy. Każdy układ synchroniczny posiada wejście zegarowe CLK. Charakterystyczne dla układów synchronicznych jest to, iż nawet gdy stan wejść się nie zmienia, to stan wewnętrzny, w kolejnych taktach zegara, może ulegać zmianie. Pamięci synchroniczne mogą być taktowane wyższymi częstotliwościami zegara, niż pamięci asynchroniczne. Podstawowym elementem takich pamięci jest matryca pamięciowa (Rys. 3). Z pojedynczej matrycy (macierzy) pamięci jest wyprowadzane słowo danych (w tym przypadku 4 bity). Macierze muszą być połączone w większe jednostki, tak by wyprowadzane słowo miało pożądaną długość, np. 64 bity. W dodatku pamięć jest zorganizowana w tzw. banki. Każdy bank jest niezależnie sterowany. W ten sposób można ukryć niektóre opóźnienia przy wprowadzaniu/wyprowadzaniu danych (np. przy długich sekwencjach można symulować dostęp w cyklu 4-1-1-1-1-1-1-1-1 ….).

Rys. 3. Budowa modułu synchronicznej pamięci dynamicznej – SDRAM

 

W dynamicznych pamięciach synchronicznych (SDRAM) najpierw jest podawany adres rzędu i dopiero w następnym kroku adres kolumny. Układy wewnętrzne pamięci muszą też zadbać o jej odświeżanie. Każda komórka pamięci musi być w odpowiednim czasie odczytana i ponownie zapisana. Z macierzy pamięci dane nie są wyprowadzane bezpośrednio. Zawsze są one wprowadzane do bufora I/O. Zadaniem tego bufora jest połączenie pamięci z magistralą danych. W ten sposób delikatne sygnały z macierzy pamięciowych są w pewien sposób chronione. Bufor I/O może być taktowany z większą częstotliwością niż macierze pamięci.

Macierze pamięci mogą być połączone w różny sposób w celu otrzymania pożądanej długości słowa. Uważa się, że im mniej macierzy pamięci (które są implementowane często jako osobne układy scalone), tym pamięć jest bardziej niezawodna. Na Rys. 4 przedstawiono niektóre możliwe formy organizacji pamięci SDRAM. W tym przypadku pożądaną długością słowa jest 64 bity. Można jednak zauważyć, że w niektórych przypadkach liczba bitów jest zdublowana. Mówimy wtedy o pamięci dwurzędowej. Oprócz banków pamięci istnieją jeszcze rzędy. Oczywiście w danej chwili może być aktywny tylko jeden rząd. Jeśli chodzi o liczbę macierzy pamięciowych, to w przypadku tych wyprowadzających 4 bity musimy połączyć aż 16 układów, aby uzyskać słowo 64 bitowe. Jeśli liczba wyprowadzanych bitów jest równa 16, to wystarczy połączyć tylko cztery takie układy.

 

Rys. 4. Formy organizacji pamięci SDRAM

 

Płyta główna pozwala łączyć pamięci w tzw. kanały. Możemy mieć systemy 2, 3, 4 kanałowe. Pojedynczy układ pamięci RAM, montowany na płycie głównej, wyprowadza 64 bity danych. Pamięci wielokanałowe możemy rozumieć jako połączenie takich układów w celu zwielokrotnienia długości szyny danych odpowiednio 2, 3, 4 krotnie.

Błędy, które powstają w pamięciach, można sklasyfikować w dwóch głównych grupach:

  • błędy powtarzalne – trwałe uszkodzenia,
  • błędy sporadyczne – np. powstałe na skutek promieniowania jonizacyjnego α, β.

W celu wykrywania i eliminacji błędów w pamięciach niekiedy stosuje się specjalne, dodatkowe układy. Na początku stosowana była kontrola parzystości. Sposób ten ma wiele wad, np. nie wykrywa błędów na parzystej liczbie bitów. Stąd też kontrola parzystości została szybko zastąpiona inną metodą. W pamięciach z kontrolą ECC (ang. Error Correcting Code) stosuje się dodatkowy układ wykrywania i korekcji błędów. Zwykle jest to 8 dodatkowych bitów na 64 bitowe słowo pamięci. Specjalnie zaprojektowane algorytmy z bardzo dużym prawdopodobieństwem potrafią wykryć błąd i go skorygować. Ponieważ przeprowadzane są w tym celu dodatkowe obliczenia zwykle pamięci z ECC mają 1% do 3% gorsze wyniki wydajnościowe, niż pamięci bez takiej korekcji.

Wszystkie parametry potrzebne do poprawnej pracy pamięci synchronicznej są przechowywane w specjalnym pliku rejestrów (ang. Mode Register) wewnątrz układu pamięci. Parametry te są ustawiane przez producenta, ale wiele z nich można zmienić korzystając z ustawień w BIOS’ie. Jednak chęć przyspieszenia działania pamięci, może skutkować jej niestabilnym działaniem. Dlatego warto wiedzieć co oznaczają przynajmniej podstawowe parametry pamięci. Podstawowe parametry definiujące sposób pracy pamięci (tzw. timing) są często zapisywane w postaci czterech liczb: CL – RCD – RP – RAS. Sposób dostępu do danych jest pokazany na Rys. 5. Najpierw kontroler pamięci określa adres wiersza komórki pamięci, do której chcemy uzyskać dostęp. Adres kolumny jest wysyłany po upływie czasu tRCD. Następnie musi minąć czas oznaczony przez tCL, podczas którego dane są przesyłane do rejestru wyjściowego. Później w kolejnych cyklach zegarowych, na magistrali pojawiają się kolejne słowa z pamięci. Ich liczba, w tym przypadku 8, jest wcześniej programowana. Cały proces może rozpocząć się od nowa po upłynięciu czasów tRAS oraz tRP.

 

 

Rys. 5. Dostęp do danych w pamięci

 

Obecnie na rynku dominują pamięci DDR (ang. Double Data Rate). W tym przypadku pamięć jest taktowana dwoma komplementarnymi sygnałami zegarowymi, które są w przeciwfazie. Dane są transferowane w chwili przecięcia się sygnałów zegarowych, czyli dwukrotnie w czasie cyklu zegarowego. Bufory wyjściowe pamięci DDR zostały przystosowane do takiego trybu pracy. Ponieważ w trakcie taktu zegara dane są transferowane dwukrotnie, to przepustowość takiej pamięci również wzrosła dwukrotnie. Nieco inaczej działają pamięci DDR2 i DDR3. W tym przypadku istnieje różnica w taktowaniu macierzy pamięciowych i ich buforów wyjściowych. W pamięciach DDR2 macierze pamięciowe są taktowane dwa razy wolniej, a w pamięciach DDR3 4 razy wolniej niż bufory wyjściowe. Z kolei w jednym takcie wyprowadzane są 4 bity z pamięci DDR2 i 8 bitów z pamięci DDR3 (Rys.6).

 

Rys. 6. Porównanie pamięci DDR-400, DDR2-400 i DDR3-400

 

Macierze pamięciowe są taktowane wolniej, co wydłuża czas oczekiwania na dane, ale umożliwia konstruowanie pamięci o większych pojemnościach. Zwiększenie przepustowości pamięci jest osiągane dzięki szybkiemu taktowaniu buforów pamięci i doprowadzaniu do nich szerszych słów (4, 8 bitów).  Tak więc pamięci DDR2-800 pracują z częstotliwością 400 MHz, pamięci DDR2-1066 i DDR3-1066 z częstotliwością 533 MHz, pamięci DDR3-1333 z częstotliwością 666.6 MHz, itd. Pamięci DDR3 (np. 9-9-9-24) mają większe opóźnienia liczone w cyklach zegarowych do momentu rozpoczęcia transferu danych w porównaniu z pamięciami DDR2 (np. 4-4-4-11). Podobnie pamięci DDR2 mają większe opóźnienia liczone w cyklach zegarowych do momentu rozpoczęcia transferu danych niż DDR (np. 2.5-3-3-8). Nie koniecznie oznacza to dłuższy czas oczekiwania na dane (prawda dla pamięci pracujących z taką samą szybkością zegara). Typowo, pamięci DDR są zasilane napięciem 2.5 V, pamięci DDR2 napięciem 1.8 V, a DDR3 – 1.5 V (chociaż moduły wymagające napięcia 1.6 V albo 1.65 V są również w powszechnym użyciu).

Najnowsze pamięci DDR4 umożliwiają zastosowanie napięcia zasilania 1,2 V. Dzięki temu pamięć DDR4 charakteryzuje się zmniejszonym poborem mocy o około 20% w stosunku do pamięci DDR3. Opracowano moduły DDR4 o taktowaniu ponad 4000 MHz (większa przepustowość ) i pojemności 32 GB. Pamięci DDR4 nie są kompatybilne wstecz, tzn. nie współpracują z chipsetami obsługującymi DDR, DDR2 i DDR3. W tym przypadku nie zwiększono liczby bitów wyprowadzanych z pamięci w takcie zegara i wynosi ona 8, identycznie jak w pamięciach DDR3.

1.3. Budowa fizyczna pamięci podręcznej

Pamięć podręczna jest tworzona z modułów pamięci statycznej. Jest to pamięć znacznie droższa i o mniejszym stopniu upakowania komórek niż pamięć dynamiczna, z której jest zbudowana pamięć fizyczna komputera (RAM). W przypadku pamięci statycznych jest podawany na raz adres wiersza i kolumny. Macierz pamięciowa (ang. storage matrix) zawiera słowa (np. 4, 8 bitowe), które są adresowane i wyprowadzane z pamięci w jednym kroku (Rys. 7). Pamięci statyczne nie wymagają odświeżania.

 

Rys.7. Budowa pamięci statycznej

 

Pojedyncza komórka pamięci statycznej jest zbudowana w oparciu przerzutniki. Jest ona zwykle złożona z kilku do kilkunastu tranzystorów, stąd też niskie upakowanie elementów, ale duża szybkość działania i brak konieczności odświeżania pamięci (Rys. 8).

 

Rys.8. Komórka pamięci SRAM złożona z 6 tranzystorów CMOS [źródło: https://pl.wikipedia.org/wiki/SRAM_(pami%C4%99ci_komputerowe)]

1.4. Organizacja pamięci podręcznej

Zaobserwowano, że podczas wykonywania programu pewne instrukcje i dane są wykorzystywane wielokrotnie. Można z dużym prawdopodobieństwem przewidzieć, które instrukcje i dane będą potrzebne w następnym kroku. Najprościej rzecz ujmując dzieje się tak z dwóch powodów, po pierwsze mamy liniową sekwencję instrukcji w programie, po drugie często wykorzystywane są pętle. Daje po pole do sformułowania zasad lokalności: przestrzennej – związanej z rozmieszczeniem instrukcji w programie i czasowej – związanej z wykorzystaniem pętli. Gdybyśmy mogli przewidzieć, które instrukcje i dane będą potrzebne w następnym kroku, można by je było wcześniej sprowadzić do szybkich pamięci podręcznych, co znacznie przyspieszyłoby wykonanie programu.

Obecnie pamięci podręczne są częścią procesora i są implementowane w tym samym układzie scalonym. Zwykle występują trzy poziomy pamięci podręcznej. Poziom pierwszy L1 stanowi najszybszą pamięć. Jest ona jednocześnie dostępna tylko dla konkretnych rdzeni procesora. Pamięć ta jest rozdzielona: w odrębnym obszarze przechowywane są rozkazy, a w odrębnym dane. W przypadku wprowadzania do pamięci podręcznej L1 rozkazów często zachodzi ich wstępne dekodowanie. Pamięć poziomu drugiego L2 też jest dostępna tylko dla konkretnych rdzeni, z tym że jest to już pamięć wspólna dla rozkazów i danych. Jest to pamięć wolniejsza od L1. Najbardziej pojemna pamięć poziomu trzeciego L3 jest wspólna dla wszystkich rdzeni (Rys. 9).

 

Rys.9. Intel Core I7 950 – organizacja pamięci cache

 

To właśnie dostęp do tej pamięci decyduje o tym, że procesory wielordzeniowe mogą szybko i efektywnie pracować na wspólnych danych. Organizacja pamięci podręcznych jest ściśle powiązana z konkretną architekturą procesora i może być różna w przypadku różnych procesorów.

1.5. Obsługa pamięci podręcznej

Można wyróżnić dwie główne części, z których jest zbudowana pamięć podręczna (Rys.10). Część pierwszą stanowi tzw. część skojarzeniowa (CAM – ang. Content Addressable Memory). W tej części przechowywane są bity statusu służące do zapewnienia spójności pamięci oraz etykiety adresów linii, które umożliwiają odszukanie konkretnej linii w pamięci podręcznej. Druga część to linie wymiany, czyli dane w pamięci podręcznej. Linie wymiany zawierają 2^k bajtów i są zazwyczaj dość długie (64, 128, 256, 512 bajtów). Optymalny rozmiar linii wymiany dostosowany jest do  rozmiaru magistrali danych i możliwości transferów blokowych.

 

Rys.10. Budowa pamięci podręcznej

 

Obsługa pamięci podręcznej musi umożliwić przeprowadzenie pewnych podstawowych operacji. Pierwszą z tych operacji jest unieważnienie linii. Jeśli linia w pamięci podręcznej jest nieważna, jest ona nieużywana i można w niej coś zapisać. Linię nieważną oznacza odpowiedni bit statusu. Drugą z operacji jest wypełnienie linii, czyli zapis danych do odpowiedniej linii pamięci podręcznej. Pobranie danych z pamięci RAM może być wymuszone, czyli zachodzi tylko wtedy, kiedy dane są potrzebne. Pobranie danych może być też realizowane jako uprzedzające. Wtedy, wraz z potrzebną linią danych, wczytywana jest następna, w nadziei, że za chwilę będzie używana. Nakład czasowy na pobrania uprzedzające jest mniejszy, niż w przypadku wczytywania linii tylko na żądanie. Następną operacją jest odczyt danej. W tym przypadku musi istnieć mechanizm umożliwiający identyfikację linii, czyli porównanie jej adresu z adresem potrzebnych danych, tak aby stwierdzić, czy dane znajdują się w zapisanej linii. Należy też pamiętać, że linie są długie, mogą zawierać nawet kilkaset bajtów, musi więc istnieć jeszcze mechanizm umożliwiający dostęp do konkretnych bajtów linii. Kolejną operacją jest zapis linii pamięci podręcznej w pamięci RAM. Jest on realizowany, gdy dane nie są już potrzebne, albo brakuje wolnych linii w pamięci podręcznej. Jest to najbardziej skomplikowana operacja i może być realizowana w różny sposób. Obecnie we wszystkich procesorach klasy PC wykorzystywany jest zapis lokalny (zwrotny, ang. write back). W przypadku takiego zapisu dane nie są od razu umieszczane w pamięci RAM. Mogą być one przerzucone z pamięci L1 do pamięci L2 lub L3, a do RAM wpisane w dogodnym momencie. Niewątpliwie jest to szybsza operacja niż aktualizowanie RAM za każdym razem. Niestety w tym przypadku kopie tych samych danych w RAM i poszczególnych poziomach pamięci podręcznej L1, L2, L3 mogą być różne. W celu zapewnienia spójności danych konieczne jest zastosowanie specjalnego mechanizmu kontroli danych. Jest wiele różnych rozwiązań tego problemu. W komputerach klasy PC najczęściej stosuje się jakąś odmianę protokołu MESI (o którym będzie mowa dalej). Protokół ten wykorzystuje bity statusu w pamięci podręcznej. Istnieją też prostsze sposoby zapisu, nie powodujące utraty spójności danych, ale dużo mniej optymalne pod kątem czasu potrzebnego do zapisu linii. W zapisie skrośnym (jednoczesnym, ang. write through) uaktualniane są jednocześnie wszystkie poziomy pamięci podręcznej i RAM. W zapisie bezpośrednim (omijającym) uaktualniana jest jedynie pamięć RAM, a dane we wszystkich poziomach pamięci podręcznych są unieważniane. Inną, ważną czynnością jest wybór linii do zapisania do RAM (skasowania) w momencie kiedy brakuje już wolnych linii. Prostym rozwiązaniem jest zastosowanie metody kolejkowej (FIFO), w której usuwana jest linia, która najdłużej przebywa w pamięci. Inną prostą metodą jest losowe typowanie linii do usunięcia. Obie powyższe metody nie są optymalne. Dużo trudniejsza w implementacji jest metoda Last Recently Used (RLU), w której usuwa się linię, która nie była używana do najdłuższego czasu. Metoda ta najlepiej przybliża metodą optymalną, ale wymaga pewnego zaplecza sprzętowego, przez co jest trudniejsza w implementacji.

1.6. Sposób kojarzenia adresów (odwzorowania) linii

W pamięci RAM możliwy jest dostęp do poszczególnych bajtów. Pamięć podręczna jest zorganizowana w linie o rozmiarze dziesiątek, czy setek bajtów. Trzeba w jakiś sposób zapewnić odwzorowanie pamięci RAM w pamięć podręczną. Można to zrealizować na wiele sposobów. Wyróżniamy trzy podstawowe sposoby odwzorowania linii:

  • pamięci całkowicie skojarzeniowe (ang. fully associative),
  • pamięci z odwzorowaniem bezpośrednim (ang. direct mapped),
  • pamięci wielodrożne (ang. set-associative).

W każdym przypadku najpierw należy podzielić pamięć RAM na linie o takim samym rozmiarze jak linie pamięci podręcznej. Załóżmy, że pamięć RAM zawiera 1048575 takich linii (Rys. 11). Pamięć podręczna jest zawsze mniej pojemna niż pamięć RAM, załóżmy, że jest 4096 linii w tej pamięci. Jeśli każda linia z pamięci RAM może być umieszczona w dowolnej linii pamięci podręcznej, to mówimy, że pamięć podręczna jest całkowicie skojarzeniowa. W tym przypadku wykorzystanie pamięci podręcznej jest optymalne, ale czas wyszukiwania linii jest długi, bo trzeba porównać etykiety adresu każdej z linii, aby stwierdzić czy dana linia znajduje się już w pamięci podręcznej (Rys.11).

Rys. 11. Pamięć podręczna całkowicie skojarzeniowa (ang. fully associative)

 

Odmienną organizację ma pamięć z odwzorowaniem bezpośrednim. W tym przypadku priorytetem jest szybkość odnajdywania linii w pamięci podręcznej. Linie w pamięci RAM są podzielone na rozłączne bloki (Rys.12). Powiedzmy, że do bloku należą te linie, których trzy ostatnie cyfry adresu są takie same (np. 00000, xx000, FF000). W ten sposób powstaje 4096 bloków po 256 linii (razem 1048575 linii). Zauważmy, że linie należące do poszczególnych bloków są porozrzucane w pamięci RAM (nie przylegają do siebie). Pomięć podręczna zawiera 4096 linii (tyle samo ile jest bloków). W odwzorowaniu bezpośrednim w każdej określonej linii pamięci podręcznej może być umieszczona tylko jedna linia z odpowiadającego jej bloku, czyli muszą się zgadzać trzy końcowe cyfry adresu. W ten sposób, gdy szukana jest linia w pamięci podręcznej, określany jest blok, do którego dana linia należy i porównywana jest etykieta adresu tylko jednej linii skojarzonej z tym blokiem. Szybkość wyszukiwania jest bardzo duża. Problem może się pojawić, kiedy na raz potrzebne są dwie (albo więcej) linie z tego samego bloku. Chociaż taka sytuacja jest mało prawdopodobna, to w końcu się wydarzy. Ponieważ z danego bloku tylko jedna linia może być w pamięci podręcznej, to linie będą wymieniane co chwila znacznie obniżając wydajność całego systemu.

Rys.12. Pamięć podręczna z odwzorowaniem bezpośrednim (ang. direct mapped)

 

Rozwiązaniem powyższego problemu jest pamięć wielodrożna (Rys.13). Tu również pamięć RAM jest podzielona na bloki. Każdemu blokowi pamięci RAM odpowiada jednak nie jedna linia pamięci podręcznej, ale odpowiedni blok linii (w tym przypadku 4, stąd pamięć 4-drożna). W pamięci podręcznej mamy zatem 4096 bloków po 4 linie. Tak jak poprzednio linia z określonego bloku z pamięci RAM może się znaleźć tylko w odpowiednim, jednym bloku pamięci podręcznej (przyporządkowanie jak poprzednio). Tu jednak do dyspozycji mamy 4 linie, więc cztery linie z jednego bloku pamięci RAM można umieścić w pamięci podręcznej. Prawdopodobieństwo, że linie z tego samego bloku będą wzajemnie wyrzucały się z pamięci podręcznej jest dużo mniejsze. Jednocześnie pamięć o takiej organizacji jest szybka, do skojarzenia adresów linii potrzebne są w tym przypadku tylko cztery porównania. Obecnie pamięci cache wbudowane w procesory klasy PC mają taką właśnie organizację, przy czym wykorzystywane są pamięci 4-ro, 8-mio, 16-to drożne.

 

Rys.13. Wielodrożna pamięć podręczna (ang. set-associative)

 

1.7. Protokół MESI

Do zapewnienia spójności wielopoziomowej pamięci podręcznej może być użyty protokół MESI. Istnieje wiele jego odmian. W najprostszej postaci wyróżniamy cztery stany linii pamięci:

  • nieważna (I – Invalid),
  • wspólna (S – Shared),
  • wyłączna (E – Exclusive),
  • zmodyfikowana (M – Modified).

Stany te są zapamiętywane w bitach statusu pamięci podręcznej. Ustawienie stanu na I (nieważny) oznacza, że linia pamięci podręcznej jest niewykorzystywana, może być użyta do zapisu danych. W momencie kiedy dane zostają wpisane po raz pierwszy do pamięci podręcznej otrzymują status E (wyłączny). Oznacza to, że dana jest ważna i nie występuje jej kopia w innej pamięci podręcznej (np. związanej z innym rdzeniem). Kopia w RAM jest aktualna. Kiedy taka dana jest powielona do innej pamięci podręcznej otrzymuje status S (wspólny). Oznacza to, że istnieją kopie tej danej w innych pamięciach podręcznych i RAM, wszystkie kopie są ważne. Kiedy dana jest zmodyfikowane otrzymuje status M (zmodyfikowany). W tym wypadku inne jej kopie w pamięci podręcznej tracą ważność, również dana w pamięci RAM jest nieaktualna. Poszczególne stany protokołu MESI są przedstawione w tabeli 1.

 

 

Tabela 1. Stany MESI

 

M

zmodyfikowany

E

wyłączny

S

wspólny

I

nieważny

Czy linia pamięci podręcznej jest ważna?

Tak

Tak

Tak

Nie

Kopia pamięci jest …

nieaktualna

ważna

ważna

-

Czy istnieją kopie w innych pamięciach podręcznych?

Nie

Nie

Być może

Być może

 

obrazów coraz częściej używanych w procesie rozpoznawania obiektów.