W celu rozwiązania problemu związanego z faktem, że proces (składający się z rozkazów i danych) zawierać może rozkazy odwołujące się do adresów komórek pamięciowych dwóch rodzajów (adresów komórek danych oraz adresów rozkazów używanych w przypadku rozgałęzienia), pojawiło się rozgraniczenie pomiędzy adresem fizycznym i logicznym [1]. Realizacja przez procesor procesu wiąże się z konwersją adresów logicznych na fizyczne. Do każdego adresu logicznego w procesie dodawane jest aktualne położenie początku procesu - adres bazowy.

Terminem partycjonowanie określa się podział pamięci w celu udostępnienia jej wielu procesom [1]. Partycjonowaniu podlega ta część pamięci, której nie zajmuje system operacyjny. Wyróżniamy dwa rodzaje partycjonowania, którym odpowiadają dwa rodzaje partycji:

  1. Partycje o ustalonym rozmiarze - wprowadzany do pamięci proces umieszczany jest w najmniejszej partycji, w której jest w stanie się pomieścić. Wyjaśnijmy, iż termin "ustalona" nie oznacza, że rozmiary partycji są równe, wręcz przeciwnie - nie są. Takie rozwiązanie sprawi jednak, że pojemność pamięci będzie niecałkowicie wykorzystana, ponieważ mało prawdopodobne jest zdarzenie (ale możliwe), w którym rozmiar procesu będzie równy rozmiarowi przydzielonej mu partycji.

  2. Partycje o zmiennych rozmiarach - proces wprowadzany do pamięci jest umieszczany w partycji, o dokładnie takiej pojemności, jakiej ten proces wymaga. Metoda ta jest bardziej efektywna od opisanej powyżej.
Z partycjonowaniem wiążą się pewne problemy. Rozważmy na przykład sytuację przedstawioną na rysunku 4.1.

[Partycjonowanie]
Rysunek 4.1. Hipotetyczny wynik partycjonowania [1]

Na początku proces 2 zostaje usunięty z pamięci, na jego miejsce wchodzi proces 4, następnie wychodzi proces 1 i wchodzi proces 5. Na przykładzie tym doskonale widać, jak schemat partycjonowania doprowadził do powstania luk w pamięci. Zauważmy, że im dłużej trwa partycjonowanie, tym więcej powstaje takich luk i tym mniejsze procesy mogą zostać do pamięci wprowadzane. Takie postępowanie z pewnością doprowadziłoby do zapełnienia pamięci, bez jednoczesnego wykorzystania całej jej pojemności. Dlatego też stosuje się upakowywanie (ang. compaction) , czyli okresowe przesuwanie przez system operacyjny procesów w pamięci, w celu skumulowania wolnej pamięci w jednym bloku [1]. Wydajniejszym sposobem przydziału pamięci jest stronicowanie. Stronicowanie opiera się na koncepcji podziału pamięci na małe fragmenty, zwane ramkami, przy równoczesnym podziale procesów na takie same fragmenty - zwane stronami. Przy takim schemacie tracona pojemność stanowi jedynie część ostatniej strony. Jeżeli przypomnimy sobie, że strony mają małe rozmiary, zorientujemy się, że tracona pojemność również jest niewielkich rozmiarów.

Zasadę działania stron i ramek ilustruje rysunek 4.2., który przedstawia pewien jeszcze mało znany Proces X składający się z trzech stron. Gdy proces ów wczytywany jest do pamięci, system operacyjny dysponując listą wolnych ramek (którą sam utrzymuje), potrafi w odpowiedni sposób załadować strony do wolnych, niekoniecznie sąsiadujących, ramek.

[Partycjonowanie]

Rysunek 4.2. Hipotetyczny wynik partycjonowania [1]

Ale skąd proces ma wiedzieć, w których ramkach znajdują się jego strony? Odpowiedź jest bardzo prosta. System tworzy dla każdego procesu tablicę stron. Pokazuje on gdzie są ramki pasujące do stron procesu. W przypadku stronicowania, tłumaczenie przez procesor adresów logicznych (numer strony, adres względny), umożliwia właśnie tablica stron. Procesor uzyskując do niej dostęp może, znając adres logiczny, utworzyć adres fizyczny (numer ramki, adres względny) [1].

Stronicowanie zapewnia bardzo efektywne wykorzystanie pamięci operacyjnej przy minimalnych stratach. Ułatwiony jest również dostęp do pamięci. Pamięć wirtualna jest to pamięć znajdująca się na części obszaru dysku, jest ona antonimem dla pamięci głównej, czyli rzeczywistej (rzeczywista, gdyż proces tylko w tej pamięci może być wykonywany). Pamięć wirtualna wykorzystuje schemat stronicowania na żądanie, które tym różni się od omówionego wcześniej stronicowania, że strony procesu są wprowadzane do pamięci dopiero wówczas, gdy jest to konieczne tj. na żądanie.

Schemat stronicowania na żądanie umożliwia wczytanie tylko tych stron procesu, których realizacja (a więc tym samym obecność w pamięci operacyjnej) jest konieczna. Pozostałe strony procesu mogą przebywać w pamięci pomocniczej. W przypadku, gdy program rozgałęzi się do rozkazu znajdującego się poza pamięcią lub nastąpi odwołanie do danych spoza obszaru pamięci, sygnalizowany jest błąd strony, co zmusza system do dostarczenia wymaganej strony.

Ograniczenie ilości stron procesu, znajdujących się w pamięci powoduje, że możliwa staje się współpraca z większą liczbą tychże. Ponadto nieużywane strony nie zajmują niepotrzebnie czasu procesora. System operacyjny musi jednak w odpowiedni sposób pilnować, aby wprowadzając do pamięci jedną stronę, wyrzucić jednocześnie inną. W przeciwnym wypadku może dojść do szamotania (ang. trashing), polegającego na wykorzystaniu większości czasu procesora na wymianę stron, a nie na przetwarzaniu poleceń.

Technika stronicowania na żądanie pozwala na stworzenie procesu o rozmiarach większych niż pojemność pamięci głównej oraz dała programistom ogromne zaplecze - pamięć wirtualną. Segmentacja dzieli przestrzeń adresową na segmenty o zmiennym, dynamicznym rozmiarze, do których przypisane są programy i dane, zwykle przez system operacyjny. Możliwe jest istnienie wielu segmentów programów przeznaczonych dla różnych rodzajów programów, a także wiele segmentów danych. Ponadto każdy segment może mieć ustawione prawa dostępu i użytkownika, zaś odniesienia do tej pamięci stanowi adres, na który składa się numer segmentu i adres względny.

Segmentacja jest widzialna dla programisty i w przeciwieństwie do stronicowania umożliwia wygodniejsze organizowanie programów i danych oraz może być wykorzystywana jako środek kojarzenia atrybutów przywileju i ochrony z rozkazami i danymi [1]. Ponadto zapewnia min. ochronę zasobów i wykorzystanie zbioru danych przez kilka procesów. Mimo wielu zalet segmentacja nie zapewnia tak efektywnego zarządzania pamięcią. Dlatego też łączy się zalety obu schematów, stosując segmentację i stronicowanie.

NASTĘPNA