Mam wrażenie, że jeszcze kilka lat temu każda reklama laptopa składała się wyłącznie z wykrzykiwanych przez lektora kolejnych angielskich skrótów (np. RAM, SSD, HDMI), czasami wraz z wartościami liczbowymi je opisującymi. Wydaje mi się, że celem tych reklam nie było przekazanie widzowi informacji o parametrach sprzedawanego sprzętu, a jedynie zrobienie wrażenia na tych, którzy nie wiedzieli, co oznaczają wymienione skróty i wartości liczbowe, tak aby zyskali przekonanie, że prezentowany laptop korzysta z najnowszych technologii w ich najlepszym wydaniu. Z biegiem czasu ilość takich reklam się zmniejszała, pewnie przez fakt, że coraz więcej konsumentów ma świadomość, czym różni się np. pamięć RAM od dysku SSD.
W tym artykule skupimy się właśnie na parametrach związanych z pamięcią.
Wiemy, że rodzajów pamięci w komputerze jest kilka – mamy m.in. rejestry, cache, RAM, dysk SSD, dysk twardy.
To, czym się one od siebie różnią, świetnie opisał Tomasz Idziaszek w artykule Pamięć w komputerze w
W jaki sposób ta zależność między ilością a szybkością różnych rodzajów pamięci wpływa na działanie procesora? Generalnie zasada jest prosta – jeśli procesor musi skorzystać z danych, które znajdują się w wolniejszej pamięci, to przenosi je do szybszej pamięci, aby mieć do nich łatwiejszy dostęp. W teorii brzmi świetnie, ale przecież szybszej pamięci mamy mniej. Co, jeśli procesor chce przenieść jakieś dane z dysku SSD do pamięci RAM, ale okazuje się, że jest ona już w całości wypełniona? Nie ma rady, trzeba wtedy coś z pamięci RAM usunąć (np. zapisać część danych z powrotem na dysku SSD, zwalniając fragment RAM-u). No dobrze, ale jak wybrać, które dane odeślemy na SSD? Na pewno jeśli w RAM-ie mamy jakieś dane, z których nie będziemy korzystać w najbliższym czasie, to wydają się one dobrym kandydatem – przecież i tak nie są nam potrzebne w pamięci z szybkim dostępem. Ponadto, jeśli do jakiejś porcji danych odwołujemy się co chwila, to odesłanie ich na dysk SSD skończy się tym, że za chwilę znów będziemy musieli je ściągać do RAM-u, co spowolni działanie komputera. Widać więc, że podjęcie właściwej decyzji jest kluczowe dla zapewnienia efektywnego działania komputera.
Teoretyczny model pamięci w komputerze
Aby przeanalizować przedstawiony problem w szczegółach, posłużymy się uproszczonym modelem pamięci w komputerze.
Założymy mianowicie, że mamy tylko dwa jej rodzaje – pamięć szybką i pamięć wolną.
Komputer zwykle operuje na większych fragmentach pamięci, nazywanych stronami (w zależności od kontekstu mówimy też o blokach albo ramkach) – typowy rozmiar strony to coś rzędu
Strategia FIFO
Jednym z możliwych algorytmów wyboru, którą stronę zapomnieć, jest strategia FIFO (ang. first in, first out).
Zgodnie z jej założeniami, jeśli musimy zapomnieć którąś stronę, to wybieramy tę, która była najdawniej załadowana do pamięci szybkiej.
Prześledźmy działanie tego algorytmu na konkretnym przykładzie.
Załóżmy, że w pamięci szybkiej możemy zmieścić
Błąd | * | * | * | * | * | * | * | * | * | |||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Ciąg odwołań | D | E | C | A | D | E | B | D | E | C | A | B |
Zawartość szybkiej pamięci | D | D | D | E | C | A | D | D | D | E | B | B |
E | E | C | A | D | E | E | E | B | C | C | ||
C | A | D | E | B | B | B | C | A | A |
Okazało się, że dla tego ciągu strategia FIFO spowodowała aż
Błąd | * | * | * | * | * | * | * | * | * | * | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Ciąg odwołań | D | E | C | A | D | E | B | D | E | C | A | B |
Zawartość szybkiej pamięci | D | D | D | D | D | D | E | C | A | B | D | E |
E | E | E | E | E | C | A | B | D | E | C | ||
C | C | C | C | A | B | D | E | C | A | |||
A | A | A | B | D | E | C | A | B |
Czyli rzeczywiście dla większej liczby dostępnych ramek algorytm FIFO zrobił mniej błędów braku strony.
Zaraz! Przecież teraz mieliśmy
Cechą niektórych algorytmów wymiany strony jest to, że przy odpowiednio spreparowanym ciągu odwołań zwiększenie liczby dostępnych ramek w pamięci szybkiej zwiększa liczbę błędów braku strony.
Taką sytuację nazywamy anomalią Bélády’ego,
od nazwiska informatyka, który w 1969 roku zademonstrował ją po raz pierwszy.
Nie oznacza to jednak, że przy każdym ciągu odwołań zwiększenie liczby ramek będzie skutkowało większą liczbą błędów. Dla przykładu, jeśli dla rozważanego ciągu zwiększymy dostępną szybką pamięć do
Algorytm FIFO, mimo że jest bardzo prosty w implementacji (wystarczy trzymać jedną kolejkę ze stronami wczytywanymi do pamięci szybkiej), nie jest w praktyce używany we współczesnych systemach operacyjnych. Wynika to z tego, że nie bierze pod uwagę, czy do jakiejś strony były ostatnio odwołania, a tylko kiedy była wczytana, co intuicyjnie nie ma związku z częstością korzystania z niej.
Strategia LRU
Strategia, która wydaje się lepszym rozwiązaniem problemu zarządzania pamięcią, to LRU (ang. least recently used). Mówi ona, żeby usuwać tę stronę, która była używana najdawniej. Jest ona trudniejsza do implementacji od strategii FIFO, ale we współczesnych systemach operacyjnych używa się jej albo jakichś jej przybliżeń. Zobaczmy, jak strategia ta radzi sobie z rozważanym ciągiem odwołań, analizując jej działanie dla
Błąd | * | * | * | * | * | * | * | * | * | * | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Ciąg odwołań | D | E | C | A | D | E | B | D | E | C | A | B |
Zawartość szybkiej pamięci | D | D | D | E | C | A | D | E | B | D | E | C |
E | E | C | A | D | E | B | D | E | C | A | ||
C | A | D | E | B | D | E | C | A | B |
Wyszło nam
Twierdzenie.
Strategia LRU jest wolna od anomalii Bélády’ego. To znaczy, dla dowolnego ciągu odwołań do pamięci
Szkic dowodu. Wystarczy porównać zawartość pamięci szybkiej w obu algorytmach przy danym ciągu odwołań. W każdym momencie algorytm z
Strategia optymalna
Rozpatrzyliśmy już dwa algorytmy wymiany stron. Dla rozważanego ciągu przy strategii FIFO z trzema ramkami wystąpiło
Okazuje się, że strategię optymalną można bardzo łatwo opisać – z pamięci szybkiej należy zapominać tę stronę, do której odwołanie nastąpi najpóźniej w przyszłości. Dla rozważanego ciągu jeśli zastosujemy strategię optymalną z
Błąd | * | * | * | * | * | * | * | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Ciąg odwołań | D | E | C | A | D | E | B | D | E | C | A | B |
Zawartość szybkiej pamięci | D | D | D | D | E | D | D | E | B | B | B | B |
E | E | E | D | E | E | B | E | C | A | A | ||
C | A | A | A | B | D | D | E | B | C |
Tym razem było tylko
Skoro znamy strategię optymalną, to czemu w ogóle rozważaliśmy FIFO i LRU? Jako że jest optymalna, to przecież najbardziej opłaca się ją zaimplementować w systemie operacyjnym! Otóż strategia optymalna ma jedną podstawową wadę – nie da się jej zaimplementować w praktyce. Decyzja o tym, którą stronę usunąć, wymagała, żeby przeanalizować, jakie odwołania do stron pojawią się w przyszłości, a przecież żaden komputer nie potrafi przewidzieć, co zaraz zrobi użytkownik.
Ma on wiedzę tylko o tym, jakie odwołania pojawiały się w przeszłości. Tak to niestety się czasami zdarza, że teoretycznie najlepsze rozwiązania nie są możliwe do zrealizowania w praktyce.
Okazuje się jednak, że strategia LRU z