Jądro jest tylko jedno (cz. 2)

Towar spod lady

Towar spod lady

Podobnie jak przeciętny pracownik "umysłowy", który potrzebuje dużo papieru w celu sporządzania notatek, dokonywania obliczeń, itp., tak i proces nie może obejść się bez miejsca, gdzie mógłby gromadzić informacje (a także przechować przydzielony mu program, czyli schemat działania). Dlatego też Jądro przewiduje taką możliwość i dysponuje pewnym medium gromadzenia danych, nazwanym Pamięcią Operacyjną (PaO). Jest to duży zestaw maleńkich pudełek. W każdym z nich może znaleść się tylko jedna drobna rzecz (konkretna informacja). Pudełka te są przydzielane tymczasowo poszczególnym procesom. Zaletą PaO jest to, że do "pudełek" można bardzo szybko sięgnąć, zaś wadą, że jest ich stosunkowo mało i nie zawsze zaspokajają potrzeby wszystkich procesów.

W pudełkach (zwanych komórkami PaO) procesy przechowują zgromadzone informacje aż do czasu następnej wizyty w procesorze, kiedy to mają szansę je przetworzyć. Każda komórka ma własny adres (numer, zwany też lokacją w PaO). Do rozporządzania komórkami Jądro wyznacza Moduł Zarządzania Pamięcią Operacyjną (MZPaO). Moduł ten stara się przydzielić je tak, aby podział był sprawiedliwy a jednocześnie, aby jak najmniej komórek się zmarnowało. Niestety, PaO jest wykorzystywana również przez Jądro i same Moduły. Muszą one przecież także przechować gdzieś m.in. informacje o tym, który proces dostał którą komórkę. Dlatego też, aby uniknąć przeładowania PaO niepotrzebnymi informacjami procesy dostają zazwyczaj "ciągłe" kawałki pamięci (po kolei - od adresu do adresu) i w ten sposób MZPaO musi jedynie zapisać gdzieś pierwszy i ostatni adres przydzielony procesowi, wiedząc, że wszystkie komórki o lokacjach znajdujących się pomiędzy nimi także są w jego dyspozycji.

Zarządzanie PaO jest jednym z najbardziej skomplikowanych zadań Jądra. Istnieje wiele metod dzielenia PaO między procesy tak, aby uzyskać jak największą efektywność pracy. W systemach, gdzie jest mało procesów i wykonują się one do końca można przydzielić aktualnie pracującemu procesowi całą wolną pamięć. Po wykonaniu zadania przechodzi ona w ręce następnego, itd. W większych systemach, gdzie procesów jest wiele i każdy potrzebuje stosunkowo mało miejsca, stosuje się inne metody.

Pierwszą, najprostszą klasą metod zarządzania PaO jest podział statyczny. Oznacza to, że pamięć jest podzielona na kilka części o niezmiennej wielkości zaś proces otrzymuje do pracy jedną i tylko jedną z nich. Stosując tę metodę może okazać się jednak, że proces nie potrzebuje aż tak dużej ilości komórek jaka została mu przydzielona, tak więc część z nich pozostaje nie wykorzystana. Taką niepożądaną sytuację (wolne komórki są przez pewien czas bezużyteczne) nazywa się fragmentacją wewnętrzną.

Nieco bardziej skomplikowana jest klasa strategii zwana podziałem dynamicznym. Stosując tę metodę MZPaO przypisuje procesom dokładnie tyle pamięci ile potrzebują one do pracy (wśród wolnych komórek wyszukuje się "ciągły" fragment, wystarczająco duży dla potrzeb procesu). W niektórych systemach komórki do przydzielenia wybiera się wedle strategii First Fit (pierwszy pasujący). Oznacza to, że proces otrzymuje fragment pierwszego z kolei (wyszukując adresy od najmniejszego do największego) wystarczająco dużego obszaru PaO. Inne strategie (Best Fit, Last Fit, Worst Fit) działają podobnie, wybierając w pewien sposób jeden z wolnych obszarów i wykorzystując jego część. Niestety metoda ta ma poważną wadę. Jeśli kilka procesów zajmie po kawałku pamięci, może okazać się, że między zajętymi obszarami znajdują się wolne fragmenty zbyt małe aby mógł z nich skorzystać inny proces. Jednak gdyby istniał "ciągły" obszar o wielkości równej sumie tych kawałków, mógłby wystarczyć on na zaspokojenie potrzeb pozostałych procesów. Zjawisko to (także bardzo niepożądane) nazywa się fragmentacją zewnętrzną.

Aby pozbyć się fragmentacji zewnętrznej, MZPaO może zastosować metodę zwaną relokacją. Oznacza to, że w wypadku niewystarczającej ilości pamięci, praca wszystkich procesów zostaje chwilowo przerwana, po czym przydziela się im obszary (takiej samej wielkości jak poprzednio, lecz zaczynające się w innym miejscu) położone tuż obok siebie. Przepisuje się tam wszystkie informacje znajdujące się w starych lokacjach. W ten sposób Jądro może uzyskać potrzebny innemu procesowi fragment wolnej pamięci. Metoda ta jest jednak bardzo czasochłonna i wymaga dużo pracy od MZPaO, więc typowe systemy korzystają z niej stosunkowo rzadko.

Rozwiązaniem pośrednim między podziałem statycznym a podziałem dynamicznym jest stronicowanie. Oznacza to, że PaO jest dzielona odgórnie na pewną liczbę równych części (zwanych ramkami), zaś poszczegolne procesy otrzymują na swój użytek jedną lub więcej ramek (dane procesu, które mają być przechowane w PaO, są zaś dzielone na odpowiadające wielkością ramkom części zwane stronami - stąd nazwa "stronicowanie"). Podobnie jak w przydziale statycznym spotykamy tu zjawisko fragmentacji wewnętrznej, lecz w znacznie mniejszym stopniu (nie wykorzystany przez konkretny proces fragment PaO może być co najwyżej wielkości jednej ramki).

Jeśli Pamięć Operacyjna okazuje się stanowczo zbyt mała w stosunku do potrzeb procesów, System decyduje się na wykorzystanie Pamięci Wirtualnej. Pamięć Wirtualna (PaW) posiada znacznie większą liczbę "pudełek", do których procesy nie mają bezpośredniego dostępu. Jądro potrafi jednak przenosić zawartość pudełek z PaO do PaW i odwrotnie, co niestety zajmuje MZPaO dość dużo czasu.

Aby korzystać z PaW System może stosować np. strategię zarządzania PaO zwaną stronicowaniem ze sprowadzaniem na żądanie (SSŻ). Podobnie jak przy stronicowaniu, procesy otrzymują ściśle wyznaczone fragmenty pamięci, lecz w tym przypadku przypisane im adresy nie dotyczą PaO, lecz PaW. Procesom się więc wydaje, że mają bezpośredni dostęp do PaW, podczas gdy w rzeczywistości wszystkie dane z których proces pragnie skorzystać muszą najpierw zostać przeniesione przez MZPaO do PaO zaś informacje znajdujące się chwilowo w PaO muszą być odkładane do PaW w celu zwolnienia miejsca na następne. Można wyobrazić sobie tę procedurę jako wysyłanie listu: na kopercie piszemy adres do dowolnego zakątka świata i nie obchodzi nas, że list najpierw musi dostać się na pocztę lokalną, potem przelecieć samolotem, trafić do innej poczty (np. w innym kraju) a dopiero potem do adresata. Tutaj PaO spełnia rolę poczty, PaW jest zaś właśnie adresatem.

Przy stosowaniu strategii SSŻ, MZPaO musi wiedzieć, z których fragmentów PaO może korzystać w celu udostępniania procesom danych z PaW. Jest więc kilka metod tzw. Wymiany stron (którą stronę odłożyć do PaW, a którą sprowadzić do PaO). Jedna z lepszych strategii, stosowana w większości systemów, to Last Recently Used (opis innych, jak LNR, MIN, OPT, itp. - w Glossarium). Stosując tę metodę, MZPaO odkłada do PaW stronę, z której proces ostatnio najmniej korzystał (przewidując, że te informacje nie będą mu potrzebne w najbliższej przyszłości), a na jej miejsce sprowadza stronę aktualnie potrzebną.

Korzystając z prawie każdej strategii wymiany stron możemy spotkać się z niepożądanym zjawiskiem zwanym migotaniem stron (trashing). Polega ono na tym, że wbrew przewidywaniom MZPaO, strona odłożona właśnie do PaW jest znowu potrzebna procesowi. Trzeba więc ponownie sprowadzić ją do PaO, co zabiera dość dużo czasu (jej odesłanie okazało się więc zbędne).

Najbardziej wymagające Systemy wzbogacają SSŻ o tzw. segmentację. Oprócz podziału danych procesu na strony (które umieszcza się potem w ramkach), istnieje tu także podział na tzw. segmenty (poszczególne segmenty są dopiero dzielone na strony). Segmenty to poszczególne części danych procesu zawierające odmienne typy informacji - stałe, zmienne, program, itp. Taki podział pozwala na jeszcze oszczędniejsze i efektywniejsze wykorzystanie PaO (zmniejsza fragmentację wewnętrzną).

Dysk, czyli tam i z powrotem

Dyskusja o metodach "przydzielania papieru urzędnikom" może nieco się przeciągnęła, warto więc wrócić do prostszych zagadnień. Cóż więc robią procesy, gdy MZP zdecyduje o ich przeniesieniu w stan "zablokowania"? Jest to idealny moment na uzyskanie danych z tzw. pamięci zewnętrznej (PaZ, czyli "pudełek" położonych na zewnątrz naszego budynku). Podobnie jak w przypadku PaW, korzystanie z PaZ jest możliwe jedynie drogą pośrednią. Wszystkie informacje z PaZ muszą przejść przez PaO. PaW jest także zazwyczaj realizowana (jednakże w przeciwieństwie do operacji podejmowanych w stanie "zablokowania", bez wiedzy procesu) przez PaZ.

Istnieje wiele typów pamięci zewnętrznej, najpopularniejszym jest jednak dysk. Jeśli zrozumiemy metodę korzystania z dysku, wszystkie inne typowe urządzenia pamięci zewnętrznej będą wydawały się proste.

Proces potrzebujący skorzystać z informacji znajdujących się w PaZ (bądź umieścić tam pewne dane) udaje się do Modułu Szeregowania Żądań do Dysku (MSŻD). Wyobraźmy sobie w tymcelu pewien pokój z poczekalnią. Proces wchodzi do pokoju, podaje MSŻD adres z którym potrzebuje się skomunikować, po czym cierpliwie czeka na uzyskanie połączenia. W tym czasie nadchodzą inne "zablokowane" procesy, które także zgłaszają swoje żądania i czekają na ich realizację.

MSŻD, po zebraniu pewnej liczby żądań, ma bardzo trudne zadanie do wykonania. Ponieważ dysk obsługuje głowica, której dojście do konkretnego adresu zajmuje pewien czas, należy ten czas jak najlepiej wykorzystać. Przypomina to wysłanie z budynku posłańca w celu przekazania informacji do innych instytucji - jego drogę należy rozplanować tak, aby jak najmniej się nachodził. W tym celu MSŻD korzysta ze strategii szeregowania żądań do dysku, czyli po prostu planowania ruchu głowicy. Najprostszą metodą jest FCFS (First Come, First Serve) - stosując tę metodę, "posłaniec" jest wysyłany dokładnie w tej kolejności w jakiej nadeszły żądania od procesów. Jeśli żądania nadchodzą wolniej od ruchu głowicy jest to metoda bardzo dobra, w przeciwnym przypadku jednak nasz posłaniec musi się stanowczo za dużo nabiegać. Inna metoda to SSTF (Shortest Seek Time First) - w tym przypadku głowica idzie najpierw tam, gdzie ma najbliżej. Najlepszą jednak strategią jest SCAN (oraz jego odmiany, C-SCAN, N-STEP SCAN, LOOK, C-LOOK - patrz Glossarium). Stosując tę metodę posłaniec biega od końca do końca ulicy, po drodze "wpadając" do odpowiednich instytucji i załatwiając swoje sprawy.

W pamięci zewnętrznej, tzn. w tym przypadku na dysku, jak w każdej porządnej instytucji informacje są bardzo porządnie poukładane. Nazywa się to Systemem Zarządzania Informacją, a w przypadku większości systemów operacyjnych - Systemem Plików. Każdą PaZ opiekuje się Moduł Zarządzania Informacją (MZI), którego celem jest dopilnowanie organizacji informacji i zachowanie prywatności danych należących do poszczególnych użytkowników. W PaZ bowiem to właśnie konkretni użytkownicy gromadzą swoje dane, tworząc je i przekładając z miejsca na miejsce z pomocą procesów. MZI jest więc swoistym policjantem, pilnującym porządku w PaZ.

System Plików, którym zarządza MZI, jest to wielowarstwowa struktura, gdzie każda warstwa przypomina urzędnika zajmującego się jedynie częścią zadań powierzonych całości instytucji. Informacja przechodzi więc z rąk do rąk, po czym jest ona systematycznie umiejscawiana gdzieś w PaZ, z zachowaniem porządku i ścisłej struktury. Poszczególne podsystemy (Symboliczny System Plików, Podstawowy System Plików, Kontrola Praw dostępu, itp. - patrz Glossarium) przesyłają informację poprzez węzły tej struktury, aż znajdzie się ona na swoim ściśle wyznaczonym i opisanym miejscu. W ten sposób przy olbrzymiej ilości danych jakie mogą znaleśc się na dysku nikt nie traci orientacji i dostęp do nich jest zarówno dość szybki jak i zachowane są wszelkie zasady bezpieczeństwa (tzn. niepowołany proces nie dostanie się do nieodpowiednich danych).

Hop do łóżeczka

Po zakończeniu swojej pracy proces wycofuje się po kolei z procesora, potem z budynku, po czym wraca "do łóżka" (w niektórych systemach określa się to brutalnie zabiciem procesu). Oczywiście jego praca może zostać odgórnie przerwana prawie w każdym momencie, lecz zawsze kończy się tym samym. Jego numer zostaje skasowany (może potem być przydzielony zupełnie innemu procesowi), zaś aktywny żywot kończy się do momentu, aż proces znów będzie potrzebny jednemu z pełniących wyższe funkcje w Systemie osobników.

Ciężkie jest życie procesu. Ci "elektroniczni niewolnicy" ciągle muszą dostosowywać się do żądań wszechmogącego Jądra, bezinteresownie pracować dla dobra istot stojących wyżej w niezmąconej hierarchii jaką jest system operacyjny. Przypomina to trochę stare czasy, szczególnie znajoma wydaje się klauzula obowiązująca wszystkie procesy w Systemie: "Jądro jest tylko jedno". A jednak, w przeciwieństwie do komunizmu, to działa!

Pragnąłbym gorąco podziękować Prof. J. Madeyowi z Instytutu Informatyki Wydziału Matematyki Informatyki i Mechaniki Uniwersytetu Warszawskiego, którego slajdy z wykładu "Systemy Operacyjne" okazały się nieodzowną pomocą przy pisaniu tego artykułu oraz odpowiadających mu odcinków Glossarium.

W celu komercyjnej reprodukcji treści Computerworld należy zakupić licencję. Skontaktuj się z naszym partnerem, YGS Group, pod adresem [email protected]

TOP 200