Pamięć podręczna

Z Wikipedii, wolnej encyklopedii

Pamięć podręczna (ang. cache) – mechanizm, w którym część spośród danych zgromadzonych w źródłach o długim czasie dostępu i niższej przepustowości jest dodatkowo przechowywana w pamięci o lepszych parametrach. Ma to na celu poprawę szybkości dostępu do tych informacji, które przypuszczalnie będą potrzebne w najbliższej przyszłości.

Pamięć podręczna jest elementem właściwie wszystkich systemów – współczesny procesor ma 2 albo 3 poziomy pamięci podręcznej oddzielającej go od pamięci RAM. Dostęp do dysku jest buforowany w pamięci RAM, a dokumenty HTTP są buforowane przez pośredniki HTTP oraz przez przeglądarkę.

Systemy te są tak wydajne dzięki lokalności odwołań – jeśli nastąpiło odwołanie do pewnych danych, jest duża szansa, że w najbliższej przyszłości będą one potrzebne ponownie. Niektóre systemy pamięci podręcznej próbują przewidywać, które dane będą potrzebne i pobierają je, wyprzedzając żądania. Na przykład pamięć podręczna procesora pobiera dane w pakietach po kilkadziesiąt czy też więcej bajtów, pamięć podręczna dysku zaś nawet do kolejnych kilkuset kilobajtów czytanego właśnie pliku.

Niektóre systemy pamięci podręcznej umożliwiają informowanie systemu na temat charakteru danych, by umożliwiać bardziej efektywne buforowanie. Służy temu np. wywołanie systemowe madvise.

Zasady projektowania pamięci podręcznej[edytuj | edytuj kod]

Część systemu komputerowego zajmująca się buforowaniem danych powinna charakteryzować się następującymi właściwościami:

  • powinna być jak najbardziej automatyczna
  • jej działanie nie powinno wpływać na semantykę pozostałych części systemu
  • powinna w jak największym stopniu poprawiać wydajność systemu w warunkach rzeczywistej pracy

Projektując pamięć podręczną, rozpatruje się pewne typowe warunki, w jakich będzie ona wykorzystywana. Program korzystający z pamięci podręcznej ma więcej informacji na temat użycia pamięci w najbliższym czasie, i wydajność systemu można polepszyć, jeśli zrezygnuje się z pełnej automatyzacji, a pozwoli na dawanie pamięci podręcznej sugestii co do właściwego zachowania w danej sytuacji. W ten sposób działa m.in. wywołanie systemowe madvise, specjalne instrukcje asemblera na niektórych procesorach, nagłówki kontroli pamięci podręcznej w HTTP; wiele systemów zarządzania bazami danych pozwala też na przekazywanie kontrolerowi pamięci sugestii.

Zadanie pamięci podręcznej można wyrazić w następujący sposób: mamy duży zbiór obiektów w powolnej pamięci, i niewielką ilość szybkiej pamięci, w której na pewno nie pomieszczą się wszystkie obiekty. Ciągle napływają żądania dostępu do obiektów, a pamięć podręczna musi je wszystkie spełnić w jak najmniejszym stopniu, korzystając z pamięci powolnej.

Temperatura danych[edytuj | edytuj kod]

Przy rozpatrywaniu systemu pamięci podręcznej przydatne jest pojęcie „temperatury” – czyli prawdopodobieństwa, że w najbliższym czasie wpłynie żądanie dostępu do tego obiektu (jeśli obiekt jest duży, temperatura poszczególnych części może się różnić). Jest oczywiste, że powinniśmy w szybkiej pamięci trzymać obiekty o możliwie wysokiej temperaturze. Jednak temperatura obiektu nie jest znana, i musimy jakoś ją oszacować. Typowe heurystyki to:

  • lokalność czasowa – jeśli obiekt był ostatnio żądany, to jest duże prawdopodobieństwo, że będzie żądany ponownie w najbliższym czasie
  • lokalność przestrzenna – jeśli obiekt był ostatnio żądany, to prawdopodobnie będą też żądane obiekty leżące blisko niego. Położenie w wypadku pamięci komputera oznacza zwykle adres maszynowy. W przypadku plików na stronie internetowej, pliki linkujące do siebie leżą blisko siebie.
  • o niektórych typach obiektów wiemy, że ich średnia temperatura jest wyższa niż innych typów – np. temperatura pliku (z grubsza proporcjonalna do liczby ściągnięć) xhtml/html na stronie internetowej jest zazwyczaj wyższa niż temperatura pliku pdf.

Żeby zmaksymalizować średnią temperaturę układu pamięci podręcznej, należałoby operować na poziomie jak najmniejszych jednostek, np. kilku bajtów. Byłoby to jednak bardzo niepraktyczne (obiekty zwykle są większe), więc używa się większych jednostek – np. w DBMS kilkudziesięciokilobajtowych stron. Strona taka może zawierać wiele obiektów. W miarę możliwości powinno się tak projektować strony, aby obiekty na jednej stronie miały podobną i skorelowaną temperaturę.

Jeśli na każdej stronie znajdowałyby się zarówno obiekty gorące, jak i chłodne, niemożliwe byłoby uzyskanie wysokiej temperatury układu pamięci podręcznej. Jeśli natomiast niektóre strony będą znacznie cieplejsze od innych, układ pamięci podręcznej może zawierać te pierwsze i osiągnąć wyższą temperaturę. Na przykład w typowym drzewie indeksowym obiekty są relatywnie chłodne, natomiast wskaźniki są znacznie gorętsze. Tak więc trzymanie danych tylko na liściach pozwala na znacznie lepszą separację niż gdyby trzymać je na każdym węźle.

W miarę możliwości powinno się trzymać na stronie obiekty o skorelowanej temperaturze, np. strony pamięci wirtualnej procesora zawierają leżące po kolei bajty, które ze względu na lokalność przestrzenną mają prawdopodobnie skorelowane temperatury. Z tego też powodu używa się osobnych linii pamięci podręcznej dla danych i dla kodu.

Przykłady pamięci podręcznej[edytuj | edytuj kod]

Pamięć podręczna procesora[edytuj | edytuj kod]

 Osobny artykuł: Pamięć podręczna procesora.

Pamięć podręczna przyspiesza dostęp do relatywnie wolnej pamięci RAM. Charakteryzuje się bardzo krótkim czasem dostępu. Jest używana do przechowywania danych, które będą w niedługim czasie przetwarzane. Na współczesnych procesorach są 2 lub 3 poziomy pamięci podręcznej L1 (zintegrowana z procesorem), a także L2 i L3 (umieszczone w jednym układzie scalonym razem z procesorem lub na płycie głównej).

Pamięć podręczna dysku twardego[edytuj | edytuj kod]

Pamięć podręczna dysku twardego przyspiesza dostęp do bardzo wolnej pamięci masowej (w porównaniu do pamięci RAM, do której dane są pobierane). Pamięć podręczna o wielkości od 128 KB do 128 MB jest zazwyczaj podzielona na dwie części: obszar podsystemu odpowiedzialnego za odczyt z wyprzedzeniem i buforowanie odczytu oraz mniejszy obszar opóźnionego zapisu. Dysk z kontrolerem komunikuje się magistralą szybszą niż najszybsze budowane dyski twarde – daje to możliwość przechowania danych w buforze i wysłania do kontrolera bez wykonywania cyklu dostępu do nośnika oraz wpływa pozytywnie na szybkość całego systemu.

Pamięć podręczna systemu plików[edytuj | edytuj kod]

Oprócz pamięci podręcznej dysku twardego, system operacyjny zarządza umieszczaniem zawartości plików w pamięci podręcznej oraz metadanych (jak katalogi, nazwy plików itp.) w pamięci operacyjnej (RAM), w ten sposób zmniejszając użycie dysku zarówno podczas odczytu tych samych danych, jak i zapisu. Taka pamięć podręczna ma zwykle od kilku megabajtów do kilku gigabajtów, a jej rozmiar i zawartość jest regulowana dynamicznie w zależności od sposobu użycia systemu. Niektóre systemy plików potrafią również użyć np. lokalnego dysku jako pamięci podręcznej danych z sieciowego systemu plików, czy też szybszego dysku SSD jako pamięci podręcznej danych odczytywanych z powolnego dysku magnetycznego.

Pamięć podręczna przeglądarki[edytuj | edytuj kod]

Pamięć podręczna przeglądarki oznacza miejsce na dysku twardym, w którym przeglądarka internetowa przechowuje odwiedzone uprzednio strony (lub części stron) WWW. Ma to na celu przyśpieszenie przeglądania stron internetowych, gdyż nie ma potrzeby ściągania odwiedzonych już stron z Internetu. Często wskazanym procesem jest czyszczenie schowka przeglądarki.