Stronicowanie vs segmentacja

Dogłębna znajomość pojęć segmentacji i stronicowanie nie jest konieczna dla zwykłego zjadacza kodu, jednak każdemu może się przydać zrozumienie o co chodzi w tych dwóch pojęciach. Postaram się bardzo skrótowo i w bardzo uproszczony sposób pokazać, o co chodzi.

segmentacja vs stronicowanie

Z lewej strony rysunku mamy przykładowy kod, w przykładowym języku programowania. Jest to naprzemienne tworzenie stringa i jego wyświetlanie. Tak to wygląda w oczach programisty. I teraz…

Segmentacja jest pokazana na środkowym rysunku. Kompilator podzielił nasz program na segment danych i segment kodu. Dane programu mogą ulegać zmianie, więc znajdują się w segmencie przeznaczonym do odczytu i zapisu. Kod programu nie jest przeznaczony do modyfikacji i znajduje się w segmencie przeznaczonym tylko do odczytu. Stąd mamy pierwszy wniosek. Segmentacja zapobiega ingerowaniu w pamięć nie przeznaczoną do tego. Spójrzmy na indeksowanie komórek na środkowym rysunku. Adresowanie zaczyna się od początku dla każdego z segmentów. Stąd mamy drugi wniosek. Segmentacja ułatwia nam operowanie adresami, bo dzielimy sobie kod na kilka części adresowanych od początku.

Stronicowanie jest pokazane na prawym rysunku, który pokazuje fizyczny układ w pamięci, czyli tak jak to wygląda w kości RAM. Czerwone pola oznaczają pamięć zajętą przez inne programy. Między tymi czerwonymi polami była wolna przestrzeń, ale niewystarczająca na umieszczenie naszego programu w całości. System operacyjny powkładał nasz program gdzie się da w wolne obszary pamięci i zapamiętał tylko w jakiejś swojej tabeli, gdzie co leży, żęby móc to później wrócić jakoś do kupy. Stąd mamy wniosek odnośnie stronicowania. Stronicowanie pozwala wykorzystać małe obszary wolnej pamięci na umieszczenie w nich dużych fragmentów aplikacji.