Turystyka piesza Transport Ekonomiczne piece

Koncepcja procesu. Podsystem systemu operacyjnego zarządzania procesami. Stany procesów. Kontekst i uchwyt procesu. Podsystem zarządzania procesami Zasady zarządzania pamięcią

System zarządzania zadaniami zapewnia ich przejście przez komputer. W zależności od stanu procesu musi on przydzielić ten lub inny zasób. Na przykład nowy proces musi zostać umieszczony w pamięci poprzez przydzielenie mu przestrzeni adresowej; umieścić na liście zadań konkurujących o czas procesora.

Jednym z głównych podsystemów wieloprogramowego systemu operacyjnego, który bezpośrednio wpływa na funkcjonowanie komputera, jest podsystem zarządzania procesami i wątkami. Zajmuje się ich tworzeniem i niszczeniem, a także rozdziela czas procesora pomiędzy jednocześnie istniejące procesy i wątki w systemie.

Gdy w systemie uruchomionych jest jednocześnie wiele zadań, mimo że wątki są tworzone i wykonywane asynchronicznie, może zaistnieć potrzeba interakcji między nimi, na przykład podczas wymiany danych. Dlatego synchronizacja wątków jest jedną z ważnych funkcji podsystemu zarządzania procesami i wątkami.

Komunikacja pomiędzy procesami odbywa się za pomocą zmiennych współdzielonych oraz specjalnych operacji podstawowych tzw prymitywni.

Podsystem zarządzania procesami i wątkami ma możliwość wykonywania następujących operacji na procesach:

– utworzenie (spawnowanie)/zniszczenie procesu;

– wstrzymać/wznowić proces;

– blokowanie/budzenie procesu;

– rozpocząć proces;

– zmiana priorytetu procesu;

Podsystem zarządzania procesami i wątkami odpowiada za zapewnienie procesom niezbędnych zasobów. System operacyjny utrzymuje w pamięci specjalne struktury informacyjne, w których rejestruje, które zasoby są przydzielone każdemu procesowi. Zasób można przypisać do procesu do wyłącznego użytku lub do wspólnego użytku z innymi procesami. Część zasobów jest przydzielana procesowi w momencie jego tworzenia, a część przydzielana jest dynamicznie na podstawie żądań w czasie wykonywania. Zasoby mogą być przypisane do procesu na całe jego życie lub tylko na określony okres. Wykonując te funkcje, podsystem zarządzania procesami współdziała z innymi podsystemami systemu operacyjnego odpowiedzialnymi za zarządzanie zasobami, takimi jak podsystem zarządzania pamięcią, podsystem wejścia/wyjścia i system plików.

1. Tworzenie i usuwanie procesów i wątków

Tworzenie procesu to przede wszystkim tworzenie uchwyt procesu, czyli jedna lub więcej struktur informacyjnych zawierających wszystkie informacje o procesie niezbędne do zarządzania nim przez system operacyjny. Zagadnienie to zostało szczegółowo omówione wcześniej, teraz tylko przypominamy, że takimi informacjami mogą być np. identyfikator procesu, dane o lokalizacji modułu wykonywalnego w pamięci, stopień uprzywilejowania procesu (priorytet i prawa dostępu), itp.

Tworzenie procesu polega na załadowaniu kodów i danych programu wykonywalnego procesu z dysku do pamięci RAM. W tym przypadku podsystem zarządzania procesami współdziała z podsystemem zarządzania pamięcią i systemem plików. W systemie wielowątkowym podczas tworzenia procesu system operacyjny tworzy co najmniej jeden wątek wykonawczy dla każdego procesu. Tworząc wątek, podobnie jak podczas tworzenia procesu, system operacyjny generuje specjalną strukturę informacyjną - deskryptor wątku, który zawiera identyfikator wątku, dane o prawach dostępu i priorytecie, stan wątku itp. Po utworzeniu wątek (lub proces) jest w stanie gotowości do wykonania (lub w stanie bezczynności w przypadku systemu operacyjnego specjalnego przeznaczenia).

Zadania są tworzone i usuwane na podstawie odpowiednich żądań użytkowników lub innych zadań. Zadanie może zrodzić nowe zadanie - w wielu systemach wątek może kontaktować się z systemem operacyjnym z prośbą o utworzenie tzw. strumienie podrzędne. Zadanie generujące nazywa się „przodkiem” lub „rodzicem”, a zadanie podrzędne nazywa się „potomkiem” lub „zadaniem podrzędnym”. „Przodek” może zawiesić lub usunąć swoje zadanie podrzędne, podczas gdy „dziecko” nie może zarządzać „przodkiem”.

Różne systemy operacyjne inaczej strukturyzują relacje między wątkami podrzędnymi a ich rodzicami. W niektórych systemach operacyjnych ich wykonanie jest synchronizowane (po zakończeniu wątku nadrzędnego wszystkie jego potomki są usuwane z wykonania), w innych potomki są wykonywane asynchronicznie w stosunku do wątku nadrzędnego.

Po zakończeniu procesu system operacyjny „oczyszcza ślady” swojej obecności w systemie - zamyka wszystkie pliki, z którymi proces współpracował, zwalnia obszary pamięci RAM przeznaczone na kody, dane i struktury informacyjne systemu procesu. Poprawiono kolejki systemu operacyjnego i listy zasobów, które zawierały odniesienia do kończącego się procesu.

2. Planowanie i przydzielanie procesów i wątków

Strategia planowania określa, które procesy zostaną wybrane do realizacji, aby osiągnąć cel. Strategie mogą być różne, na przykład:

– jeśli to możliwe, zakończ obliczenia w tej samej kolejności, w jakiej zostały rozpoczęte;

– preferować krótsze procesy;

– zapewnić wszystkim użytkownikom (zadania użytkownika) te same usługi, z uwzględnieniem tego samego czasu oczekiwania.

W trakcie trwania procesu wykonywanie jego wątków może być wielokrotnie przerywane i kontynuowane.

Przejście z wykonania jednego wątku do drugiego następuje w wyniku planowanie I wysyłanie.

Planowanie wątki implementowane są w oparciu o informacje przechowywane w deskryptorach procesów i wątków. Podczas planowania można wziąć pod uwagę priorytet wątków, czas oczekiwania w kolejce, skumulowany czas wykonania, intensywność dostępu we/wy i inne czynniki. System operacyjny planuje wykonanie wątków niezależnie od tego, czy należą one do tego samego, czy do różnych procesów. Planowanie rozumiane jest jako zadanie doboru takiego zbioru procesów, aby w czasie ich realizacji jak najmniej kolidowały ze sobą i jak najefektywniej wykorzystywały system obliczeniowy.

W różnych źródłach informacji są różne interpretacje pojęcia „planowania” i „wysyłania”. Dlatego niektórzy autorzy dzielą planowanie na długoterminowe (globalne) i krótkoterminowe (dynamiczne, czyli obecnie najbardziej efektywna dystrybucja), a to drugie nazywa się dyspozytorstwem. Według innych źródeł przez ekspedycję rozumie się realizację decyzji podjętej na etapie planowania. Pozostaniemy przy tej opcji.

Planowanie obejmuje rozwiązanie dwóch problemów:

określenie momentu zmiany aktywnego wątku;

wybranie wątku do wykonania z kolejki gotowych wątków.

Istnieje wiele algorytmów planowania, które rozwiązują te problemy na różne sposoby. To cechy planowania określają specyfikę systemu operacyjnego. Przyjrzyjmy się im nieco później.

W większości systemów operacyjnych przeprowadzane jest planowanie dynamicznie, tj. decyzje podejmowane są w trakcie pracy na podstawie analizy aktualnej sytuacji. Wątki i procesy pojawiają się losowo i kończą w nieprzewidywalny sposób.

Statyczny typ harmonogramowania może być stosowany w specjalizowanych systemach, w których z góry zdefiniowany jest cały zestaw jednocześnie realizowanych zadań (systemy czasu rzeczywistego). Harmonogram tworzy harmonogram w oparciu o wiedzę o charakterystyce zbioru zadań. Harmonogram ten jest następnie używany przez system operacyjny do planowania.

Wysyłka polega na wdrożeniu rozwiązania znalezionego w wyniku planowania, tj. w przełączaniu jednego procesu na inny. Wysyłka sprowadza się do następujących czynności:

zapisanie kontekstu bieżącego wątku, który należy zmienić;

uruchomienie nowego wątku do wykonania.

Kontekst wątku odzwierciedla po pierwsze stan sprzętu komputerowego w chwili przerwania (wartość licznika programu, zawartość rejestrów ogólny cel, tryb pracy procesora, flagi, maski przerwań i inne parametry), po drugie, parametry środowiska operacyjnego (odnośniki do otwartych plików, dane o niezakończonych operacjach we/wy, kody błędów wykonywanych przez dany wątek wywołań systemowych itp.).

W kontekście wątku możemy wyróżnić część wspólną dla wszystkich wątków danego procesu (linki do otwartych plików) oraz część dotyczącą tylko danego wątku (zawartość rejestrów, licznik programu, tryb procesora). Na przykład w środowisku NetWare istnieją trzy typy kontekstów - kontekst globalny (kontekst procesu), kontekst grupy wątków i kontekst indywidualnego wątku. Zależność między danymi tych kontekstów jest podobna do relacji między zmiennymi globalnymi i lokalnymi w programie. Hierarchiczna organizacja kontekstów przyspiesza przełączanie wątków: podczas przełączania z wątku jednej grupy do wątku innej grupy w ramach tego samego procesu kontekst globalny nie ulega zmianie, zmienia się jedynie kontekst grupowy. Globalne przełączanie kontekstu następuje tylko podczas przechodzenia z wątku jednego procesu do wątku innego procesu.

3. Algorytmy planowania

Z punktu widzenia rozwiązania pierwszego problemu szeregującego (wybór momentu zmiany aktywnego wątku) algorytmy szeregujące dzielą się na dwie duże klasy – algorytmy z wywłaszczaniem i niewywłaszczające:

nierepresyjny– aktywny wątek może działać do czasu, aż sam przekaże kontrolę systemowi, aby wybrać z kolejki inny gotowy wątek;

przemieszczanie– system operacyjny decyduje się na zmianę wykonywanego zadania i przełącza procesor na inny wątek.

Główną różnicą pomiędzy tymi algorytmami planowania jest stopień centralizacji mechanizmu planowania wątków. Rozważmy główne cechy, zalety i wady każdej klasy algorytmów.

Algorytmy niewywłaszczające. Program aplikacyjny po otrzymaniu kontroli od systemu operacyjnego sam określa moment zakończenia kolejnego cyklu swojego wykonania i dopiero wtedy przekazuje kontrolę do systemu operacyjnego za pomocą jakiegoś wywołania systemowego. W rezultacie kontrola użytkownika nad aplikacją zostaje utracona na dowolny okres czasu. Programiści muszą to brać pod uwagę i tworzyć aplikacje tak, aby działały „częściowo”, okresowo przerywając i przekazując kontrolę do systemu, tj. Podczas programowania realizowane są również funkcje harmonogramu.

Zalety to podejście:

– wykluczone jest przerwanie przepływu w niedogodnym momencie;

– problem jednoczesnego wykorzystania danych został rozwiązany, ponieważ w każdym cyklu wykonawczym zadanie wykorzystuje je wyłącznie i ma pewność, że nikt inny nie będzie mógł ich zmienić;

– większa prędkość przełączania ze strumienia na strumień.

Niedogodności są trudne tworzenie programu i zwiększone wymagania co do kwalifikacji programisty, a także możliwość przejęcia procesora przez jeden wątek w przypadku przypadkowego lub celowego zapętlenia.

Algorytmy wywłaszczające– harmonogramowanie cykliczne lub cykliczne, w którym system operacyjny sam decyduje, czy przerwać aktywną aplikację i przełącza procesor z jednego zadania do drugiego zgodnie z tym lub innym kryterium. W systemie z takimi algorytmami programista nie musi się martwić, że jego aplikacja będzie wykonywana jednocześnie z innymi zadaniami. Przykładami są systemy operacyjne UNIX, Windows NT/2000, OS/2. Algorytmy tej klasy nastawione są na wysoką wydajność wykonywania aplikacji.

Algorytmy wywłaszczające mogą opierać się na koncepcji kwantyzacji lub na mechanizmie priorytetowym.

Algorytmy oparte na kwantyzacji. Każdemu wątkowi przydzielany jest ograniczony ciągły wycinek czasu procesora (jego wartość nie powinna być mniejsza niż 1 ms – zwykle kilkadziesiąt ms). Wątek zostaje przeniesiony ze stanu uruchomionego do stanu gotowości, jeśli kwant zostanie wyczerpany. Kwanty mogą być takie same dla wszystkich przepływów lub różne.

Przy przydzielaniu kwantów do wątku można stosować różne zasady: kwanty te mogą mieć stałą wartość lub zmieniać się w różnych okresach życia wątku. Przykładowo dla jakiegoś konkretnego przepływu pierwszy kwant może być dość duży, a każdy kolejny przydzielony do niego kwant może mieć krótszy czas trwania (redukcja do określonych limitów). Stwarza to przewagę w przypadku krótszych wątków i przenoszenia długotrwałych zadań tryb tła. Inna zasada opiera się na fakcie, że procesy często wykonujące operacje we/wy nie wykorzystują w pełni przydzielonych im przedziałów czasu. Aby zrekompensować tę niesprawiedliwość, można z takich procesów utworzyć oddzielną kolejkę, która ma przywileje w stosunku do innych wątków. Przy wyborze kolejnego wątku do wykonania, najpierw ta kolejka jest skanowana i dopiero jeśli jest pusta, z kolejki ogólnej wybierany jest wątek gotowy do wykonania.

Algorytmy te nie wykorzystują żadnych wcześniejszych informacji o zadaniach. Zróżnicowanie usług w tym przypadku opiera się na „historii istnienia” przepływu w systemie.

Z punktu widzenia drugiego problemu szeregowania (zasada wyboru wykonania kolejnego wątku) algorytmy można także warunkowo podzielić na klasy: algorytmy niepriorytetowe i priorytetowe. W przypadku konserwacji niepriorytetowej kolejne zadanie jest wybierane w określonej z góry kolejności, bez uwzględnienia ich względnego znaczenia i czasu konserwacji. Podczas wdrażania dyscyplin priorytetowych niektórym zadaniom nadawany jest priorytet wejścia w stan wykonania.

Przyjrzyjmy się teraz niektórym z najpopularniejszych dyscyplin planowania.


Kto pierwszy, ten lepszy. Procesor przydzielany jest według zasady FIFO (First In First Out), tj. w kolejności wpływania wniosków o usługę. Takie podejście pozwala na realizację strategii „kończenia obliczeń w kolejności, w jakiej się pojawiają”, jeśli to możliwe. Zadania, które zostały zablokowane w trakcie realizacji, po wejściu w stan gotowości, ustawiane są w kolejce przed zadaniami, które nie zostały jeszcze wykonane. W ten sposób powstają dwie kolejki: jedna z zadaniami, które nie zostały jeszcze wykonane, i druga z zadaniami, które przeszły ze stanu oczekującego.

Ta dyscyplina jest wdrażana jako nieprzerywająca, gdy zadania dobrowolnie zwalniają procesor.

Godność Algorytm ten jest łatwy do wdrożenia. Niekorzyść– przy dużym obciążeniu krótkie zadania zmuszone są czekać w systemie przez długi czas. Poniższe podejście eliminuje tę wadę.

Najpierw obsługiwany jest najkrótszy proces. Według tego algorytmu obok wykonania przypisywany jest wątek z minimalnym szacowanym czasem potrzebnym na wykonanie swojej pracy. W tym przypadku preferowane są wątki, którym pozostało niewiele czasu do zakończenia. Zmniejsza to liczbę oczekujących zadań w systemie. Niekorzyść jest konieczność wcześniejszego poznania przewidywanego czasu, co nie zawsze jest możliwe. W przybliżeniu w niektórych przypadkach można wykorzystać czas, w którym wątek ostatni raz otrzymywał kontrolę.

Algorytm należy do kategorii niewywłaszczających, bezpriorytetowych.

Wymienione algorytmy można zastosować w trybach pracy wsadowej, gdy użytkownik nie oczekuje, że system odpowie. W przypadku obliczeń interaktywnych konieczne jest przede wszystkim zapewnienie akceptowalnego czasu reakcji i jednakowej obsługi systemów wieloterminalowych. W przypadku systemów dla jednego użytkownika pożądane jest, aby posiadały te programy, z którymi bezpośrednio współpracują Najlepszy czas reakcje niż praca w tle. Ponadto niektóre aplikacje, działające bez bezpośredniej interakcji z użytkownikiem, muszą nadal mieć gwarancję otrzymania części czasu procesora (na przykład program pocztowy). Aby rozwiązać takie problemy, stosuje się metody obsługi priorytetowej i koncepcję kwantyzacji.


Dyscyplina karuzelowa, Lub okólnikR.R.(Robinowy). Dyscyplina ta dotyczy algorytmów z wywłaszczaniem i opiera się na kwantyzacji. Każde zadanie otrzymuje czas procesora w porcjach – kwantach. Po upływie kwantu czasu zadanie jest usuwane z procesora i umieszczane na końcu kolejki procesów gotowych do wykonania, a kolejne zadanie zostaje przyjęte do obsługi przez procesor. Dla optymalnej pracy systemu niezbędny jest właściwy dobór prawa, według którego przydzielane są przedziały czasowe zadaniom.

Wartość kwantowa jest wybierana jako kompromis pomiędzy akceptowalnym czasem reakcji systemu na żądania użytkowników (tak, aby ich najprostsze żądania nie powodowały długiego oczekiwania) a kosztami ogólnymi często zmieniających się zadań. W przypadku przerwania system operacyjny musi zapisać odpowiednio dużą ilość informacji o bieżącym procesie, umieścić uchwyt anulowanego zadania w kolejce i załadować kontekst nowego zadania. Przy małym fragmencie czasu i częstych przełącznikach względny udział takiego narzutu stanie się duży, co pogorszy wydajność systemu jako całości. Jeśli przedział czasowy jest duży i kolejka gotowych zadań rośnie, reakcja systemu będzie słaba.

W niektórych systemach operacyjnych możliwe jest jednoznaczne określenie wartości przedziału czasu lub dopuszczalnego zakresu jego wartości. Na przykład w systemie OS/2 plik CONFIG.SYS używa operatora TIMESLICE do określenia minimalnych i maksymalnych wartości przedziału czasu: TIMESLICE=32.256 wskazuje, że przedział czasu można zmienić w zakresie od 32 do 256 milisekund.

Ta dyscyplina usług jest jedną z najczęstszych. W niektórych przypadkach, gdy system operacyjny nie obsługuje bezpośrednio dyscypliny planowania okrężnego, taką konserwację można zorganizować sztucznie. Na przykład niektóre systemy RTOS korzystają z harmonogramu z priorytetami bezwzględnymi, a gdy priorytety są równe, obowiązuje zasada kolejkowania. Oznacza to, że tylko zadanie o wyższym priorytecie może usunąć zadanie z wykonania. W razie potrzeby zorganizuj obsługę równomiernie i równomiernie, tj. Aby mieć pewność, że wszystkie zadania otrzymają takie same przedziały czasowe, operator systemu może samodzielnie wdrożyć taką obsługę. Aby to zrobić, wystarczy przypisać te same priorytety wszystkim zadaniom użytkownika i utworzyć jedno zadanie o wysokim priorytecie, które nie powinno robić nic innego, jak tylko zaplanować wykonanie na timerze w określonych odstępach czasu. To zadanie spowoduje jedynie usunięcie bieżącej aplikacji z wykonania, przesunie się ona na koniec kolejki, a samo zadanie natychmiast opuści procesor i przekaże je kolejnemu procesowi w kolejce.

W najprostszej implementacji dyscyplina usług karuzelowych zakłada, że ​​wszystkie zadania mają ten sam priorytet. Jeżeli zachodzi konieczność wprowadzenia mechanizmu obsługi priorytetów, organizuje się zazwyczaj kilka kolejek w zależności od priorytetów, a obsługa kolejki o niższym priorytecie odbywa się tylko wtedy, gdy kolejka o wyższym priorytecie jest pusta. Algorytm ten jest używany do planowania w systemach OS/2 i Windows NT.

Planowanie według priorytetów.

Ważną koncepcją leżącą u podstaw wielu algorytmów z wywłaszczaniem jest usługa z wywłaszczaniem. Algorytmy takie korzystają z informacji zawartych w deskryptorze przepływu – jego priorytecie. Różne systemy różnie definiują priorytet. W niektórych systemach najwyższa wartość priorytetu może być traktowana liczbowo najwyższa wartość, w innych - wręcz przeciwnie, najwyższy priorytet uważa się za zerowe.

Zwykle priorytet wątku jest bezpośrednio powiązany z priorytetem procesu, w ramach którego działa wątek. Priorytet procesu przydzielany przez system operacyjny w momencie jego tworzenia, biorąc pod uwagę, czy jest to proces systemowy, czy aplikacyjny, jaki jest status użytkownika, który uruchomił proces i czy istniała wyraźna instrukcja użytkownika dotycząca nadania określonego priorytetu do procesu. Wartość priorytetu jest zawarta w uchwycie procesu i jest używana podczas nadawania priorytetu jego wątkom. Jeśli wątek nie jest inicjowany poleceniem użytkownika, ale w wyniku wykonania wywołania systemowego przez inny wątek, wówczas system operacyjny musi wziąć pod uwagę parametry wywołania systemowego, aby przypisać mu priorytet.

Planując utrzymanie programu według wcześniej opisanych algorytmów może zaistnieć sytuacja, w której przez dłuższy czas nie będzie można zrealizować niektórych zadań kontrolnych lub zarządczych ze względu na rosnące obciążenie systemu (szczególnie w RTOS). Co więcej, konsekwencje nieterminowej realizacji takich zadań mogą być poważniejsze niż niezrealizowania niektórych programów o wyższym priorytecie. W takim przypadku wskazana byłaby chwilowa zmiana priorytetu zadań „awaryjnych” (tych, których czas przetwarzania minął), a po ich wykonaniu przywrócenie poprzedniej wartości. Wprowadzenie mechanizmów dynamicznie zmieniających się priorytetów pozwala na szybszą reakcję systemu na krótkie żądania użytkowników (co jest istotne podczas pracy interaktywnej), ale jednocześnie gwarantuje realizację wszelkich żądań.

Więc priorytetem może być statyczny(stały) lub dynamiczny(zmiana systemu w zależności od sytuacji w nim panującej). Tak zwana priorytet wątku podstawowego zależy bezpośrednio od podstawowego priorytetu procesu, który go wygenerował. W niektórych przypadkach system może zwiększyć priorytet wątku (i to w różnym stopniu), na przykład jeśli przydzielony mu przedział czasu procesora nie został w pełni wykorzystany, lub w innym przypadku obniżyć priorytet. Na przykład system operacyjny daje większy priorytet wątkom oczekującym na wejście z klawiatury, a mniejszy wątkom wykonującym operacje dyskowe. W niektórych systemach wykorzystujących dynamiczny mechanizm priorytetów do zmiany priorytetu stosuje się dość złożone formuły, które obejmują wartości priorytetów podstawowych, stopień obciążenia systemu komputerowego, początkową wartość priorytetu określoną przez użytkownika itp. .

Istnieją dwa rodzaje planowania priorytetów: konserwacja ze względnymi priorytetami i serwis z absolutnymi priorytetami. W obu przypadkach wybór wątku do realizacji odbywa się w ten sam sposób – wybierany jest wątek o najwyższym priorytecie, a inaczej określany jest moment zmiany aktywnego wątku. W systemie o względnym priorytecie aktywny wątek działa, dopóki nie opuści procesora (albo czeka, pojawia się błąd, albo wątek się kończy). W systemie o priorytetach absolutnych przerwanie aktywnego wątku, oprócz wskazanych przyczyn, następuje także wtedy, gdy w kolejce gotowych wątków pojawi się wątek o wyższym priorytecie niż aktywny. Następnie działający wątek zostaje przerwany i wprowadzony w stan gotowości.

System z szeregowaniem względnych priorytetów minimalizuje koszty przełączania, ale pojedyncze zadanie może zajmować procesor przez długi czas. Ten tryb usług nie jest odpowiedni dla systemów z współdzieleniem czasu i systemów czasu rzeczywistego, ale w systemach przetwarzania wsadowego (na przykład OS/360) jest szeroko stosowany. Planowanie z priorytetem absolutnym jest odpowiednie dla systemów zarządzania obiektami, w których ważna jest szybka reakcja na zdarzenia.

Typ planowania mieszanego stosowane w wielu systemach operacyjnych: algorytmy planowania oparte na priorytetach są połączone z koncepcją kwantyzacji.

ROZWÓJ MODUŁU SZKOLENIOWEGO SYSTEMU OPERACYJNEGO

Wytyczne

do projektowania kursów w tej dyscyplinie

„system operacyjny”

dla uczniów codzienna forma szkolenie

kierunki

WSTĘP 4

1. Część teoretyczna. 4

1.1. Podsystem sterowania procesem. 4

1.1.1. Kontekst i uchwyt procesu. 5

1.1.2. Algorytmy planowania procesów. 6

1.1.3. Algorytmy planowania z wywłaszczaniem i bez wywłaszczania. 9

1.1.4. Model procesu i funkcje podsystemu zarządzania procesami edukacyjnego systemu operacyjnego 12

1.2. Podsystem zarządzania pamięcią.. 17

1.2.1. Dystrybucja strony. 18

1.2.2. Dystrybucja segmentów. 22

1.2.3. Dystrybucja segmentów strony. 23

1.2.4. Algorytmy zastępowania stron. 24

1.3. Zarządzanie plikami. trzydzieści

1.3.1. Nazwy plików. trzydzieści

1.3.2. Typy plików. 32

1.3.3. Organizacja fizyczna i adres pliku. 33

2. Procedura realizacji projektu kursu. 38

3. Opcje zadań. 39

Bibliografia 42

ZAŁĄCZNIK A... 43

WSTĘP

Cel projektu kursu: zapoznanie się z teoretycznymi podstawami budowy modułów systemów operacyjnych. Zdobądź praktyczne umiejętności tworzenia programu będącego częścią systemu operacyjnego.

Część teoretyczna

Funkcje systemu operacyjnego samodzielnego komputera są zazwyczaj pogrupowane według typów zasobów lokalnych, którymi zarządza system operacyjny, lub według określonych zadań mających zastosowanie do wszystkich zasobów. Czasami takie grupy funkcji nazywane są podsystemami. Najważniejszymi podsystemami są podsystemy zarządzania procesami, pamięcią, plikami i urządzeniami zewnętrznymi, a podsystemy wspólne dla wszystkich zasobów to podsystemy interfejsu użytkownika, ochrony danych i administracji.

Podsystem sterowania procesem

Najważniejszą częścią systemu operacyjnego, która bezpośrednio wpływa na funkcjonowanie komputera, jest podsystem sterowania procesami. Dla każdego nowo utworzonego procesu system operacyjny generuje struktury informacyjne systemu, które zawierają dane o zapotrzebowaniu procesu na zasoby systemu komputerowego, a także o zasobach faktycznie mu przydzielonych. Zatem proces można również zdefiniować jako aplikację zużywającą zasoby systemowe.

Aby proces mógł zostać wykonany, system operacyjny musi przydzielić mu obszar pamięci RAM, w którym będą znajdować się kody procesów i dane, a także zapewnić mu wymagana ilość Czas procesora. Ponadto proces może wymagać dostępu do zasobów, takich jak pliki i urządzenia we/wy.

W systemie wielozadaniowym proces może znajdować się w jednym z trzech głównych stanów:

DZIAŁANIE - stan aktywny procesu, w którym proces posiada wszystkie niezbędne zasoby i jest bezpośrednio wykonywany przez procesor;

OCZEKIWANIE to bierny stan procesu, proces jest zablokowany, nie może zostać wykonany z powodów wewnętrznych, oczekuje na wystąpienie jakiegoś zdarzenia, np. zakończenia operacji we/wy, odebrania komunikatu od innego procesu lub uwolnienie jakiegoś potrzebnego mu zasobu;

GOTOWY to także stan pasywny procesu, ale w tym przypadku proces jest blokowany z powodu okoliczności zewnętrznych od niego: proces ma wszystkie potrzebne do tego zasoby, jest gotowy do wykonania, ale procesor jest zajęty wykonywaniem innego procesu.

W cyklu życia każdy proces przechodzi z jednego stanu do drugiego, zgodnie z algorytmem planowania procesów zaimplementowanym w danym systemie operacyjnym. Typowy wykres stanu procesu pokazano na rysunku 1.1.

Rysunek 1.1 — Wykres stanu procesu w środowisku wielozadaniowym

W systemie jednoprocesorowym w stanie RUNNING może znajdować się tylko jeden proces, a w każdym ze stanów WAITING i READY może znajdować się kilka procesów, które tworzą kolejki odpowiednio procesów oczekujących i gotowych.

Cykl życia procesu rozpoczyna się od stanu READY, kiedy proces jest gotowy do wykonania i czeka na swoją kolej. Po aktywacji proces przechodzi w stan RUNNING i pozostaje w nim do czasu, aż albo sam zwolni procesor, przechodząc w stan OCZEKIWANIA na jakieś zdarzenie, albo zostanie na siłę wyrzucony z procesora, np. z powodu wyczerpania się czasu procesora kwant przeznaczony na ten proces. W tym drugim przypadku proces powraca do stanu READY. Proces przechodzi do tego stanu ze stanu OCZEKIWANIA po wystąpieniu oczekiwanego zdarzenia.

Artykuły do ​​przeczytania:

Podstawy programowania. Zarządzanie procesem

Jednym z głównych podsystemów każdego nowoczesnego wieloprogramowego systemu operacyjnego, który bezpośrednio wpływa na funkcjonowanie komputera, jest podsystem zarządzania procesami i wątkami. Główne funkcje tego podsystemu:

    tworzenie procesów i wątków;

    zapewnienie procesom i wątkom niezbędnych zasobów;

    izolacja procesu;

    harmonogramowanie wykonywania procesów i wątków (ogólnie rzecz biorąc, powinniśmy mówić także o harmonogramowaniu zadań);

    wysyłanie wątków;

    organizacja komunikacji międzyprocesowej;

    synchronizacja procesów i wątków;

    zakończenie i zniszczenie procesów i wątków.

1. Pięć głównych wydarzeń prowadzi do powstania procesu:

    spełnienie żądania działającego procesu dotyczącego utworzenia procesu;

    żądanie użytkownika dotyczące utworzenia procesu, na przykład podczas interaktywnego logowania;

    zainicjować zadanie wsadowe;

    utworzenie przez system operacyjny procesu niezbędnego do działania jakichkolwiek usług.

Zwykle podczas uruchamiania systemu operacyjnego tworzonych jest kilka procesów. Część z nich to procesy o wysokim priorytecie, które wchodzą w interakcję z użytkownikami i wykonują przydzieloną im pracę. Pozostałe procesy są procesami w tle, nie są powiązane z konkretnymi użytkownikami, ale wykonują specjalne funkcje - na przykład związane z pocztą elektroniczną, stronami WWW, wyjściem do foka, transfer plików Przez sieci, okresowe uruchamianie programów (np. defragmentacja dysku) itp. Procesy działające w tle nazywane są demonami.

Można utworzyć nowy proces Przezżądanie bieżącego procesu. Tworzenie nowych procesów jest przydatne w przypadkach, gdy realizowane zadanie można najłatwiej uformować jako zbiór powiązanych, choć niezależnych, oddziałujących na siebie procesów. W systemach interaktywnych użytkownik można uruchomić program wpisując polecenie na klawiaturze lub klikając dwukrotnie ikonę programu. W obu przypadkach tworzony jest nowy proces i początek są w nim programy. W systemy przetwarzania wsadowego na komputerach mainframe użytkownicy przesyłają zadanie (prawdopodobnie korzystając ze zdalnego dostępu), a system operacyjny tworzy nowy proces i rozpoczyna kolejne zadanie z kolejki, gdy zwolnią się niezbędne zasoby.

2. Z technicznego punktu widzenia we wszystkich tych przypadkach nowy proces tworzony jest w ten sam sposób: bieżący proces wykonuje system wniosek aby stworzyć nowy proces. Podsystem zarządzania procesami i wątkami odpowiada za zapewnienie procesom niezbędnych zasobów. System operacyjny utrzymuje w pamięci specjalne struktury informacyjne, w których rejestruje, które zasoby są przydzielone każdemu procesowi. Może przypisywać zasoby do procesu do wyłącznego użytku lub do wspólnego użytku z innymi procesami. Część zasobów przydzielana jest procesowi w momencie jego tworzenia, a część przydzielana jest dynamicznie Przez zapytania w czas realizacji. Zasoby mogą być przydzielane procesowi na całe jego życie lub tylko na określony okres. Wykonując te funkcje, podsystem kontroli procesu współdziała z innymi podsystemami systemu operacyjnego odpowiedzialnymi za zarządzanie zasobami, takie jak podsystem zarządzania pamięcią, podsystem wejścia/wyjścia, system plików.

3. Aby zapobiec zakłócaniu procesów alokacja zasobów, a także nie mogli wzajemnie niszczyć kodów i danych, Najważniejszym zadaniem systemu operacyjnego jest izolowanie jednego procesu od drugiego. Dla tego system operacyjny zapewnia każdemu procesowi oddzielną wirtualną przestrzeń adresową, dzięki czemu żaden proces nie może uzyskać bezpośredniego dostępu do poleceń i danych innego procesu.

4. W systemie operacyjnym, w którym istnieją procesy i wątki, proces jest uważany za żądanie wykorzystania wszystkich typów zasobów z wyjątkiem jednego – czasu procesora. To najważniejsze ratunek dystrybuowane przez system operacyjny pomiędzy innymi jednostkami pracy - wątkami, które otrzymały swoją nazwę ze względu na fakt, że reprezentują sekwencje (wątki wykonania) poleceń. Przejście z wykonania jednego wątku do drugiego następuje w wynikuplanowanie Iwysyłanie . Stanowisko Przez Określenie momentu, w którym bieżący wątek powinien zostać przerwany i wątek, któremu należy pozwolić na uruchomienie, nazywa się planowaniem. Planowanie wątków odbywa się na podstawie informacji przechowywanych w deskryptorach procesów i wątków. Podczas planowania jest to brane pod uwagę priorytet wątku, skumulowany czas oczekiwania w kolejce czas realizacji, intensywność dostępu do wejść/wyjść i inne czynniki.

5. Dyspozycja polega na wdrożeniu rozwiązania znalezionego w wyniku planowania, tj. podczas przełączania procesora z jednego wątku na drugi. Wysyłka odbywa się w trzech etapach:

    zapisanie kontekstu bieżącego wątku;

    uruchomienie nowego wątku do wykonania.

6. Kiedy system wykonuje jednocześnie wiele niezależnych zadań, pojawiają się dodatkowe problemy. Chociaż wątki powstają i działają synchronicznie, może zaistnieć potrzeba interakcji na przykład podczas wymiany danych. Do wzajemnej komunikacji procesy i wątki mogą wykorzystywać szeroką gamę możliwości: kanały (w formacie UNIX-a), skrzynki pocztowe ( Okna), zdalne wywołanie procedury, gniazda (in Oknałączyć procesy na różnych maszynach). Dopasowanie prędkości wątków jest również bardzo ważne, aby zapobiec warunkom wyścigu (gdzie wiele wątków próbuje zmienić to samo plik), zakleszczenia i inne kolizje występujące podczas współdzielenia zasobów.

7. Synchronizacja wątki to jedna z najważniejszych funkcji podsystemu zarządzania procesami i wątkami. Nowoczesne systemy operacyjne zapewniają różnorodne mechanizmy synchronizacji, w tym semafory, muteksy, regiony krytyczne i zdarzenia. Wszystkie te mechanizmy pracuj z wątkami, a nie procesami. Dlatego kiedy przepływ bloków na semaforze, inne wątki w tym procesie mogą nadal działać.

8. Za każdym razem, gdy proces się kończy, – a dzieje się tak na skutek jednego z następujących zdarzeń: normalne Wyjście, Wyjście Przez błąd, Wyjście Przez błąd krytyczny, zniszczenie przez inny proces - system operacyjny podejmuje kroki, aby „oczyścić ślady” swojej obecności w systemie. Podsystem zarządzania procesami zamyka wszystkie pliki, z którymi proces współpracował, uwalniając obszary pamięci RAM przeznaczone na kody, dane i struktury informacyjne systemu. Wykonano korekta wszelkiego rodzaju kolejki systemu operacyjnego i lista zasoby zawierające łącza do kończącego się procesu.

Podsystem sterowania procesem

Program uruchomiony do wykonania generuje jeden lub więcej procesy(Lub zadania). Podsystem sterowania procesem kontroluje:

Tworzenie i usuwanie procesów

Podział zasobów systemowych (pamięci, zasobów obliczeniowych) pomiędzy procesami

Synchronizacja procesów

Komunikacja międzyprocesowa

Oczywiście, ogólnie rzecz biorąc, liczba aktywnych procesów przekracza liczbę procesorów w komputerze, ale w danym momencie na każdym procesorze może działać tylko jeden proces. System operacyjny zarządza dostępem procesów do zasobów obliczeniowych, tworząc jednocześnie poczucie wielozadaniowości.

Specjalne zadanie jądra o nazwie menedżer Lub planista procesów (harmonogram), rozwiązuje konflikty pomiędzy procesami konkurującymi o zasoby systemowe (procesor, pamięć, urządzenia wejścia/wyjścia). Harmonogram rozpoczyna proces do wykonania, dbając o to, aby proces nie przejął wyłącznie współdzielonych zasobów systemowych. Proces zwalnia procesor podczas oczekiwania na długą operację we/wy lub po upływie określonego czasu. W takim przypadku program planujący wybiera kolejny proces o najwyższym priorytecie i uruchamia go do wykonania.

Moduł zarządzania pamięcią zapewnia rozmieszczenie pamięci RAM dla zadań aplikacji. Pamięć RAM jest drogim zasobem i generalnie rzadko jest jej „za dużo”. Jeśli nie ma wystarczającej ilości pamięci dla wszystkich procesów, jądro przenosi część procesu lub kilka procesów do pamięci dodatkowej (zwykle do specjalnego obszaru twardy dysk), uwalniając zasoby dla działającego procesu. Wszystkie nowoczesne systemy realizują tzw pamięć wirtualna: Proces działa we własnej logicznej przestrzeni adresowej, która może być znacznie większa niż dostępna pamięć fizyczna. Za zarządzanie pamięcią wirtualną procesu odpowiada także moduł zarządzania pamięcią.

Moduł komunikacji międzyprocesowej odpowiada za powiadamianie procesów o zdarzeniach za pomocą sygnałów i zapewnienie możliwości przesyłania danych pomiędzy różnymi procesami.

Niniejszy tekst jest fragmentem wprowadzającym. Z książki Wewnętrzna struktura systemu Microsoft Windows (rozdz. 8-11) autor Marek Russinowicz

Z książki Architektura systemu operacyjnego UNIX autor Bach Maurice J

ROZDZIAŁ 10. PODSYSTEM ZARZĄDZANIA WE/WY Podsystem zarządzania we/wy umożliwia procesom komunikację z urządzeniami peryferyjnymi, takimi jak napędy dyskowe i taśmowe, terminale, drukarki i sieci, z jednej strony oraz z modułami jądra,

Z książki DIY Serwer Linux autor

5.1.1. Ogólny schemat zarządzania procesami Każdy proces może wywołać całkowicie identyczny proces za pomocą funkcji fork(). Proces nadrzędny może poczekać, aż wszystkie procesy potomne zakończą wykonywanie, korzystając z wywołania systemowego Wait. W dowolnym momencie procesu

Z książki Podstawy AS/400 przez Soltisa Franka

5.3. Komendy sterujące procesem Komenda ps Komenda ps służy do wyświetlania informacji o aktualnie uruchomionych procesach. Polecenie to posiada wiele parametrów, o których możesz przeczytać w instrukcji (man ps). Tutaj opiszę tylko te najczęściej stosowane

Z książki Programowanie w Ruby [Ideologia języka, teoria i praktyka stosowania] przez Fultona Hala

Informacje o podsystemie pamięci Jednym z największych problemów każdego procesora jest jego zajęcie. Wydajność procesorów ogromnie wzrosła w ciągu ostatnich kilku lat, podwajając się średnio co dwa lata. Wydajność pamięci i we/wy nie nadąża

Z książki o Linuksie: Kompletny przewodnik autor Kolisnichenko Denis Nikołajewicz

Zarządzanie procesami Czas jest środkiem, za pomocą którego Natura zapobiega temu, aby wszystko wydarzyło się na raz. W komputerach proces służy jako taki środek. Proces to działający program. Składa się z programu wykonywalnego, danych programu i niektórych informacji

Z książki Programowanie dla systemu Linux. Profesjonalne podejście przez Mitchella Marka

14.1.3. Manipulacja procesami W tej sekcji omówimy manipulację procesami, chociaż utworzenie nowego procesu niekoniecznie wiąże się z uruchomieniem zewnętrznego programu. Głównym sposobem utworzenia nowego procesu jest metoda fork, której nazwa jest zgodna z

Z książki System operacyjny UNIX autor Robaczewski Andriej M.

9.2. Polecenia sterujące procesem 9.2.1. Hierarchia procesów: ps i pstree Już wiesz, że polecenie ps umożliwia przeglądanie informacji o wszystkich procesach uruchomionych w systemie w danej chwili (sekcja 3.2). Z przełącznikiem -f to polecenie wyświetla zarówno PID samego procesu, jak i PPID jego rodzica,

Z książki autora

3.1. Zaznajomienie się z procesami Aby rozpocząć realizację procesów, wystarczy zalogować się do systemu. Nawet jeśli użytkownik niczego nie uruchamia, tylko siedzi przed ekranem i pije kawę. w systemie wciąż jest promyk życia. Dowolny działający program

Z książki autora

Podsystem plików Podsystem plików zapewnia ujednolicony interfejs dostępu do danych znajdujących się na dyskach i urządzeniach peryferyjnych. Te same funkcje open(2), read(2), write(2) można wykorzystać zarówno podczas odczytu lub zapisu danych na dysk, jak i

Z książki autora

Podsystem wejścia/wyjścia Podsystem wejścia/wyjścia realizuje żądania z podsystemu plików i podsystemu sterowania procesami w celu uzyskania dostępu do urządzeń peryferyjnych (dysków, taśm, terminali itp.). Zapewnia niezbędne buforowanie danych i

Z książki autora

Z książki autora

Rozdział 3 Podsystem zarządzania procesami Sercem systemu operacyjnego UNIX jest podsystem zarządzania procesami. Prawie wszystkie działania jądra są powiązane z procesami, czy to obsługa wywołań systemowych, generowanie sygnału, alokacja pamięci, czy przetwarzanie

Z książki autora

Rozdział 4 Podsystem plików Większość danych w systemie operacyjnym UNIX jest przechowywana w plikach zorganizowanych w formie drzewa i umieszczonych na jakimś nośniku pamięci. Zwykle jest to dysk lokalny (tj. znajdujący się na tym samym komputerze, co sam system operacyjny).

Z książki autora

Rozdział 5 Podsystem we/wy Rzeczywista architektura we/wy jest ukryta przed procesem aplikacji przez kilka interfejsów. Jeden z nich, interfejs systemu plików, został omówiony w poprzednim rozdziale. Interakcję z zasobami zdalnymi zapewnia sieć

Z książki autora

Podsystem STREAMS Architektura podsystemu STREAMS została po raz pierwszy opisana w Ritchie, D.M., „A Stream Input-Output System”, AT&T Bell Laboratories Technical Journal, tom 63, nr 8, październik 1984) w roku 1984. Dwa lata później system ten został wdrożony w

Sercem systemu operacyjnego UNIX jest podsystem zarządzania procesami. Prawie wszystkie działania jądra są związane z procesem, czy to obsługa wywołań systemowych, generowanie sygnału, alokacja pamięci, obsługa wyjątków spowodowanych wykonaniem procesu, czy dostarczanie usług we/wy żądanych przez proces aplikacji.
O całej funkcjonalności systemu operacyjnego ostatecznie decyduje wykonanie określonych procesów, tak jak poziomy działania systemu to nic innego jak wygodna forma zdefiniowania grupy uruchomionych procesów. Możliwość terminalowego lub sieciowego dostępu do systemu, różne usługi tradycyjne dla UNIX-a - system drukowania, zdalne archiwa FTP, poczta elektroniczna i system konferencji prasowych - wszystko to jest wynikiem pewnych procesów. Procesy w systemie UNIX są nieodłącznie powiązane z dwoma najważniejszymi zasobami systemu: procesorem i pamięcią RAM. Z reguły tych zasobów nigdy nie jest „dużo”, a w systemie operacyjnym trwa aktywna konkurencja o prawo do posiadania procesora i pamięci. A ponieważ UNIX jest systemem wielozadaniowym ogólnego przeznaczenia, zadanie sprawiedliwego rozdzielenia tych zasobów pomiędzy zadania różnych klas i o różnych wymaganiach nie jest trywialne.
Ponieważ program uruchomiony do wykonania generuje jeden lub więcej
procesy (lub zadania). Podsystem sterowania procesem kontroluje:
  • Tworzenie i usuwanie procesów
  • Podział zasobów systemowych (pamięci, zasobów obliczeniowych) pomiędzy procesami
  • Synchronizacja procesów
  • Komunikacja międzyprocesowa
Jest oczywiste, że w ogólnym przypadku liczba aktywnych procesów przekracza liczbę procesorów komputera,
ale w danym momencie na każdym procesorze może działać tylko jeden proces. System operacyjny kontroluje dostęp procesów do zasobów obliczeniowych,
tworząc poczucie wielozadaniowości. Specjalne zadanie jądra zwane harmonogramem procesów rozwiązuje konflikty pomiędzy procesami konkurującymi o zasoby systemowe (procesor, pamięć, urządzenia we/wy). Harmonogram rozpoczyna proces do wykonania, dbając o to, aby proces nie przejął wyłącznie współdzielonych zasobów systemowych. Proces zwalnia procesor podczas oczekiwania na długą operację we/wy lub po niejkwant czasu. W takim przypadku osoba planująca wybiera proces o najwyższym priorytecie i rozpoczyna pracęto do wykonania.

Moduł zarządzania pamięcią zapewnia alokację pamięci RAM dla zadań aplikacji.Jeśli nie ma wystarczającej ilości pamięci dla wszystkich procesów, jądro przenosi części procesu
lub wiele procesów do pamięci dodatkowej (zwykle specjalnego obszaru dysku twardego), uwalniając zasoby dla uruchomionego procesu.

Wszystkie nowoczesne systemy implementują tak zwaną pamięć wirtualną: proces przebiega we własnej logicznej przestrzeni adresowej, która może być znacznie większa niż dostępna pamięć fizyczna. Za zarządzanie pamięcią wirtualną procesu odpowiada także moduł zarządzania pamięcią.
Moduł komunikacji międzyprocesowej odpowiada za powiadamianie procesów o zdarzeniach za pomocą sygnałów i zapewnienie możliwości przesyłania danych pomiędzy różnymi procesami.

Podstawy kontroli procesu

Proces UNIX to wykonywalny obraz programu, który zawiera mapowanie pamięci pliku wykonywalnego uzyskanego w wyniku kompilacji, tj. o istnieją tłumaczenia modułów programu, języków wysokiego poziomu, na równoważne moduły programu w danym językuniski poziom, taki jak ten:stos, kod biblioteki i dane, a także szereg struktur danych jądra potrzebnych do kontrolowania procesu, co jest dość duże ważny punkt dla lepszego zrozumienia zasad dystrybucji pamięci, jako jednego z najważniejszych zasobów w „konkurencji” procesów, czyli strukturyzowania danych!, umownie:
  • Stos (z bieżącego ) - obszar pamięci, w którym program przechowuje informacje o wywoływanych funkcjach, ich argumentach i każdej zmiennej lokalnej w funkcjach. Rozmiar obszaru może się zmieniać w trakcie działania programu. Kiedy funkcje są wywoływane, stos zwiększa się, a po ukończeniu zmniejsza się.
  • Kupa (aby uczyć ) to obszar pamięci, w którym program może robić, co chce. Wielkość obszaru może się różnić. Programista ma możliwość wykorzystania części pamięci sterty przy pomocy funkcji malloc(), po czym zwiększa się ten obszar pamięci. Zasoby są zwracane za pomocą free() , po czym sterta jest zmniejszana.
  • Kod (do segmentu kodu ) to obszar pamięci, w którym przechowywane są instrukcje maszynowe skompilowanego programu. Są one generowane przez kompilator, ale można je również zapisać ręcznie. Należy pamiętać, że ten obszar pamięci można również podzielić na trzy części (tekst, dane i BSS). Ten obszar pamięci ma stały rozmiar określony przez kompilator.UNIX-a. Profesjonalne programowanie Art. 259

To (między innymi) z góry określi pojawienie się (istnienie) segmentów i stron. Proces wykorzystuje podczas wykonywania różne zasoby systemowe — pamięć, procesor, usługi podsystemu plików i usługi podsystemu wejścia/wyjścia. Surowa prawda dotycząca każdego nowoczesnego systemu komputerowego jest taka, że ​​jeden procesor może obsłużyć tylko jeden proces w jednostce czasu, co z kolei jest z góry określone.pojawienie się (istnienie) „planisty”, za pomocą któregoSystem operacyjny UNIX stwarza iluzję, że wiele procesów działa jednocześnie, efektywnie rozdzielając zasoby systemowe pomiędzy aktywne procesy, jednocześnie zapobiegając monopolizacji wykorzystania tych zasobów przez którykolwiek z nich.

Nowy system operacyjny UNIX zapewniał realizację tylko dwóch procesów, po jednym dla każdego terminala podłączonego do PDP-7. Rok później na tym samym PDP-7 liczba procesów zauważalnie wzrosła, pojawiło się wywołanie systemowe widelec. W pierwszej edycji UNIX-a wprowadzono to wywołanie byli, ale system operacyjny nadal pozwalał na umieszczenie w pamięci tylko jednego procesu na raz. Wraz z wdrożeniem podsystemu zarządzania pamięcią sprzętową w PDP-11, system operacyjny został zmodyfikowany, aby umożliwić ładowanie wielu procesów do pamięci jednocześnie, skracając w ten sposób czas potrzebny na przechowywanie obrazu procesu w pamięci dodatkowej (na dysku). i przeczytaj go ponownie, gdy proces będzie kontynuowany. Jednak aż do 1972 roku UNIX nie mógł być nazywany systemem prawdziwie wielozadaniowym, ponieważ operacje we/wy pozostawały synchroniczne, a inne procesy nie mogły być wykonywane, dopóki ich „kolega” nie zakończył operacji we/wy. Prawdziwa wielozadaniowość pojawiła się dopiero, gdy kod UNIX został przepisany w języku C w 1973 roku. Od tego czasu podstawy zarządzania procesami pozostały praktycznie niezmienione.


Wykonanie procesu może odbywać się w dwóch trybach - w trybie jądra ( tryb jądra) lub w trybie zadań ( tryb użytkownika). W trybie zadań proces wykonuje instrukcje programu aplikacji, które są dozwolone na nieuprzywilejowanym poziomie bezpieczeństwa procesora. W tym przypadku systemowe struktury danych nie są dostępne dla procesu. Kiedy proces potrzebuje otrzymać jakieś usługi jądra, wykonuje wywołanie systemowe, które wykonuje instrukcje jądra znajdujące się na poziomie uprzywilejowanym.

Chociaż instrukcje jądra są wykonywane, robią to w imieniu procesu, który wykonał wywołanie systemowe. Wykonanie procesu przełącza się następnie do trybu jądra. W ten sposób jądro systemu chroni własną przestrzeń adresową przed dostępem procesu aplikacji, co mogłoby naruszyć integralność struktur danych jądra i doprowadzić do zniszczenia systemu operacyjnego.

Co więcej, niektóre instrukcje procesora, na przykład zmieniające rejestry związane z zarządzaniem pamięcią, mogą być wykonywane tylko w trybie jądra.
W związku z tym obraz procesu składa się z dwóch części: danych trybu jądra i danych trybu zadania. Obraz procesu w trybie zadania składa się z segmentu kodu, danych, stosu, bibliotek i innych struktur danych, do których ma bezpośredni dostęp. Obraz procesu w trybie jądra składa się ze struktur danych niedostępnych dla procesu w trybie zadaniowym, które są wykorzystywane przez jądro do kontrolowania procesu. Obejmuje to dane dyktowane przez sprzęt, takie jak stany rejestrów, tablice mapowania pamięci itp., a także struktury danych potrzebne jądru do obsługi procesu. Ogólnie rzecz biorąc, w trybie jądra proces może uzyskać dostęp do dowolnego obszaru pamięci.

Struktury danych procesowych

Każdy proces jest reprezentowany w systemie przez dwie główne struktury danych proc I użytkownik,

opisane odpowiednio w plikach sys/proc.h I sys/użytkownik.h. Zawartość i format tych struktur różni się w zależności od wersji systemu UNIX.

....................................................................................................

https://m.habr.com/ru/company/*nix<-----------
….................................................................................................
W dowolnym momencie struktura danych proc dla wszystkich procesów muszą znajdować się w pamięci, chociaż pozostałe struktury danych, w tym obraz procesu, można przenieść do pamięci dodatkowej, obszaru wymiany. Dzięki temu jądro ma pod ręką minimum informacji potrzebnych do zlokalizowania pozostałych danych istotnych dla procesu, nawet jeśli nie znajdują się one w pamięci. Struktura proc to wpis w tablicy procesów systemowych, który, jak właśnie zauważyliśmy, zawsze znajduje się w pamięci RAM. Wpis w tej tabeli dotyczący aktualnie uruchomionego procesu jest adresowany przez zmienną systemową curproc. Za każdym razem następuje przełączenie kontekstu, w którym zasoby procesora są przenoszone do innego
procesie, wartość zmiennej odpowiednio się zmienia program nauczania, który teraz wskazuje na strukturę proc aktywny proces. Druga wspomniana konstrukcja użytkownik, nazywane również obszar u Lub U-blok, zawiera dodatkowe dane procesowe, które są wymagane przez jądro tylko podczas wykonywania procesu (to znaczy, gdy procesor wykonuje instrukcje procesu w trybie jądra lub zadania). Inaczej o strukturze proc, adresowany przez wskaźnik program nauczania, dane użytkownik są położone
(dokładniej wyświetlane) w określonym miejscu pamięci wirtualnej jądra i są adresowane do zmiennej ty. Poniżej pokazane są dwie główne struktury danych procesów oraz sposób, w jaki jądro UNIX je adresuje.
W obszar u Przechowywane są dane, które są wykorzystywane przez wiele podsystemów jądra i nie tylko do sterowania procesami. W szczególności zawiera informacje o otwartych deskryptorach plików, dyspozycji sygnału, statystykach wykonania procesu oraz zapisanych wartościach rejestrów w przypadku wstrzymania wykonywania procesu. Oczywiście proces nie powinien mieć możliwości dowolnej modyfikacji tych danych, więc obszar u jest chroniony przed dostępem w trybie zadania. Jak widać z rysunku, obszar u zawiera także stos o stałym rozmiarze, stos systemowy lub stos jądra. Kiedy proces działa w trybie jądra, system operacyjny używa tego stosu, a nie normalnego stosu procesu.

Stany procesów

Cykl życia procesu można podzielić na kilka stanów. Przejście procesu z jednego stanu do drugiego następuje w zależności od wystąpienia określonych zdarzeń w systemie.
  • 1. Proces działa w trybie zadania. W takim przypadku procesor wykonuje instrukcje aplikacji tego procesu.
  • 2. Proces działa w trybie jądra. W takim przypadku procesor wykonuje instrukcje systemowejądro systemu operacyjnego w imieniu procesu.
  • 3 . Proces nie jest uruchomiony, ale jest gotowy do uruchomienia zaraz po uruchomieniu programu planującegowybierze go (stan umożliwiający wykonanie).Proces znajduje się w kolejce wykonania i ma wszystkozasobów, których potrzebuje, z wyjątkiem zasobów obliczeniowych.
  • 4. Proces znajduje się w stanie uśpienia (uśpienia), czekając na coś niedostępnegodany moment zasobu, taki jak zakończenie operacji we/wy.
  • 5. Proces powraca z trybu jądra do trybu zadaniowego, ale jądro przerywa go i produkujeprzełączanie kontekstu w celu uruchomienia procesu o wyższym priorytecie.
  • 6. Proces został właśnie utworzony za pomocą forka i jest w fazie przejściowejstan: istnieje, ale nie jest gotowy do działania i nie znajduje się w stanie uśpienia.
  • 7. Proces wykonał wywołanie systemowe wyjścia i wszedł w stanzombie (zombie, nieistniejący). Nie ma procesu jako takiego, ale zapisy pozostają,zawierający kod powrotu i tymczasowe statystyki jego wykonania, dostępne dla procesu nadrzędnego.Stan ten jest stanem końcowym w cyklu życia procesu.
Należy zaznaczyć, że nie wszystkie procesy przechodzą przez cały podany powyżej zestaw stanów.Od tego stanu proces rozpoczyna swoją drogę życia 6 gdy proces nadrzędny wykonuje wywołanie systemowe widelec(). Po całkowitym zakończeniu tworzenia procesu, proces kończy „potomek” wywołania i przechodzi w stan 3 gotowy do uruchomienia, czeka na niego
kolejki realizacji. Gdy program planujący wybiera proces do wykonania, przechodzi w stan 1 i działa w trybie zadań. Wykonywanie trybu zadania kończy się w wyniku wywołania systemowego lub przerwania, a proces przechodzi do trybu jądra, w którym wykonywane jest wywołanie systemowe lub kod przerwania. Następnie proces może ponownie powrócić do trybu zadania. Jednakże podczas wykonywania wywołania systemowego w trybie jądra proces może potrzebować zasobu, który nie jest aktualnie dostępny. Aby poczekać na dostęp do takiego zasobu, proces wywołuje funkcję jądra spać() i przechodzi w stan uśpienia 4 . W tym przypadku proces dobrowolnie zwalnia zasoby obliczeniowe, które są przekazywane procesowi o kolejnym najwyższym priorytecie. Kiedy zasób stanie się dostępny, jądro „budzi proces” za pomocą tej funkcji budzić się() umieszcza go w kolejce wykonania, a proces przechodzi w stan „gotowy do uruchomienia”. 3 .
Gdy procesowi zostaną udostępnione zasoby obliczeniowe, następuje przełączenie kontekstu, w wyniku którego zostaje zapisany obraz, czyli kontekst bieżącego procesu, a kontrola zostaje przekazana nowemu. Przełączenie kontekstu może nastąpić na przykład wtedy, gdy proces przejdzie w stan uśpienia lub gdy proces o wyższym priorytecie niż bieżący jest gotowy do uruchomienia. W tym drugim przypadku jądro nie może natychmiast przerwać bieżącego procesu i dokonać zmiany kontekstu. Faktem jest, że przełączanie kontekstu podczas wykonywania w trybie jądra może prowadzić do naruszenia integralności samego systemu.
Dlatego też przełączenie kontekstu jest opóźnione do momentu przejścia procesu z trybu jądra do trybu zadaniowego, kiedy wszystkie operacje systemowe zostaną zakończone, a struktury danych jądra znajdą się w normalnym stanie.
Zatem po wybraniu przez program planujący procesu do uruchomienia, ten ostatni rozpoczyna jego realizację
wykonanie w trybie jądra, gdzie kończy zmianę kontekstu. Dalszy warunek
proces zależy od jego historii: jeśli proces został właśnie utworzony lub został przerwany, wracając do trybu zadaniowego, natychmiast przechodzi w ten tryb. Jeśli proces rozpoczyna wykonywanie po stanie uśpienia, kontynuuje działanie w trybie jądra, kończąc wywołanie systemowe. Należy pamiętać, że taki proces może zostać przerwany po zakończeniu wywołania systemowego podczas przejścia z trybu jądra do trybu zadania, jeśli w kolejce znajduje się proces o wyższym priorytecie. UNIX 4xBSD definiuje dodatkowe stany procesów, związane przede wszystkim z systemem kontroli zadań i interakcją procesu z terminalem. Proces można wprowadzić w stan „zatrzymany” za pomocą sygnałów stopu SIGSTOP, SIGTTIN Lub SYGTOU. W przeciwieństwie do innych sygnałów, które są przetwarzane tylko dla działającego procesu, wysłanie tych sygnałów powoduje natychmiastową zmianę stanu.W tym przypadku, jeśli proces jest uruchomiony lub znajduje się w kolejce do uruchomienia, jego stan zmienia się na „zatrzymany”. Jeżeli proces był w stanie uśpienia, jego stan zmieni się na „zatrzymany w stanie uśpienia”. Wyjście z tych stanów następuje poprzez sygnał kontynuacji SIGCONT w tym przypadku proces przechodzi ze stanu „zatrzymany” do stanu „gotowy do uruchomienia”, a dla procesu zatrzymanego w stanie uśpienia kolejnym celem jest kontynuacja „uśpienia”.
Opisane możliwości są w pełni zaimplementowane w SVR4.

Wyjątek dotyczy procesów znajdujących się w stanie uśpienia
zdarzenie o niskim priorytecie, tj. zdarzenie, którego prawdopodobieństwo wystąpienia jest stosunkowo niskie (na przykład wejście z klawiatury, które może nie nastąpić).

Na koniec proces wykonuje wywołanie systemowe Wyjście() i kończy jego realizację. Zakończenie procesu może nastąpić także w wyniku odebrania sygnału. W obu przypadkach jądro zostaje zwolnione zasoby będące własnością procesu, z wyłączeniem jego kodu zwrotnego i statystyk wykonania, orazwprowadza proces w stan „zombie”. Proces pozostaje w tym stanie do czasu wykonania przez proces nadrzędny jednego z wywołań systemowych, po czym wszelkie informacje o procesie zostaną zniszczone, a proces nadrzędny otrzyma kod powrotu zakończonego procesu.

Zasady zarządzania pamięcią

Marshall Kirk McKusick FreeBSD - Architektura i wdrażanie<<-----------PDF ст.166

Zarządzanie pamięcią, część 1

12:51 - Rozpoznawanie adresów 34:21 - Nakładka, dynamiczna struktura

59:26 - Liniowe mapowanie ciągłe - Odcinkowo liniowe (art. 25)


Zarządzanie pamięcią, część 2

Co się stało na początku? OOP lub pamięć wirtualna.

51:44--> „Pamięć wirtualna”;<-(стр. 18)->56:03--> „Segmenty”;


Asocjacyjny bufor rozgłoszeniowy, Bufor podglądowy tłumaczenia(TLB) to wyspecjalizowana pamięć podręczna procesora używana do przyspieszania translacji adresu pamięci wirtualnej na adres pamięci fizycznej.
https://ru.wikipedia.org
https://www.ibm.com/support/knowledgecenter/. Performance/cache_tlbs.htm

Jedną z głównych funkcji systemu operacyjnego jest efektywne zarządzanie pamięcią.
RAM lub pamięć główna lub pamięć o dostępie swobodnym (pamięć o dostępie swobodnym, RAM). Czas dostępu do pamięci RAM to tylko kilka cykli procesora, więc praca z danymi w pamięci zapewnia maksymalną wydajność.
Zasób ten jest zwykle ograniczony. W większym stopniu dotyczy to wielozadaniowego systemu operacyjnego ogólnego przeznaczenia, jakim jest UNIX.
Dlatego też dane, których nie da się umieścić w pamięci RAM, lokowane są na nośnikach wtórnych, czyli w pamięci dodatkowej, której rolę pełni zazwyczaj
napędy dyskowe. Czas dostępu do pamięci dodatkowej jest o kilka rzędów wielkości dłuższy niż czas dostępu do pamięci RAM i wymaga aktywnej pomocy systemu operacyjnego.
Podsystem zarządzania pamięcią UNIX odpowiada za sprawiedliwą i efektywną alokację
współdzielony zasób pamięci RAM pomiędzy procesami oraz do wymiany danych pomiędzy pamięcią RAM a pamięcią dodatkową. Niektóre operacje wykonywane są sprzętowo, przez urządzenie
jednostka zarządzająca pamięcią (MMU) procesora pod kontrolą systemu operacyjnego, osiągając w ten sposób wymaganą wydajność.
Prymitywne zarządzanie pamięcią znacznie ogranicza funkcjonalność systemu operacyjnego. Systemy takie z reguły pozwalają na załadowanie pojedynczego zadania w określone miejsce w pamięci RAM i przekazanie do niego kontroli. W tym przypadku zadanie otrzymuje
utylizacja wszystkich zasobów komputera (oczywiście współdzieląc je z systemem operacyjnym),
a adresy używane przez zadanie to fizyczne adresy RAM.
Ponieważ ta metoda uruchamiania i wykonywania jednego programu jest z pewnością najszybsza, często jest stosowana w wyspecjalizowanych systemach mikroprocesorowych, ale praktycznie nie ma zastosowania w systemach operacyjnych ogólnego przeznaczenia, takich jak UNIX.
Można sformułować szereg możliwości, jakie powinien zapewniać podsystem zarządzania pamięcią współczesnego wielozadaniowego systemu operacyjnego:

  • Wykonywanie zadań, których wielkość przekracza wielkość operacyjną pamięć.
  • Wykonaj częściowo załadowane zadania w pamięci, aby je zminimalizowaćczas ich uruchomienia.
  • Umieść wiele zadań w pamięci jednocześnie, aby poprawić wydajność procesora.
  • Umieszczenie zadania w dowolnej lokalizacji w pamięci RAM.
  • Umieszczenie zadania w kilku różnych częściach pamięci RAM.
  • Udostępnianie tych samych obszarów pamięci między wieloma zadaniami.Na przykład wiele procesów uruchamiających ten sam program może współdzielić segment kodu.
  • możliwość tworzenia kodów niezależnych od maszyny, to znaczy z góry nie powinno być połączenia między programem a pamięcią fizyczną.
Wszystkie te funkcje są zaimplementowane w nowoczesnych wersjach systemu UNIX pamięć wirtualna, wydajność wielozadaniowego systemu operacyjnego jako całości zależy w dużej mierze od efektywności wdrożenia i działania tego podsystemu. Pozwala aplikacji stworzyć iluzję posiadania dużej ilości dostępnej pamięci, podczas gdy w rzeczywistości komputer może mieć tylko niewielką ilość pamięci RAM. Wymaga to zdefiniowania abstrakcji „przestrzeni adresowej”, która różni się od fizycznej lokalizacji pamięci. Program tworzy w swojej przestrzeni adresowej łącza do kodów i danych, które należy zamienić na adresy komórek RAM. Przesyłanie informacji do pamięci głównej w celu wykorzystania przez program i przeprowadzanie translacji adresów przy każdym dostępie do pamięci wymusza współdziałanie zarówno oprogramowania, jak i sprzętu komputera.
PS: LINUX

Co więcej, proces działa z adresami wirtualnymi, a nie fizycznymi.

Konwersja odbywa się poprzez obliczenia z wykorzystaniem tabel deskryptorów i katalogów tabel.

Linux obsługuje 3 poziomy tabel: katalog tabel pierwszego poziomu ( PGD- Katalog tabel stron),

katalog tabel drugiego poziomu ( PMD- Medium Page Table Dictory) i wreszcie tabela deskryptorów (PTE- Wpis tabeli strony). W rzeczywistości nie wszystkie poziomy mogą być obsługiwane przez konkretny procesor,ale zapas pozwala na obsługę większej liczby możliwych architektur (Intel ma 2 poziomy tabel, i Alfa – aż 3).

Konwersja adresu wirtualnego na fizyczny odbywa się w 3 etapach. Wskaźnik jest brany PGD, istniejący w strukturze opisującej każdy proces, jest konwertowany na wskaźnik rekordu PMD, a ten ostatni jest konwertowany na wskaźnik w tabeli deskryptorów PTE. I wreszcie pod prawdziwy adres,wskazując początek strony dodawane jest przesunięcie od jej początku. Dobry przykład takiej procedury można znaleźć w funkcji jądra< częściowe_wyczyszczenie>.


Pamięć wirtualna i fizyczna

Pamięć RAM jest jednym z ważnych elementów systemu komputerowego. Wczesne systemy UNIX dysponowały 64 KB pamięci RAM, a ta ilość była wyraźnie niewystarczająca; współczesne komputery mają gigabajty pamięci RAM, a to wciąż za mało.
Pamięć RAM można przedstawić jako sekwencję bajtów, z których każdy ma swój własny, unikalny adres, zwany adresem fizycznym. To właśnie te adresy ostatecznie wykorzystuje procesor podczas wymiany danych z pamięcią RAM. Jednakże przestrzeń adresowa procesu różni się znacznie od przestrzeni adresowej fizycznej pamięci RAM. Wyobraźmy sobie, że przestrzeń adresowa procesu została bezpośrednio odwzorowana w pamięci RAM, innymi słowy, że adresy używane przez proces są adresami fizycznymi. Przy takim podejściu na drodze do stworzenia systemu wielozadaniowego czekałby na nas szereg przeszkód nie do pokonania:
  • Po pierwsze, trudno sobie wyobrazić mechanizm chroniący przestrzeń adresową pojedynczego procesu,z przestrzeni adresowej innego lub, co ważniejsze, z przestrzeni adresowej samego systemu operacyjnego.Ponieważ każdy proces działa na adresach fizycznych, nie ma gwarancji, że proces nie uzyska dostępukomórki pamięci należące do innych procesów lub jądra systemu.Konsekwencje takiego leczenia będą najprawdopodobniej bardzo tragiczne.
  • Po drugie, już na etapie kompilacji konieczne byłoby zapewnienie dystrybucjiistniejącą fizyczną przestrzeń adresową. Po uruchomieniu każdy proces musizajmują ciągły i niezachodzący na siebie obszar adresów fizycznych.
  • Po trzecie, taki podział pamięci pomiędzy procesami jest mało prawdopodobnymożna nazwać optymalnym. Objętość fizycznego działaniapamięć znacznie ograniczy liczbę procesówjednocześnie działające w systemie. Zatem osiem procesów,z których każdy zajmuje 1 MB pamięci, zajmie 8 MBRAM i system operacyjny przy średnim obciążeniuma ponad 80 procesów!
Wszystkie te problemy można rozwiązać za pomocą pamięci wirtualnej.
Jednak adresy używane przez aplikacje i samo jądro nie muszą odpowiadać adresom fizycznym. Adresy wirtualne są tłumaczone lub mapowane na adresy fizyczne na poziomie sprzętowym przy aktywnym udziale jądra systemu operacyjnego.Istotą pamięci wirtualnej jest to, że każdy proces działa we własnej wirtualnej przestrzeni adresowej.

Wirtualna przestrzeń adresowa to raj dla procesów.

  • Po pierwsze, proces ma poczucie ekskluzywności – wszak cała przestrzeń adresowanależy tylko do niego.
  • Po drugie, nie jest już ograniczona ilością pamięci fizycznej - pamięć wirtualna może znaczącoprzekraczać fizyczne W rezultacie procesy zostają odizolowane od siebie i nie mają żadnego charakterumożliwości (nawet jeśli jest to pożądane)„host” przestrzeń adresowa sąsiada. Pamięć fizyczna jest przydzielana w miarę możliwościwydajny - nie zależy od przydziału pamięci wirtualnej dla konkretnego procesu.
Oczywiście do implementacji pamięci wirtualnej potrzebny jest mechanizm zarządzanego mapowania
adres wirtualny na fizyczny. We współczesnych systemach komputerowych proces wyświetlania odbywa się na poziomie sprzętowym (za pomocą MMU)(bit MMU („bit „użyteczności”)) zapewniający wysoka prędkość transmisje.
System operacyjny zarządza tym procesem.

Nowoczesne procesory z reguły obsługują ujednolicenie przestrzeni adresowej (segment - organizacja pamięci strony):

V obszary o zmiennej wielkości - segmenty I

V obszary o stałym rozmiarze - strony,

pojęcie „strony” można interpretować jako sposób organizacji pamięci, gdy pamięć fizyczna jest podzielona na bloki o stałym rozmiarze (512-2 Kb, wielokrotność 2), a także pojęcie „segmentu”, „strony” jest jedną z podstawowych abstrakcji w zrozumieniu architektury i działania systemów operacyjnych. W takim przypadku każdy segment lub strona może mieć własne mapowanie adresów wirtualnych na adresy fizyczne.
Wirtualna przestrzeń adresowa procesu jest zwykle uporządkowana sekwencyjnie w ramach segmentów - kodu, danych, stosu i bibliotek. Lokalizacja odpowiednich obszarów pamięci fizycznej może się różnić fragmentowane postać. Rozmiar pamięci wirtualnej może znacznie przekroczyć rozmiar pamięci fizycznej poprzez wykorzystanie pamięci dodatkowej lub obszaru wymiany - zwykle miejsca na dysku, gdzie można przechowywać tymczasowo nieużywane części przestrzeni adresowej procesu. Na przykład, jeśli proces wykonuje się i uzyskuje dostęp do adresu wirtualnego, który zawiera odpowiednią stronę pamięci fizycznej, operacja odczytu lub zapisu zakończy się pomyślnie. Jeśli w pamięci RAM brakuje strony, procesor generuje przerwanie sprzętowe zwane błędem strony ( błąd strony), w odpowiedzi na co jądro określa położenie zapisanej zawartości strony w obszarze wymiany, wczytuje stronę do pamięci, ustawia parametry mapowania adresów wirtualnych na fizyczne i informuje procesor o konieczności powtórzenia operacji. Wszystkie te działania są niewidoczne dla aplikacji współpracującej z pamięcią wirtualną.
Niezbędny jest mechanizm mapowania adresów wirtualnych na fizyczne (translacja adresów).

zależy od konkretnej implementacji sprzętu. W tej sekcji omówiono mechanizm mapowania adresów wirtualnych na adresy fizyczne w systemie operacyjnym SCO UNIX na przykładzie rodziny procesorów Intel. Jednakże, podobnie jak w przypadku innych podsystemów UNIX, podstawowe zasady różnią się nieznacznie, a ta prezentacja pomoże wprowadzić mechanizmy zarządzania pamięcią i, jeśli to konieczne, zrozumieć konkretną implementację.

Segmenty

Rodzina procesorów Intel umożliwia podzielenie pamięci na kilka logicznych części zwanych segmentami. W tym przypadku przestrzeń adresową procesu można przedstawić w postaci kilku segmentów logicznych, z których każdy składa się z ciągłej sekwencji adresów leżących w danym zakresie. Tłumaczenie adresu w oparciu o segmentację
zapewnia jednoznaczne mapowanie adresów segmentów w ciągłą sekwencję
adresy fizyczne. Adres wirtualny składa się z dwóch części: selektora segmentu i
przesunięcie względem początku segmentu. Selektor(dokładniej pole selektora INDEKS) wskazuje
tzw. deskryptor segmentu zawierający parametry takie jak jego lokalizacja w pamięci,
rozmiar i prawa dostępu. Procesor umożliwia pośrednie adresowanie segmentów poprzez deskryptory segmentów, które umieszczone są w specjalnych tablicach – obszarach pamięci wskazywanych przez
przeznaczone do tego celu rejestry procesora. Jądro systemu operacyjnego jest odpowiedzialne za wypełnianie tych tabel i ustawianie wartości rejestrów. Innymi słowy, jądro ustawia mapowanie, a procesor wykonuje mapowanie sprzętowo. Dzięki temu adresowaniu pośredniemu segmenty logiczne są od siebie chronione, co zapewnia integralność procesu i przestrzeni adresowej jądra.
Deskryptory segmentów znajdują się w dwóch tabelach systemowych – lokalnej tablicy deskryptorów
(Tabela lokalnych deskryptorów - LDT) i globalną tabelę deskryptorów - GDT).
Jak sama nazwa wskazuje, LDT zapewnia wirtualną translację adresów segmentów procesów,
podczas gdy GDT obsługuje przestrzeń adresową jądra (na przykład podczas przetwarzania system
wywołanie lub przerwanie).Każdy proces ma swój własny LDT, natomiast GDT
wspólne dla wszystkich procesów. Informacje o tabeli, na którą wskazuje selektor, znajdują się w samym selektorze.

1 5 3 2 1 0

INDEKS T.I. RPL
Selektor segmentu
  • Pole INDEKS to numer (indeks) deskryptora w tabeli deskryptorów, który powinienużywany przy obliczaniu adresu liniowego.
  • Fragment T.I. określa, która tabela deskryptorów powinna zostać użytaØ - odpowiada GDT1 - odpowiada LDT
  • Pole RPL używany do kontrolowania praw dostępu programu do segmentu. jest wymaganepoziom uprawnień i jest jednym z mechanizmów zapewniających ochronę segmentu.Na przykład, jeśli proces w trybie zadania próbuje uzyskać dostęp do segmentu,należącego do jądra, procesor wygeneruje wyjątek, w odpowiedzi na który jądro wyśle ​​do procesu sygnał SIGSEGV.
Każdy wpis LDT lub GDT jest deskryptorem segmentu. Zdefiniowano kilka typów deskryptorów używanych dla segmentów kodu, danych i stosu, a także pewną liczbę deskryptorów,
za pomocą którego zapewniona jest wielozadaniowość i przeniesienie kontroli z zadania nieuprzywilejowanego, na przykład procesu w trybie zadania, do zadania uprzywilejowanego, na przykład jądra.
Deskryptory stosowane w tym drugim przypadku nazywane są bramkami.

Deskryptory segmentu (kod, dane, stos) mają kilka pól:

  • Adres podstawowy W tym polu przechowywany jest 32-bitowy adres początku segmentu. Do tego dokłada się procesoroffset i otrzymuje 32-bitowy adres liniowy.
  • Limit To pole określa rozmiar segmentu. Jeżeli wynikowyAdres liniowy wykracza poza granice segmentu, procesor generuje wyjątek.Granice segmentów umożliwiają procesorowi wykrywanie typowych błędów, takich jak przepełnienie stosu,nieprawidłowe wskaźniki, nieprawidłowe adresy połączeń iprzejścia. W przypadku, gdy system operacyjny w to wierzywywołanie poza segmentem nie jest błędem(na przykład w przypadku przepełnienia stosu) może rozwinąć segment poprzez alokacjędodatkową pamięć i zażądaj ponownego wykonania polecenia.
  • Uprawnienia To pole, zwane poziomem uprawnień deskryptora (DPL), definiuje poziomuprawnienia segmentu i jest używany w połączeniu z polem RPL selektora w celu zezwolenia lub odmowy dostępudo segmentu. Aby uzyskać dostęp do segmentu, zadanie musi być co najmniej na tym samym poziomieprzywileje, jaksegment, czyli RPL DPL.
  • Znak obecności. Bit ten zapewnia jeden z mechanizmów implementacji pamięci wirtualnej.Jeśli bit nie jest ustawiony podczas próby dostępudo segmentu procesor generuje brakujący wyjąteksegment, pozwalając jądru załadować segment z pamięci dodatkowej i powtórzyć instrukcję ponownie,bez wpływu na realizację procesu. Jednak w większości nowoczesnych wersjiPamięć wirtualna UNIX oparta jest na mechanizmie stronicowym,w którym segment jest zawsze obecny w pamięci, oraz wymianę pomiędzy operacyjnymi iPamięć wtórna występuje na poziomie strony.
  • Typ To pole określa typ segmentu. Procesor sprawdza typsegment pod kątem zgodności z wykonywanym poleceniem. W szczególności nie pozwala nam to na interpretacjęinformacje o segmencie danych w postaci instrukcji procesora.
  • Prawa dostępu Pole to definiuje prawa dostępu ograniczające zbióroperacje, które można wykonać na segmencie. Na przykład,segment kodu jest zwykle oznaczony jako wykonywalny i czytelny.Segmenty danych mogą mieć uprawnienia dostępu tylko do odczytu,lub do czytania i pisania.
Kombinacja selektora i offsetu tworzy adres logiczny. Jednostka sterująca pamięcią procesora
używa selektora do określenia odpowiadającego mu deskryptora. Dodając adres bazowy segmentu zapisanego w deskryptorze z przesunięciem, procesor tworzy adres liniowy. Jeśli stronicowanie nie jest używane, powstały adres liniowy jest adresem fizycznym używanym do bezpośredniego dostępu do pamięci RAM. Jednak implementacja pamięci wirtualnej obejmująca tylko segmenty nie jest wystarczająco elastyczna i nie jest używana w nowoczesnych wersjach. Zarządzanie pamięcią w większości systemów opiera się na mechanizmie stronicowania. Segmenty są używane przez jądro do przechowywania kodu, danych i stosu procesów, każdy z adresem bazowym równym zero i limitem 3 GB, tj. cała adresowalna pamięć wirtualna minus 1 GB zajmowane przez jądro systemu.
Podział wirtualnej przestrzeni adresowej pomiędzy jądro i procesy jest omówiony w „”.

Mechanizm strony

Przy wdrażaniu pamięci wirtualnej opartej wyłącznie na segmentacji cały segment może być obecny w pamięci RAM lub nieobecny (dokładniej znajdować się w pamięci dodatkowej lub w pliku wykonywalnym procesu).
Ponieważ rozmiar segmentu może być dość duży, jednoczesne wykonanie kilku dużych procesów spowoduje ostrą konkurencję o zasoby pamięci, co z kolei
doprowadzi do intensywnej wymiany danych pomiędzy pamięcią RAM a pamięcią dodatkową. Ponadto wymiana obszarów o zmiennej wielkości, jakimi są segmenty, jest dość złożona i choć fragmentacja pamięci będzie niewielka, będzie to prowadzić do niskiej efektywności jej wykorzystania,
pozostawiając dużą ilość niewykorzystanej przestrzeni.

Mechanizm stronicowy zapewnia znacznie większą elastyczność. W tym przypadku cała wirtualna przestrzeń adresowa (4 GB dla procesorów Intel) jest podzielona na bloki o równej wielkości zwane stronami. Większość procesorów Intel obsługuje strony o rozmiarze 4 KB. Podobnie jak w przypadku segmentacji, strona może znajdować się w pamięci RAM,
lub znajdować się w obszarze wymiany lub pliku wykonywalnym procesu. Główną zaletą tego schematu jest to, że system zarządzania pamięcią działa na dość małych obszarach
rozmiar, aby zapewnić efektywną alokację zasobów pamięci pomiędzy procesami.
Mechanizm stronicowania pozwala, aby część segmentu znajdowała się w pamięci RAM, a część nie. Daje to jądru możliwość umieszczenia w pamięci tylko tych stron, które są aktualnie używane przez proces, tym samym znacznie zwalniając pamięć RAM. Kolejną zaletą jest to, że strony segmentowe można umieszczać w pamięci fizycznej w dowolnej lokalizacji i kolejności, co pozwala na efektywne wykorzystanie wolnej przestrzeni.
To podejście przypomina schemat przechowywania plików na dysku – każdy plik składa się z
różną liczbę bloków przechowywania danych, które można umieścić w dowolnych wolnych obszarach Napęd. Prowadzi to do znacznej fragmentacji, ale znacząco poprawia efektywność wykorzystania przestrzeni dyskowej.

W przypadku stosowania mechanizmu stronicowania adres liniowy uzyskany poprzez dodanie adresu bazowego segmentu i offsetu jest jednocześnie adresem logicznym, który jest dodatkowo przetwarzany przez blok stronicowania procesora. W tym przypadku adres liniowy jest uznawany przez procesor za składający się z trzech części.


Wpis do katalogu stron, PDE- Pierwsze pole adresu, bity od 22 do 31, wskazuje wpis w katalogu tablicy stron PDE. Katalog tablic stron ma długość jednej strony i zawiera do 1024 wskaźników tabel stron. Zatem pierwsze pole odnosi się do konkretnej tabeli stron.
Wpis tabeli stron, PTE- Drugie pole, zajmujące bity od 12 do 21, wskazuje element tablicy strony RTE. Tabele stron również mają długość 4 KB, a elementy tabeli zajmują łącznie 1024 strony. Innymi słowy, drugie pole odnosi się do konkretnej strony.
Wreszcie przesunięcie strony jest określane przez trzecie pole, które zajmuje 12 dolnych bitów adresu liniowego. Zatem przy użyciu jednego katalogu tabeli proces może się adresować

1024 x 1024 x 4096 = 4 GB pamięci fizycznej.

Powyższy rysunek pokazuje, jak jednostka adresowania stron procesora tłumaczy adres liniowy na adres fizyczny. Procesor wykorzystuje pole adresu PDE (najwyższe 10 bitów) jako indeks do katalogu tabeli. Znalezionyelement zawiera adres tabeli stron. Drugie pole adresu liniowego PTE umożliwia procesorowi dokonanie wyborużądany element tabeli odnoszący się do strony fizycznej. Dodanie adresu początku strony z przesunięciem,zapisane w trzecim polu, procesor otrzymuje 32-bitowy adres fizyczny.

Większość nowoczesnych procesorów, a w szczególności rodzina procesorów Intel, umieszcza dane o kilku ostatnich stronach, z których korzystały, w ultraszybkiej pamięci podręcznej. Dopiero gdy procesor nie znajdzie wymaganej strony w tej pamięci podręcznej, uzyskuje dostęp do katalogów i tablic stron. Z reguły 99–98% łączy adresowych trafia do pamięci podręcznej, bez konieczności translacji adresów w celu uzyskania dostępu do pamięci RAM, w której znajduje się katalog i tabele.
Każdy element tabeli strony zawiera kilka pól opisujących różne

charakterystyka strony. Pola PTE:


P
Znak obecności w pamięci RAM. Dostęp do strony, której nie ma w pamięci (P=0) powoduje błąd strony, wyjątek, o którym procesor informuje jądro, które odpowiednio to obsługuje.
R/W Prawa tylko do odczytu strony (R/W=0) lub do odczytu i zapisu (R/W=1)

NAS
Uprawnienia dostępu. Jeśli U/S=0, tylko zadania uprzywilejowane(jądro) mają dostęp do adresów stron. W przeciwnym razie dostęp dostrona zawiera wszystkie zadania.
Adres Fizyczny adres początku strony (adres bazowy)

Przestrzeń adresowa procesu

Przestrzeń adresowa jądra jest zwykle taka sama, jak przestrzeń adresowa aktualnie uruchomionego procesu. W tym przypadku mówi się, że jądro znajduje się w tym samym kontekście co proces. Za każdym razem, gdy zasoby obliczeniowe są przesyłane do procesu, system jest odtwarzany
kontekst zadaniowy tego procesu, w tym wartości rejestrów ogólnego przeznaczenia, rejestrów segmentowych i wskaźników do tablic stron, które odwzorowują pamięć wirtualną procesu w trybie zadaniowym. Jednocześnie kontekst systemu pozostaje niezmienny dla wszystkich procesów. Widok przestrzeni adresowej procesu pokazano na poniższym rysunku.