//Pytanie: "Zarządzanie pamięcią wirtualną w systemie Linux"//

====== Pamięć wirtualna ======



System pamięci wirtualnej systemu Linux odpowiada za opiekę nad przestrzenią adresową widoczną dla każdego z procesów. Tworzy on strony pamięci wirtualnej na żądanie i zarządza sprowadzaniem ich z dysku lub ich wynoszniem z powrotem na dysk w razie potrzeby 

W systemie Linux zarządca pamięci wirtualnej utrzymuje dwa osobne obrazy przestrzeni adresowej procesu: 

  * **obraz logiczny** - odzwierciedlający rozkazy, za pomocą których system pamięci wirtualnej ukształtował wygląd przestrzeni adresowej; na tym obrazie przestrzeń adresowa składa się ze zbioru nie zachodzących na siebie obszarów reprezentujących ciągłe podzbiory przyległych stron przestrzeni adresowej (obszar pamięci jest opisany przez strukturę vm_area_struct)

  * **obraz fizyczny** - każdej przestrzeni adresowej pamiętany w sprzętowej tablicy stron procesu

Obszary pamięci wirtualnej są określone przez: 

  * 	zaplecze obszaru (ang. backing store), określające skąd pochodzą strony; większość obszarów ma jako swoje zaplecze pliki lub nie ma żadnego zaplecza ( obszar o zerowych wymaganiach (ang. demand-zero) )

  * 	sposób jego reagowania na pisanie (wspólne (ang. page sharing) lub prywatne(ang. copy-on-write) )
 
Jądro tworzy nową wirtualną przestrzeń adresową w dokładnie dwu sytuacjach: 

  - Gdy proces rozpoczyna wykonanie nowego programu za pomocą funkcji systemowej exec 
  - Przy tworzeniu nowego procesu za pomocą funkcji systemowej fork

Kiedy następuje wykonanie nowego procesu (exec), wtedy proces otrzymuje nową, całkowicie pustą przestrzeń wirtualną; zapełnianie tej przestrzeni adresowej obszarami pamięci wirtualnej należy do procedur ładujących program 

Tworzenie procesu za pomocą funkcji fork obejmuje utworzenie pełnej kopii wirtualnej przestrzeni adresowej istniejącego programu

  * 	jądro kopiuje deskryptory ''vm_area_struct'' procesu macierzystego, a następnie tworzy nowy zbiór tablic stron dla procesu macierzystego
 
  * 	tablice stron procesu macierzystego są kopiowane wprost do tablic procesu potomnego ze zwiększeniem licznika odwołań każdej strony
 
  * 	po operacji fork procesy macierzysty i potomny dzielą w swoich przestrzeniach adresowych te same fizyczne strony pamięci

Linux nie implementuje wymiany całego procesu 

System stronicowania pamięci wirtualnej zajmuje się przemieszczaniem stron pamięci z pamięci operacyjnej na dysk, kiedy występuje zapotrzebowanie na pamięć operacyjną 

System stronicowania można podzielić na dwie części: 

  * algorytm postępowania (ang. pageout-policy) decydujący o tym, które strony zapisywać na dysku i kiedy; Linux korzysta ze zmodyfikowanej wersji algorytmu zegarowego(drugiej szansy). Używa się wieloprzebiegowego zegara; każda strona ma swój wiek korygowany w każdym przebiegu zegara. Wiek ten jest miarą aktywności strony. Strony często odwiedzane otrzymują większy wiek, natomiast wiek nie odwiedzanych stron spada do zera. Procedura stronicująca wykorzystuje wiek do wyrzucenia najrzadziej używanej strony (alg. [[so:alg_zast_str#Least Recently Used (LRU)|LRU]])

  * mechanizm stronicowania (ang. paging mechanism), który realizuje przesłania i który sprowadza strony danych z powrotem do pamięci fizycznej, kiedy staną się potrzebne; Przydział bloków na urządzeniach wymiany odbywa się wg mapy bitowej używanych bloków stale przechowywanej w pamięci operacyjnej. Zwiększenie wydajności uzyskuje się poprzez zapisywanie stron w sposób ciągły w sąsiednich blokach. Wykorzystuje się tutaj algorytm najbliższego dopasowania.

Jądro systemu Linux rezerwuje stały, zależny od architektury obszar wirtualnej przestrzeni adresowej każdego procesu do swego wewnętrznego użytku 

Strefa wirtualnej pamięci jądra zawiera dwa obszary: 
  * 	obszar statyczny zawierający odwołania tablicy stron do każdej dostępnej, fizycznej strony pamięci w systemie, upraszcza tłumaczenia adresów fizycznych na wirtualne w czasie wykonywania kodu jądra ,
  *     reszta zarezerwowanego obszaru nie jest zarezerwowana w żadnym konkretnym celu .Wpisy tablicy stron odnoszące się do tego przedziału adresów mogą być zmieniane przez jądro, aby stosownie do potrzeb wskazywać dowolne inne fragmenty pamięci

----
**Uwaga**:

Autorze - nie gniewaj się, nie jest to argument ad personam do Ciebie. Ja po 20 minutach czytania tegoż tekstu... dałem spokój. Zamotka totalna. Udało mi się znaleźć coś o tym tutaj:

[[http://4programmers.net/Z_pogranicza/Linux_-_zarządzanie_pamięcią_operacyjną|link]]

patrzcie od pktu 2. Pasowałoby to skrócić i wyciągnąć z tego jakieś minimalne informacje jak Linux zarządza w końcu tą pamięcią (generalnie - bez szczegółów). Bo przecież i tak nie zapamiętamy jakie od tego są struktury i jak się nazywają - przynajmniej ja - do szczęścia mi to absolutnie nie potrzebne.

Dla mnie, posiadając wiedzę "co to jest zastępowanie stron" i wiedząc że w Linuxie jest używane LFU z liniowym postarzaniem stron (z artykułu z linku) - wystarczy to do powiedzenia czegokolwiek na ten temat.
----

Ewentualnie pozostaje Silberschatz, 801-803 ;-)

----
