Systemy Komputerowe - wykłady
14. Koncepcja pamięci podręcznej (cache)
Koncepcja pamięci kieszeniowej wynika bezpośrednio z własności pamięci statycznych (SRAM) i dynamicznych (DRAM). Jak było to przedstawione wcześniej pamięci statyczne są szybsze od pamięci dynamicznych, natomiast pobierają więcej energii i są zdecydowanie droższe. Ponadto są układami o niższym stopniu scalenia. Z tych powodów nie jest możliwe zbudowanie całej pamięci operacyjnej z pamięci statycznych. Z drugiej strony pamięci dynamiczne są zbyt wolne dla szybkich współczesnych procesorów i wymagają przy dostępie długich stanów oczekiwania. Aby zmniejszyć ten efekt, wprowadzono koncepcję wykorzystującą dwa rodzaje pamięci. Pamięć systemu składa się z relatywnie dużej pamięci operacyjnej (rzędu kilkudziesięciu do kilkuset MB) zbudowanej z pamięci dynamicznych oraz z mniejszej (kilka do kilkuset KB), lecz znacznie szybszej pamięci kieszeniowej zbudowanej z pamięci statycznych. Zastosowany w systemie sterownik koordynuje współpracę pamięci z pozostałymi układami. W przypadku operacji na pamięci sterownik (tzw. sterownik pamięci cache) ten sprawdza, czy poszukiwana informacja znajduje się w pamięci cache. Jeżeli tak, operacja jest wykonywana na pamięci cache, bez stanów oczekiwania. Sytuacja taka nazywana jest trafieniem. W przypadku nieobecności informacji w pamięci cache, następuje dostęp do pamięci operacyjnej z koniecznymi stanami oczekiwania. Jest to tak zwane chybienie.
Elementy i organizacja systemu pamięci cache
System pamięci kieszeniowej cache składa się z trzech zasadniczych elementów:
banku danych pamięci cache (pamięci danych) przeznaczonego do przechowywania zapisywanej i odczytywanej informacji,
katalogu pamięci cache (tzw. TAG-RAM) służącego do szybkiego sprawdzania, czy poszukiwana informacja znajduje się w pamięci danych,
sterownika pamięci cache, którego zadaniem jest zapewnienie współpracy pamięci kieszeniowej z systemem, a przede wszystkim zapewnienie zgodności zawartości pamięci cache z pamięcią główną.
W celu zapewnienia możliwości szybkiego sprawdzenia, czy komórka pamięci, na której ma być wykonana operacja, jest odwzorowana w pamięci cache, bank danych i katalog, tworzą tzw. jednoblokową pamięć asocjacyjną.
Pamięć cache stanowi jeden blok, który jest dzielony na zestawy. Pamięć główna dzielona jest na strony o rozmiarze równym rozmiarowi bloku pamięci cache. Strony są z kolei również dzielone na zestawy, przy czym ilość zestawów w stronie jest identyczna jak w bloku pamięci cache. Każdy zestaw w pamięci cache ma swoją pozycję w katalogu TAG-RAM. Zawiera ona adres strony z którego pochodzi dany zestaw. Każdy zestaw jest wpisywany na miejsce w pamięci cache do zestawu o numerze zgodnym z numerem zestawu na stronie. Umożliwia to szybkie sprawdzenie obecności zestawu poprzez sprawdzenie adresu bloku w określonej pozycji katalogu.
Rys 14.1. Organizacja jednoblokowej pamięci cache (przykład wymiany danych)
W przypadku wymiany zestawu na danej pozycji modyfikowany jest adres bloku w pozycji katalogu odpowiadającej temu zestawowi. Analizując przykład na rys 14.1. łatwo zauważyć, że w wyniku np. odczytu odpowiednich komórek w pamięci cache są odwzorowane zestawy 3 i 4 ze strony 0 oraz zestaw 2 ze strony 1. Jeżeli w tej sytuacji adres skierowany przez procesor do pamięci kieszeniowej dotyczy jednego z tych zestawów wówczas mamy do czynienia z trafieniem. Jest więc możliwość bezpośredniego wykorzystania dostępnych w banku pamięci cache danych.
Jeżeli w kolejnym (czwartym) kroku nastąpi odwołanie do zestawu 4 na stronie 2, to danych tych nie da się odczytać z pamięci kieszeniowej, ale trzeba się odwołać wprost do pamięci RAM. Przy okazji zestaw ten zostanie wpisany w banku danych na miejsce istniejącego zestawu 4 ze strony 0. Jednocześnie w pozycji katalogu cache odpowiadającej danemu zestawowi w miejsce strony 0 zostanie wpisana strona 2. Mówi się wówczas, że nastąpiło chybienie.
Architektura systemu z pamięcią cache
Organizacja pamięci kieszeniowej może być realizowana w oparciu o jedną z dwóch podstawowych rodzajów architektury systemu:
architektury Look-through,
architektury Look-aside.
Architektura Look-through
Sposób połączenia pamięci kieszeniowej przy architekturze Look-through pokazano na rys. 14.2.
Rys. 14.2. Architektura Look-through
Jak widać pamięć cache połączona jest magistralą lokalną z procesorem oddzielając go od reszty systemu. W przypadku trafienia główna magistrala systemu nie jest używana, co powoduje dodatkowe zwiększenie szybkości działania systemu, poprzez możliwość wykorzystania tej magistrali przez innego zarządcę (np. sterownik DMA). Żądanie dostępu do pamięci głównej tylko w przypadku chybienia. Inicjowany jest wówczas cykl magistrali głównej z koniecznymi stratami oczekiwania.
Architektura Look-aside
Sposób połączenia pamięci kieszeniowej przy architekturze Look-aside pokazano na rys. 14.3.
Rys. 14.3. Architektura Look-aside
W tej architekturze, w przeciwieństwie do architektury Look-through, procesor nie jest odizolowany od reszty układów. Dostęp do pamięci cache oraz pamięci głównej realizowany jest poprzez magistralę główną co powoduje, że nawet w przypadku trafienia magistrala jest niedostępna dla innych zarządców. Niewątpliwą jednak zaletą tej architektury jest prostsza konstrukcja, niższy koszt i nieco szybsza realizacja operacji w przypadku chybienia.
Zapewnienie zgodności pamięci cache z pamięcią główną
Wspomniano już wcześniej, że jedną z funkcji sterownika pamięci cache jest zapewnienie zgodności zawartości pamięci cache z pamięcią główną. Problem ten zostanie opisany w tym miejscu nieco szerzej.
Niezgodność zawartości pamięci cache z zawartością pamięci głównej RAM występuje w dwóch przypadkach:
zapisano do pamięci cache dane bez zapisu tych danych do pamięci głównej,
zapisano do pamięci głównej dane baz zapisu tych danych do pamięci cache.
Czasowa niezgodność pamięci jest dopuszczalna, nie wolno natomiast dopuścić do sytuacji, w której zostanie użyta nieaktualna informacja.
Pierwsza sytuacja występuje w przypadku trafienia przy zapisie.
W przypadku zapisu do pamięci cache stosowane są następujące strategie utrzymania zgodności:
Write-through
buforowanie Write-through
Write-back.
W strategii Write-through każdy zapis do pamięci cache powoduje jednocześnie zapis do pamięci głównej. Jest to rozwiązanie bardzo proste i pewne, niestety powo-dujące zmniejszenie szybkości działania systemu (każdy zapis to zapis do „wolnej” pamięci głównej).
Buforowane (lub inaczej opóźnione) Write-through polega na zapisaniu informacji, zarówno w przypadku trafienia, jak i chybienia, do bufora sterownika cache, przy czym procesor widzi tę operację jako dostęp do pamięci bez stanów oczekiwania. W rzeczywistości operacja zapisu do pamięci głównej jest realizowana później (jest opóźniona). Stany oczekiwania występują dla procesora jedynie w przypadku kolejno po sobie następujących zapisów do pamięci. Pomiędzy zapisem informacji do pamięci cache, dostęp do magistrali dla innych zarządców magistrali jest blokowany w celu uniknięcia użycia nieaktualnej informacji (dodatkowy powód tej operacji to potrzeba dostępności magistrali dla dokonania przepisania informacji z bufoni).
W przypadku strategii Write-back zawartości pamięci cache i pamięci głównej są uzgadniane tylko w przypadku takiej potrzeby. Występuje ona, gdy inny zarządca magistrali chce skorzystać z komórki pamięci głównej, która zawiera nieaktualną informację lub gdy w pamięci cache wymieniana jest linia zawierająca informację nową. Budowa pamięci cache stosującej strategię Write-back jest bardziej skomplikowana, gdyż, jak wynika z powyższego opisu, należy śledzić operacje magistrali na pamięci głównej dotyczące innych zarządców magistrali. W przypadku operacji na komórkach odwzorowanych w pamięci cache należy przeprowadzić jej uaktualnienie.
Drugi przypadek, dla którego może wystąpić niezgodność pamięci głównej i pamięci cache występuje, gdy inny (niż procesor główny) zarządca magistrali dokonuje zapisu do pamięci (na przykład w przypadku transmisji DMA do pamięci głównej. Najczęściej używaną metodą utrzymania zgodności dla takiego przypadku, jest śledzenie przez sterownik cache operacji magistral. Reakcja systemu pamięci cache zależy od strategii stosowanej do utrzymania zgodności przy zapisie informacji przez procesor.
5