System operacyjny - zarządzanie pamięcią
Zarządzanie pamięcią to funkcja systemu operacyjnego, która obsługuje lub zarządza pamięcią podstawową oraz przenosi procesy między pamięcią główną a dyskiem podczas wykonywania. Zarządzanie pamięcią śledzi każdą lokalizację pamięci, niezależnie od tego, czy jest przydzielona do jakiegoś procesu, czy jest wolna. Sprawdza, ile pamięci ma być przydzielone procesom. Decyduje o tym, który proces uzyska pamięć w jakim czasie. Śledzi, kiedy część pamięci zostaje zwolniona lub nieprzydzielona i odpowiednio aktualizuje stan.
Ten samouczek nauczy Cię podstawowych pojęć związanych z zarządzaniem pamięcią.
Przestrzeń adresowa procesu
Przestrzeń adresowa procesu to zestaw adresów logicznych, do których proces odwołuje się w swoim kodzie. Na przykład, gdy używane jest adresowanie 32-bitowe, adresy mogą mieć zakres od 0 do 0x7fffffff; to znaczy 2 ^ 31 możliwych liczb, co daje całkowity teoretyczny rozmiar 2 gigabajtów.
System operacyjny dba o mapowanie adresów logicznych na adresy fizyczne w momencie alokacji pamięci do programu. Istnieją trzy typy adresów używanych w programie przed i po przydzieleniu pamięci -
SN | Adresy pamięci i opis |
---|---|
1 | Symbolic addresses Adresy użyte w kodzie źródłowym. Nazwy zmiennych, stałe i etykiety instrukcji są podstawowymi elementami symbolicznej przestrzeni adresowej. |
2 | Relative addresses W czasie kompilacji kompilator konwertuje adresy symboliczne na adresy względne. |
3 | Physical addresses Program ładujący generuje te adresy w momencie ładowania programu do pamięci głównej. |
Adresy wirtualne i fizyczne są takie same w schematach wiązania adresu w czasie kompilacji i wczytywania. Adresy wirtualne i fizyczne różnią się schematem wiązania adresu w czasie wykonywania.
Zbiór wszystkich adresów logicznych generowanych przez program jest nazywany plikiem logical address space. Zbiór wszystkich adresów fizycznych odpowiadających tym adresom logicznym jest nazywany aphysical address space.
Mapowanie środowiska wykonawczego z adresu wirtualnego na fizyczny jest wykonywane przez jednostkę zarządzania pamięcią (MMU), która jest urządzeniem sprzętowym. MMU używa następującego mechanizmu do konwersji adresu wirtualnego na adres fizyczny.
Wartość w rejestrze bazowym jest dodawana do każdego adresu generowanego przez proces użytkownika, który w momencie wysyłania do pamięci jest traktowany jako przesunięcie. Na przykład, jeśli wartość rejestru bazowego wynosi 10000, wówczas próba użycia adresu lokalizacji 100 zostanie dynamicznie ponownie przydzielona do lokalizacji 10100.
Program użytkownika obsługuje adresy wirtualne; nigdy nie widzi prawdziwych adresów fizycznych.
Ładowanie statyczne a dynamiczne
Wyboru między obciążeniem statycznym a dynamicznym należy dokonać na etapie opracowywania programu komputerowego. Jeśli musisz ładować swój program statycznie, to w momencie kompilacji kompletne programy zostaną skompilowane i połączone bez pozostawiania zależności od zewnętrznego programu lub modułu. Konsolidator łączy program obiektowy z innymi niezbędnymi modułami obiektowymi w program absolutny, który zawiera również adresy logiczne.
Jeśli piszesz program ładowany dynamicznie, Twój kompilator skompiluje program i dla wszystkich modułów, które chcesz dołączyć dynamicznie, zostaną dostarczone tylko odniesienia, a reszta pracy zostanie wykonana w momencie wykonania.
W momencie załadunku z static loading, program absolutny (i dane) są ładowane do pamięci w celu rozpoczęcia wykonywania.
Jeśli używasz dynamic loadingdynamiczne procedury biblioteki są przechowywane na dysku w postaci relokowalnej i ładowane do pamięci tylko wtedy, gdy są potrzebne programowi.
Łączenie statyczne a dynamiczne
Jak wyjaśniono powyżej, gdy używane jest łączenie statyczne, konsolidator łączy wszystkie inne moduły wymagane przez program w jeden program wykonywalny, aby uniknąć jakiejkolwiek zależności w czasie wykonywania.
Gdy używane jest dynamiczne łączenie, nie jest wymagane łączenie rzeczywistego modułu lub biblioteki z programem, raczej odniesienie do dynamicznego modułu jest dostarczane w czasie kompilacji i linkowania. Biblioteki dołączane dynamicznie (DLL) w systemie Windows i obiekty współdzielone w systemie Unix są dobrymi przykładami bibliotek dynamicznych.
Zamiana
Zamiana to mechanizm, w którym proces można tymczasowo zamienić z pamięci głównej (lub przenieść) do pamięci dodatkowej (dysku) i udostępnić tę pamięć innym procesom. Jakiś czas później system zamienia proces z pamięci dodatkowej na pamięć główną.
Chociaż proces wymiany zwykle wpływa na wydajność, pomaga to w równoległym uruchamianiu wielu dużych procesów i to jest powód Swapping is also known as a technique for memory compaction.
Całkowity czas potrzebny na proces wymiany obejmuje czas potrzebny na przeniesienie całego procesu na dysk pomocniczy, a następnie skopiowanie procesu z powrotem do pamięci, a także czas potrzebny na odzyskanie pamięci głównej.
Załóżmy, że proces użytkownika ma rozmiar 2048KB, a na standardowym dysku twardym, na którym nastąpi zamiana, szybkość przesyłania danych wynosi około 1 MB na sekundę. Faktyczny transfer procesu 1000K do lub z pamięci zajmie
2048KB / 1024KB per second
= 2 seconds
= 2000 milliseconds
Biorąc pod uwagę czas wejścia i wyjścia, zajmie to pełne 4000 milisekund plus inne obciążenie, w którym proces konkuruje o odzyskanie pamięci głównej.
Alokacja pamięci
Pamięć główna ma zwykle dwie partycje -
Low Memory - System operacyjny znajduje się w tej pamięci.
High Memory - Procesy użytkownika są przechowywane w dużej pamięci.
System operacyjny wykorzystuje następujący mechanizm alokacji pamięci.
SN | Alokacja i opis pamięci |
---|---|
1 | Single-partition allocation W tym typie alokacji schemat rejestru relokacji jest używany do ochrony procesów użytkowników przed sobą oraz przed zmianą kodu i danych systemu operacyjnego. Rejestr relokacji zawiera wartość najmniejszego adresu fizycznego, natomiast rejestr limitów zawiera zakres adresów logicznych. Każdy adres logiczny musi być mniejszy niż rejestr limitów. |
2 | Multiple-partition allocation W tego typu alokacji pamięć główna jest podzielona na kilka partycji o stałej wielkości, z których każda powinna zawierać tylko jeden proces. Gdy partycja jest wolna, proces jest wybierany z kolejki wejściowej i ładowany do wolnej partycji. Po zakończeniu procesu partycja staje się dostępna dla innego procesu. |
Podział
Gdy procesy są ładowane i usuwane z pamięci, wolne miejsce w pamięci jest dzielone na małe kawałki. Zdarza się później, że procesy nie mogą być przydzielone do bloków pamięci ze względu na ich mały rozmiar, a bloki pamięci pozostają nieużywane. Ten problem jest znany jako fragmentacja.
Fragmentacja jest dwojakiego rodzaju -
SN | Fragmentacja i opis |
---|---|
1 | External fragmentation Całkowita ilość pamięci jest wystarczająca, aby spełnić żądanie lub przebywać w nim proces, ale nie jest ciągła, więc nie może być używana. |
2 | Internal fragmentation Blok pamięci przypisany do procesu jest większy. Część pamięci pozostaje niewykorzystana, ponieważ nie może być wykorzystana przez inny proces. |
Poniższy diagram pokazuje, w jaki sposób fragmentacja może powodować marnowanie pamięci, a technika zagęszczania może służyć do tworzenia większej ilości wolnej pamięci z pofragmentowanej pamięci -
Fragmentację zewnętrzną można zmniejszyć przez zagęszczenie lub przetasowanie zawartości pamięci, aby umieścić całą wolną pamięć w jednym dużym bloku. Aby zagęszczenie było wykonalne, przenoszenie powinno być dynamiczne.
Wewnętrzną fragmentację można zmniejszyć, skutecznie przypisując najmniejszą partycję, ale wystarczająco dużą dla procesu.
Paging
Komputer może adresować więcej pamięci niż ilość fizycznie zainstalowana w systemie. Ta dodatkowa pamięć jest w rzeczywistości nazywana pamięcią wirtualną i jest to sekcja dysku skonfigurowanego do emulacji pamięci RAM komputera. Technika stronicowania odgrywa ważną rolę we wdrażaniu pamięci wirtualnej.
Stronicowanie to technika zarządzania pamięcią, w której przestrzeń adresowa procesu jest dzielona na bloki o tej samej wielkości pages(rozmiar to potęga 2, od 512 bajtów do 8192 bajtów). Rozmiar procesu mierzy się liczbą stron.
Podobnie, główna pamięć jest podzielona na małe bloki (fizycznej) pamięci o stałej wielkości, tzw frames a rozmiar ramki jest taki sam jak rozmiar strony, aby zapewnić optymalne wykorzystanie pamięci głównej i uniknąć fragmentacji zewnętrznej.
Tłumaczenie adresów
Nazywa się adres strony logical address i reprezentowany przez page number i offset.
Logical Address = Page number + page offset
Wywoływany jest adres ramki physical address i reprezentowany przez frame number i offset.
Physical Address = Frame number + page offset
Struktura danych o nazwie page map table służy do śledzenia relacji między stroną procesu a ramką w pamięci fizycznej.
Gdy system przydziela ramkę do dowolnej strony, tłumaczy ten adres logiczny na adres fizyczny i tworzy wpis w tablicy stron, który ma być używany podczas wykonywania programu.
Kiedy proces ma zostać wykonany, jego odpowiednie strony są ładowane do wszystkich dostępnych ramek pamięci. Załóżmy, że masz program o wielkości 8 KB, ale w danym momencie Twoja pamięć może pomieścić tylko 5 KB, wtedy pojawi się koncepcja stronicowania. Gdy komputerowi zabraknie pamięci RAM, system operacyjny (OS) przeniesie bezczynne lub niechciane strony pamięci do pamięci dodatkowej, aby zwolnić pamięć RAM dla innych procesów i przywróci je w razie potrzeby programowi.
Ten proces jest kontynuowany podczas całego wykonywania programu, w którym system operacyjny usuwa bezczynne strony z pamięci głównej i zapisuje je w pamięci dodatkowej i przywraca je, gdy jest to wymagane przez program.
Zalety i wady stronicowania
Oto lista zalet i wad stronicowania -
Paging zmniejsza fragmentację zewnętrzną, ale nadal cierpi z powodu fragmentacji wewnętrznej.
Stronicowanie jest proste do wdrożenia i uważane za skuteczną technikę zarządzania pamięcią.
Ze względu na równy rozmiar stron i ramek zamiana staje się bardzo łatwa.
Tabela stron wymaga dodatkowej pamięci, więc może nie być dobra dla systemu z małą pamięcią RAM.
Segmentacja
Segmentacja to technika zarządzania pamięcią, w której każde zadanie jest podzielone na kilka segmentów o różnych rozmiarach, po jednym dla każdego modułu zawierającego elementy pełniące powiązane funkcje. Każdy segment jest w rzeczywistości inną logiczną przestrzenią adresową programu.
Kiedy proces ma być wykonany, jego odpowiednia segmentacja jest ładowana do pamięci niesąsiadującej, chociaż każdy segment jest ładowany do ciągłego bloku dostępnej pamięci.
Zarządzanie pamięcią segmentacji działa bardzo podobnie do stronicowania, ale tutaj segmenty mają zmienną długość, podczas gdy tak jak w przypadku stron stronicowania mają stały rozmiar.
Segment programu zawiera główną funkcję programu, funkcje narzędziowe, struktury danych i tak dalej. System operacyjny obsługuje pliksegment map tabledla każdego procesu i listę wolnych bloków pamięci wraz z numerami segmentów, ich rozmiarem i odpowiadającymi im lokalizacjami w pamięci głównej. Dla każdego segmentu tabela przechowuje początkowy adres segmentu i długość segmentu. Odniesienie do lokalizacji pamięci zawiera wartość, która identyfikuje segment i przesunięcie.