246


Pojecie procesu systemowego

Określając nieformalnie, proces jest wykonywanym programem.

Wykonanie procesu musi przebiegać w sposób sekwencyjny. Oznacza to, że w dowolnej chwili na zamówienie danego procesu może być wykonywany co najwyżej jeden rozkaz kodu programu. Proces jest czymś więcej niż samym kodem programu (niekiedy nazywanym

sekcją tekstu,. tzn. zawiera: bieżącą czynność reprezentowaną przez wartość licznika rozkazów; zawartość rejestrów procesora; stos procesu; przechowujący dane tymczasowe

(takie jak parametry procedur, adresy powrotne i zmienne tymczasowe); sekcję danych zawierającą zmienne globalne.

Sam program nie jest procesem. Program jest obiektem pasywnym, podobnie jak zawartość pliku przechowywanego na dysku. Natomiast proces jest obiektem aktywnym, z licznikiem rozkazów określającym następny rozkaz do wykonania i ze zbiorem przydzielonych mu zasobów.

Stany procesu

Wykonujący się proces zmienia swój stan. Stan procesu jest po części określony przez bieżącą czynność procesu. Każdy proces może się znajdować w jednym z następujących stanów:

nowy - proces został utworzony;

aktywny - są wykonywane instrukcje;

oczekiwanie - proces czeka na wystąpienie jakiegoś zdarzenia (np. na

zakończenie operacji wejścia-wyjścia);

gotowy - proces czeka na przydział procesora;

zakończony - proces zakończył działanie

W każdej chwili w dowolnym procesorze tylko jeden proces może być aktywny, ale wiele procesów może być gotowych do działania lub czekających.

Blok kontrolny procesu - cz. I

Każdy proces jest reprezentowany w systemie operacyjnym przez blok kontrolny procesu, nazywany również blokiem kontrolnym zadania.

Blok kontrolny procesu zawiera wiele informacji związanych z danym procesem, które obejmuje:

Stan procesu: stan może być określony jako nowy, gotowy, aktywny, oczekiwanie, zatrzymanie itd.

Licznik rozkazów: Licznik ten wskazuje adres następnego rozkazu do wykonania w procesie.

Informacje o planowaniu przydziału procesora: należą do nich: priorytet procesu, wskaźniki do kolejek porządkujących zamówienia, a także inne parametry planowania

Informacje o zarządzaniu pamięcią: Mogą to być informacje takie, jak zawartości rejestrów granicznych, tablice stron lub tablice segmentów -zależnie od systemu pamięci używanej przez system operacyjny

Informacje o stanie wejścia-wyjścia: Mieszczą się tu informacje o urządzeniach wejścia-wyjścia (np. przewijakach taśmy) przydzielonych do procesu, wykaz otwartych plików itd.

Blok kontrolny procesu -cz. II

Rejestry procesora: Liczba i typy rejestrów zależą od architektury komputera; są tu akumulatory, rejestry indeksowe, wskaźniki stosu, rejestry ogólne-go przeznaczenia oraz rejestry warunków. Informacje dotyczące tych rejestrów i licznika rozkazów muszą być przechowywane podczas przerwań, aby proces mógł być później poprawnie kontynuowany

Informacje do rozliczeń: Do tej kategorii informacji należy ilość zużytego czasu procesora i czasu rzeczywistego, ograniczenia czasowe, numery kont, numery zadań lub procesów itp.

Kolejki planowania

Wchodzące do systemu procesy trafiają do kolejki zadań. Kolejka ta zawiera wszystkie procesy systemu.

Gotowe do działania procesy, które oczekują w pamięci głównej, są trzymane na liście zwanej kolejką procesów gotowych. Kolejka ta ma zazwyczaj postać listy powiązanej. Nagłówek kolejki procesów gotowych zawiera wskaźniki do pierwszego i ostatniego bloku kontrolnego procesu na liście. Każdy blok kontrolny procesu ma pole wskazujące następną pozycję w kolejce procesów gotowych

Lista procesów czekających na konkretne urządzenie zwie się kolejką do urządzenia. Każde urządzenie ma własną kolejkę

Diagram kolejek

Nowy proces jest na początku umieszczany w kolejce procesów gotowych. Oczekuje w niej do czasu, aż zostanie wybrany do wykonania (czyli wyekspediowany) i otrzyma procesor. Po przydzieleniu procesora w procesie może wystąpić jedno z kilku zdarzeń:

proces może zamówić operację wejścia-wyjścia, wskutek czego trafia do kolejki procesów oczekujących na wejście-wyjście; proces może utworzyć nowy podproces i oczekiwać na jego

zakończenie; w wyniku przerwania proces może zostać przymusowo usunięty z procesora i przeniesiony z powrotem do kolejki procesów gotowych.

Planiści

Proces wędruje między różnymi kolejkami przez cały czas swego istnienia. W celu planowania działań system operacyjny musi w jakiś sposób wybierać procesy z tych kolejek. Selekcji dokonuje odpowiedni proces systemowy zwany planistą (programem szeregującym). W systemie wsadowym często występuje więcej procesów niż można by ich natychmiast wykonać. Procesy te są przechowywane w urządzeniach pamięci masowej (zazwyczaj na dyskach), gdzie oczekują na późniejsze wykonanie.

Planista długoterminowy nazywany też planistą zadań wybiera procesy z tej puli i ładuje je do pamięci w celu wykonania.

Planista krótkoterminowy, czyli planista przydziału procesora wybiera jeden proces spośród procesów gotowych do wykonania i przydziela mu procesor.

W niektórych systemach operacyjnych, takich jak systemy z podziałem czasu, może występować dodatkowy, pośredni poziom planowania a takiego planistę nazywamy planistą średnioterminowym.

Planista długoterminowy

Planista długoterminowy działa stosunkowo rzadko, nadzoruje stopień wieloprogramowości, tj. liczbę procesów w pamięci. Jeśli stopień wieloprogramowości jest stabilny, to średnia liczba utworzonych procesów musi się równać średniej liczbie procesów usuwanych z systemu. Właściwe dokonanie wyboru przez planistę długoterminowego ma duże znaczenie. Większość procesów można zazwyczaj podzielić na takie, które są albo ograniczone przez wejście-wyjście, albo ograniczone przez dostęp do procesora.

Procesem ograniczonym przez wejście-wyjście jest taki, który spędza większość czasu na wykonywaniu operacji wejścia-wyjścia, mniej zajmując się obliczeniami. Proces ograniczony przez dostęp do procesora sporadycznie generuje zamówienia na wejście-wyjście, spędzając na obliczeniach wykonywanych przez procesor znacznie więcej czasu niż proces ograniczony przez wejście-wyjście. Jest ważne, aby planista długoterminowy dobrał dobrą mieszanką procesów zawierającą zarówno procesy ograniczone przez wejście-wyjście, jak i ograniczone przez dostęp do procesora.

Planista krótkoterminowy

Planista długoterminowy może być w niektórych systemach nieobecny lub mocno zredukowany. Na przykład systemy z podziałem czasu często nie mają żadnego planisty długoterminowego i umieszczają po prostu każdy nowy proces w pamięci pod opieką planisty krótkoterminowego.

Planista krótkoterminowy musi bardzo często wybierać nowy proces dla procesora.

Proces może działać zaledwie kilka milisekund, a potem przejść w stan oczekiwania, wydawszy zamówienie na operację wejścia--wyjścia. Często planista krótkoterminowy podejmuje działanie co najmniej raz na każde 100ms. Ze względu na krótkie odcinki czasu między kolejnymi wykonaniami planista krótkoterminowy musi być bardzo szybki. Jeśli decyzja o wykonaniu procesu przez 100 ms zabiera 10 ms, to 107 (100 + 10) = 9% pracy procesora jest zużywane (marnowane) na samo zaplanowanie działania.

Planista średniookresowy

Podstawowym argumentem przemawiającym za użyciem planisty średnioterminowego jest fakt, że niekiedy może okazać się korzystne usunięcie procesów z pamięci (i z aktywnej rywalizacji o procesor) w celu zmniejszenia stopnia wieloprogramowości. Usunięte procesy można później znów wprowadzić do pamięci, a ich wykonanie kontynuować od tych miejsc, w których je przerwano. Postępowanie takie jest często nazywane wymianą. Proces jest wymieniany, czyli wysyłany z

pamięci na zewnątrz, a później wprowadzany do niej ponownie przez planistę średnioterminowego. Wymiana może być niezbędna do uzyskania lepszego doboru procesów lub wówczas, gdy żądania przydziału pamięci przekraczają jej bieżący obszar i wymagają zwolnienia miejsca w pamięci.

Tworzenie procesu

Procesy w systemie mogą być wykonywane współbieżnie oraz dynamicznie tworzone i usuwane. System operacyjny musi więc zawierać mechanizm tworzenia i kończenia procesu. Proces może tworzyć nowe procesy za pomocą wywołania systemowego „utwórz- proces". Proces tworzący nazywa się procesem macierzystym, a utworzone przez niego nowe procesy zwą się jego potomkami. Każdy nowy proces może tworzyć kolejne procesy, wskutek czego powstaje drzewo procesów. Gdy proces tworzy podproces, ten ostatni może otrzymać swoje zasoby bezpośrednio od systemu operacyjnego bądź zasoby podprocesu ulegają zawężeniu do podzbioru zasobów procesu macierzystego. Proces macierzysty może rozdzielać własne zasoby między procesy potomne albo powodować, że niektóre zasoby (np. pamięć lub pliki) będą przez potomków użytkowane wspólnie.

Kończenie procesu

Proces kończy się wówczas, gdy wykona swoją ostatnią instrukcję i za pomocą wywołania funkcji exit poprosi system operacyjny, aby go usunął. W tej chwili proces może przekazać dane (wyjście) do procesu macierzystego. Wszystkie zasoby procesu, w tym pamięć fizyczna i wirtualna, otwarte pliki i bufory wejścia-wyjścia zostają odebrane przez system operacyjny. Oprócz tego istnieją inne przyczyny zakończenia procesu. Proces może spowodować zakończenie innego procesu za pomocą odpowiedniej funkcji systemowej (np. abort). Zazwyczaj funkcję tę może wywołać tylko przodek procesu, który ma być zakończony; w przeciwnym razie użytkownicy mogli-by likwidować sobie wzajemnie dowolne zadania. Proces macierzysty może zakończyć któryś ze swoich procesów potomnych z

różnych przyczyn, takich jak: potomek nadużył któregoś z przydzielonych mu zasobów; wykonywane przez potomka zadanie stało się zbędne; proces macierzysty kończy się, a w tej sytuacji system operacyjny nie pozwala potomkowi na dalsze działanie.

Procesy współpracujące

Procesy współbieżne wykonywane w systemie operacyjnym mogą być niezależne lub mogą ze sobą współpracować. Proces jest niezależny ,jeżeli nie może oddziaływać na inne procesy wykonywane w systemie, a te z kolei nie mogą wpływać na jego działanie. Proces jest współpracujący, jeżeli może on wpływać na inne procesy w systemie lub inne procesy mogą oddziaływać na niego. Na rzecz środowiska umożliwiającego współpracę procesów przemawia kilka powodów:

Dzielenie informacji: Ponieważ kilku użytkowników może być zainteresowanych tymi samymi informacjami (np. wspólnym użytkowaniem pliku), musimy zapewnić możliwość współbieżnego dostępu do tego rodzaju zasobów.

Przyspieszanie obliczeń: W celu przyspieszenia wykonywania jakiegoś zadania możemy je podzielić na podzadania, z których każde będzie wykonywane równolegle z pozostałymi. Zauważmy, że w tym wypadku przyspieszenie będzie możliwe tylko wtedy, gdy komputer ma wiele elementów przetwarzających (takich jak procesory lub kanały wejścia--wyjścia). Modularność: Możemy chcieć konstruować system w sposób modularny, dzieląc go na osobne procesy

Wygoda: Nawet indywidualny użytkownik może mieć wiele zadań do wykonania w jednym czasie.

Konteksty i wątki

Przełączanie procesora do innego procesu wymaga przechowania stanu starego procesu i załadowania przechowanego stanu nowego procesu. Czynność tę nazywa się przełączaniem kontekstu. Czas przełączania kontekstu jest czystą daniną na rzecz systemu, gdyż podczas przełączania system nie wykonuje żadnej użytecznej pracy. Wartość czasu przełączania kontekstu zmienia się w zależności od typu maszyny, szybkości pamięci, liczby rejestrów oraz istnienia specjalnych instrukcji (jak np. pojedyncza instrukcja do ładowania lub przechowywania wszystkich rejestrów). Na ogół waha się od l do 1000 ps.

Wątek nazywany niekiedy procesem lekkim (LWP), jest podstawową jednostką wykorzystania procesora, w skład której wchodzą: licznik rozkazów, zbiór rejestrów i

obszar stosu. Wątek współużytkuje wraz z innymi równorzędnymi wątkami sekcję kodu, sekcję danych oraz takie zasoby systemu operacyjnego, jak otwarte pliki i sygnały, co łącznie określa się jako zadanie (ang. task).

Proces tradycyjny, czyli ciężki jest równoważny zadaniu z jednym wątkiem.

W niektórych systemach zrealizowano też wątki poziomu użytkownika, z których korzysta się za pośrednictwem wywołań bibliotecznych zamiast odwołań do systemu, dzięki czemu przełączanie wątków nie wymaga wzywania systemu operacyjnego i przerwań związanych z

przechodzeniem do jego jądra. Przełączanie między wątkami poziomu użytkownika może być wykonywane niezależnie od systemu operacyjnego, może więc się odbywać bardzo szybko.

Działanie wątków

Działanie wątków pod wieloma względami przypomina działanie procesów

Wątki mogą znajdować się w jednym z kilku stanów: gotowości , zablokowania, aktywności, kończenia

Podobnie jak procesy, wątki użytkują wspólnie jednostkę centralną i w danej chwili tylko jeden wątek jest aktywny (wykonywany).Wykonanie wątku w procesie przebiega sekwencyjnie, a każdy wątek ma własny stos i licznik rozkazów. Wątki mogą tworzyć wątki potomne i mogą blokować się do czasu zakończenia wywołań systemowych. Jeśli jeden wątek jest zablokowany, to może działać inny wątek. W odróżnieniu od procesów wątki nie są niezależne od siebie. Ponieważ wszystkie wątki mają dostęp do każdego adresu w zadaniu, dany wątek może czytać i zapisywać stosy dowolnych innych wątków*. Struktura taka nie umożliwia ochrony na poziomie wątków. Ochrona ta nie powinna jednakże być konieczna. Podczas gdy procesy pochodzą od różnych użytkowników i mogą być do siebie wrogo usposobione, zadanie z wieloma wątkami może należeć tylko do jednego użytkownika. W tym przypadku wątki zostaną prawdopodobnie tak zaprojektowane, aby pomagać sobie wzajemnie

Komunikacja międzyprocesowa

Oprogramowanie komunikacji międzyprocesowej (IPC). tworzy mechanizm umożliwiający procesom łączność i synchronizowanie działań. Komunikację międzyprocesowa realizowana jest za pomocą systemu przekazywania komunikatów. W skład narzędzi komunikacji międzyprocesowej wchodzą dwie podstawowe operacje: nadaj (komunikat) i odbierz (komunikat)". Komunikaty wysyłane przez proces mogą mieć stałą lub zmienną długość. Dopuszczenie tylko komunikatów o stałej długości upraszcza ich fizyczną implementację. Ograniczenie to utrudnia jednak programowanie. Komunikaty o zmiennej długości wymagają natomiast większych nakładów na fizyczną implementację, za to są łatwiejsze w programowaniu. Jeśli dwa procesy chcą się ze sobą komunikować, to muszą wzajemnie

Nadawać i odbierać komunikaty musi istnieć między nimi łącze komunikacyjne. Procesy, które chcą się ze sobą komunikować, muszą mieć możliwość zwracania się do siebie. Mogą to robić za pomocą komunikacji bezpośredniej lub komunikacji pośredniej.

Komunikacja bezpośrednia

W komunikacji bezpośredniej każdy proces, który chce się komunikować, musi jawnie nazwać odbiorcę lub nadawcę uczestniczącego w tej wymianie informacji. W tym przypadku operacje elementarne nadaj i odbierz są zdefiniowane następująco:

nadaj (P, komunikat) - nadaj komunikat do procesu P

odbierz (Q, komunikat) - odbierz komunikat od procesu Q

Łącze komunikacyjne w tym schemacie ma następujące własności: łącze jest ustanawiane automatycznie między parą procesów, które mają się komunikować; do wzajemnego komunikowania się wystarczy, aby procesy znały swoje identyfikatory łącze dotyczy dokładnie dwu procesów; między każdą parą procesów istnieje dokładnie jedno łącze; łącze może być jednokierunkowe, choć zazwyczaj jest dwukierunkowe. Powyższy schemat wykazuje symetrię adresowania; Istnieje też asymetryczny wariant adresowania. Tylko nadawca nazywa

odbiorcę, a od odbiorcy nie wymaga się znajomości nazwy nadawcy.

nadaj (P, komunikat) - nadaj komunikat do procesu P

odbierz (id, komunikat) - odbierz komunikat od dowolnego procesu; pod id zostanie podstawiona nazwa procesu, od którego nadszedł komunikat.

Komunikacja pośrednia

W komunikacji pośredniej komunikaty są nadawane i odbierane za pośrednictwem skrzynek pocztowych (ang. mailboxes), nazywanych także portami (ang. ports). Abstrakcyjna skrzynka pocztowa jest obiektem, w którym procesy mogą umieszczać komunikaty i z którego komunikaty mogą być pobierane. Każda skrzynka pocztowa ma jednoznaczną identyfikację. Możliwość komunikacji między dwoma procesami istnieje tylko wtedy, gdy mają one jakąś wspólną skrzynkę pocztową.

Definicje operacji nadaj i odbierz przybierają postać:

nadaj (A, komunikat) - nadaj komunikat do skrzynki A

odbierz (A, komunikat) - odbierz komunikat ze skrzynki A

Łącze komunikacyjne w tym schemacie ma następujące własności:

łącze między dwoma procesami jest ustanawiane tylko wtedy, gdy dzielą one jakąś skrzynkę pocztową; łącze może być związane z więcej niż dwoma procesami; każda para komunikujących się procesów może mieć kilka różnych łączy, z których każde odpowiada jakiejś skrzynce pocztowej; łącze może być jednokierunkowe lub dwukierunkowe.

Buforowanie -cz. I

Łącze ma pewną pojemność określającą liczbę komunikatów, które mogą w nim czasowo przebywać. Cecha ta może być postrzegana jako kolejka komunikatów przypisanych do

łącza.

Są trzy podstawowe metody implementacji takiej kolejki.

Pojemność zerowa: Maksymalna długość kolejki wynosi O, czyli łącze nie dopuszcza, by czekał w nim jakikolwiek komunikat. W tym przypadku nadawca musi czekać, aż odbiorca odbierze komunikat. Aby można było przesyłać komunikaty, oba procesy muszą być zsynchronizowane. Synchronizację taką nazywa się rendez-vous.

Pojemność ograniczona: Kolejka ma skończoną długość n, może w niej zatem pozostawać co najwyżej n komunikatów. Jeśli w chwili nadania nowego komunikatu kolejka nie jest pełna, to nowy komunikat zostaje w niej umieszczony (przez skopiowanie komunikatu lub zapamiętanie wskaźnika do niego) i nadawca może kontynuować działanie bez czekania. Jednak kiedy łącze z powodu ograniczonej pojemności ulegnie zapełnieniu, wtedy nadawca będzie musiał być opóźniany, aż zwolni się miejsce w kolejce.

Pojemność nieograniczona: Kolejka ma potencjalnie nieskończoną długość; może w niej oczekiwać dowolna liczba komunikatów. Nadawca nigdy nie jest opóźniany.

Buforowanie -cz. II

Istnieją specjalne przypadki, których nie da się dopasować wprost do żadnej z dotąd omówionych kategorii.

Proces nadający komunikat nigdy nie jest opóźniany. Jeśli jednak odbiorca nie zdąży przyjąć komunikatu, zanim nadawca nie wyśle następnego komunikatu, to pierwszy komunikat jest tracony (ginie). Zaletą tego schematu jest to, iż długie komunikaty nie muszą być kopiowane więcej niż jeden raz. Główną wadę stanowi utrudnienie programowania. Procesy wymagają jawnej synchronizacji, aby żaden z komunikatów nie został zagubiony oraz by nadawca i odbiorca nie manipulowali jednocześnie na buforze komunikatów.

Proces nadający komunikat jest opóźniany do czasu otrzymania odpowiedzi. Proces P jest po nadaniu komunikatu wstrzymywany do czasu, aż proces odbiorczy otrzyma komunikat i wyśle odpowiedź za pomocą operacji odpowiedz (P, komunikat)'. Komunikat z odpowiedzią zapisuje się w tym samym buforze co komunikat nadany na początku. Jedyna różnica między operacją nadaj a operacją odpowiedz polega na tym, że operacja nadaj powoduje wstrzymywanie procesu nadawczego, a operacja odpowiedz pozwala natychmiast

kontynuować oba procesy.

Tę synchroniczną metodę komunikacji daje się łatwo rozszerzyć do postaci ogólnego systemu wywołań procedur zdalnych, zwanego w skrócie RPC. Systemy RPC oparto na spostrzeżeniu, że wywołanie procedury lub funkcji w systemie jednoprocesorowym działa dokładnie tak jak system komunikatów, w którym nadawca ulega zablokowaniu do czasu otrzymania odpowiedzi. Komunikat przybiera zatem postać wywołania podprogramu, a komunikat powrotny zawiera wynik obliczenia wykonanego przez podprogram.

Zakończenie procesu

Może się zdarzyć, że nadawca lub odbiorca zakończy działanie przed zakończeniem przetwarzania komunikatu. Pozostaną wówczas komunikaty, których nikt nigdy nie odbierze, lub jakieś procesy będą czekać na komunikaty, które nigdy nie zostaną wysłane.

Proces odbiorczy P może czekać na komunikat od procesu Q, który za-kończył działanie. Jeśli nie podejmie się żadnych kroków, to proces P zostanie zablokowany na zawsze. W tym przypadku system może zakończyć proces P albo powiadomić go, że proces Q zakończył swą pracę.

Proces P może wysłać komunikat do procesu Q, który już zakończył działanie. Przy użyciu schematu automatycznego buforowania nie powoduje to żadnej szkody-proces P po prostu kontynuuje działanie. W przypadku systemu bezbuforowego proces P zostanie zablokowany na zawsze. Tak jak w przypadku l, system może albo zakończyć proces P, albo zawiadomić go, że proces Q już nie istnieje.

Komunikat nadany przez proces P do procesu Q może zaginąć w sieci komunikacyjnej z powodu awarii sprzętu lub linii komunikacyjnej. Istnieją trzy podstawowe metody postępowania w takich przypadkach:

System operacyjny jest odpowiedzialny za wykrywanie takich zdarzeń i za ponowne nadanie komunikatu.

Proces nadawczy jest odpowiedzialny za wykrycie takiego zdarzenia i powtórne przesłanie komunikatu, jeśli mu na tym zależy. System operacyjny odpowiada za wykrywanie takich zdarzeń. Zawiadamia on proces nadawczy, że komunikat zaginął. Proces nadawczy może postąpić według własnych potrzeb.



Wyszukiwarka

Podobne podstrony:
leach ll in one 246
plik (246)
materialy i studia 246
246
246 ac
kosslyn, rosenberg psychologia mózg człowiek świat str 207 246
246
246 Poznaj swoje uzdolnienia, II
B 246
MN 246
040906 135256 246 rolnictwo eko materialy z konferencji HG56NS5JN7AWAWE33XOD46ZUSD2AFG33YPDPRCA
246 253
SHSBC 246 ROUTINE 2 12, PART II
J 246
leach ll in one 246 osadenie
10816,246,architektura i urbanistyka 2011
kontrol arbeit 2 Infos 2 id 246 Nieznany
246
20030901220301id$246 Nieznany

więcej podobnych podstron