Podręcznik

1. Pamięci ROM

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.