//Pytanie: "Stronicowanie a segmentacja"//

====== Segmentacja pamięci ======

**Segmentacja pamięci** to metoda ochrony pamięci używana przy wielozadaniowości. Każdy proces otrzymuje swój własny obszar pamięci, realizowany poprzez rejestry segmentowe. Gdy proces próbuje odczytać bądź zapisać "nie swoje" dane (tzn. z innego obszaru), występuje błąd Naruszenie ochrony pamięci (bardziej znany jako segmentation fault), po czym (najczęściej) program się wyłącza. Czasami może to prowadzić do zawieszenia się komputera.

**Segmentacja pamięci** polega na __podzieleniu__ przez system operacyjny __pamięci fizycznej na fragmenty__ o określonym początku, rozmiarze, atrybutach i identyfikatorze. System tworzy takie segmenty na żądanie aplikacji, przekazując jej jedynie identyfikatory nie pozwalające na odczytanie parametrów segmentów. Programy odwołują się zatem do kolejnych komórek pamięci w ramach należących do nich segmentów, nie wiedząc nic o tym, w jakie miejsca pamięci fizyczne trafiają ich odwołania. Procesy nie mają też prawa „widzieć” segmentów należących do innych programów — w czasie przekazywania kontroli procesowi system musi zablokować definicje segmentów należących do pozostałych procesów, przy każdym przełączeniu blokując segmenty wyłączanego programu i na nowo uaktywniając segmenty programu aktywowanego. 

== Zalety segmentacji ==
Segmenty mają swoje zalety. Największą jest prostota relokacji kodu i danych: ponieważ nie jest ważne gdzie w pamięci fizycznej zakotwiczony jest segment, program może odwoływać się do kolejnych słów pamięci w ramach segmentu zawsze licząc od zera do końca segmentu. Konieczne dodawanie adresów realizuje sprzętowo układ zarządzający pamięcią — co za ulga dla systemu operacyjnego! 

== Wady segmentacji ==
Okazuje się jednak, że wady segmentacji przeważyły nad zaletami. Pierwsze implementacje segmentowanej pamięci wirtualnej narzucały dość poważne ograniczenia na rozmiary segmentów zmuszając programistów do dzielenia kodu programów oraz bloków danych w sposób nienaturalny i utrudniając tworzenie naprawdę dużych struktur danych. Nawet po zniesieniu tego ograniczenia okazało się, że nikt nie chce bawić się w dzielenie programu na logiczne części, a normalną pracę systemu i programu można osiągnąć znacznie prostszymi środkami. Podsumowując: segmentacja jest rozwiązaniem bardzo eleganckim, lecz na tyle kłopotliwym, że obecnie praktycznie się jej nie stosuje.

====== Stronicowanie ======

**Stronicowanie** jest jednym ze sposobów rozwiązania problemu zewnętrznej fragmentacji polegającym na dopuszczeniu nieciągłości logicznej przestrzeni adresowej procesu.

===== Podstawowa metoda stronicowania =====
  * **Pamięć fizyczną** dzieli się na bloki stałej długości zwane **ramkami**
  * **Pamięć logiczną** dzieli się na bloki stałej długości zwane **stronami**
  * Tablica stron procesu służy do odwzorowywania adresów logicznych w adresy fizyczne.
  * Rozmiar strony i ramki jest identyczny
  * Przy wykonaniu procesu strony z pamięci pomocniczej są wprowadzane w dowolne ramki pamięci operacyjnej
  * Ochrona – każda ramka ma przypisany bit (bity) ochrony wskazujący, czy ramka jest do pisania, czytania, wykonywania. 

**Adres logiczny** składa się z dwóch części:
  * numer strony (p) - służy jako indeks w tablicy stron,
  * przesunięcie w stronie (d) - numer bajtu w stronie.

Proces podzielony jest na strony. Rozmiar procesu wyrażany jest w stronach. Gdy proces ma być wykonany wówczas jego strony wprowadzane są w dowolne, wolne ramki pamięci fizycznej. Adres logiczny składa się z numeru strony i przesunięcia na stronie. Numery stron stanowią indeksy tablicy stron, w której odczytywany jest nr ramki w pamięci fizycznej i dodawane jest przesunięcie. 

{{:so:silberschatz_8_12.gif|:so:silberschatz_8_12.gif}}

===== Implementacja tablicy stron =====
  * Tablica stron jest przechowywana w pamięci głównej
  * Rejestr bazowy tablicy stron wskazuje jej początek. Każdy dostęp do danych/instrukcji programu wymaga dwóch dostępów do pamięci głównej.
  * Przyśpieszenie translacji jest możliwe dzięki zastosowaniu rejestrów asocjacyjnych (zwanych także buforami translacji bliskiego otoczenia, ang. Translation Lookaside Buffer, TLB).

{{:so:silberschatz_8_16.gif|:so:silberschatz_8_16.gif}}

Porównanie pozycji z kluczami w rejestrach asocjacyjnych odbywa się równocześnie dla wszystkich kluczy (szybkie, ale drogie). Wynik: pole wartości. Jeśli nie ma, to trzeba zajrzeć do tablicy stron.

===== Odwrotna tablica stron =====
**Odwrotna tablica stron** posiada po jednej pozycji dla każdej ramki; pozycja zawiera adres wirtualny strony umieszczonej w ramce oraz identyfikator procesu będącego właścicielem strony. W porównaniu z tradycyjną tablicą stron zmniejsza zużycie pamięci, ale wydłuża czas potrzebny na znalezienie adresu. Użycie tablicy mieszającej pozwala skrócić czas wyszukiwania.

Stronicowanie umożliwia dzielenie wspólnego kodu (taki kod musi być wielowejściowy, ang. reentrant, czyli nie może modyfikować sam siebie); edytory, kompilatory itp.

Do ochrony pamięci służą bity ochrony przypisane każdej ramce i zwykle umieszczone w tablicy stron.


===== Cechy stronicowania =====
  * wyraźne rozróżnienie między pamięcią widzianą przez użytkownika (pamięć logiczna) a pamięcią fizyczną. Odwzorowanie tych przestrzeni i  tłumaczenie adresów jest nadzorowane przez system operacyjny 
  * pamięć procesu może być nieciągła 
  * rozwiązanie dla problemu fragmentacji zewnętrznej
  * ominięcie problemu dopasowywania kawałków pamięci

**Fragmentacja wewnętrzna** pozostaje, w najgorszym przypadku proces może potrzebować n ramek + 1 słowo! (prawie cała ramka jest niewykorzystana). Im mniejsze strony, tym mniejsza fragmentacja wewnętrzna, ale większe koszty obsługi, czyli ilość wpisów do tablicy stron i odwołań do pamięci. 