Systemy operacyjne |
|
Technika mikroprocesorowa Technika cyfrowa Elektronika Elektryczność |
Języki wyższego poziomu asembler |
Główne zadania i cele systemu operacyjnego :
Podział zasobów :
Pamięć ( operacyjna, pomocnicza)
Procesory i ich moc obliczeniowa
Urządzenia zewnętrzne
Tworzenie maszyny wirtualnej. Czyli taka zmiana właściwości fizycznych maszyny cyfrowej, aby była ona przydatniejsza dla użytkownika.
Zadania maszyny wirtualnej:
Maszyna wirtualna dla urządzeń I/O
Maszyna wirtualna odpowiedzialna za pamięć operacyjną
W naszym systemie są różnego rodzaju urządzenia : porty szeregowe, równoległe, karet sieciowe, te urządzenia zamieniamy na urządzenia wirtualne. Aby zapisać odczytać z dysku trzeba oprogramować :
Kontroler bezpośredniego działania
Kontroler przerwań
Kontroler dysku twardego
Maszyna wirtualna - jest odpowiedzialna za pamięć operacyjną. Pamięć składa się z rejestrów. Możemy umieścić w niej w niej kolka programów jednocześnie. Kody czy adresy tych programów umieszczamy w pamięci. Nie wiemy gdzie. Sprawdzane jest ile jeszcze jest wolnego obszaru i tam gdzie jest wystarczająca dużo miejsca dla tego programu, tam jest on umieszczany.
Adres pamięci wirtualnej każdego programu jest adresowana od zera natomiast inaczej jest w fizycznej. Maszyna wirtualna musi nam zapewnić że programy zostaną zaadresowane od 0 . Zmieniamy fizyczną pamięć na wirtualną gdzie adresy o fizycznej przestają mieć znaczenie
|
P4 |
P2 |
P5 |
|
Następny element maszyny wirtualnej.
systemy plików (najczęściej odwołuje się do dysku twardego )
512 bajtów - Sektor posiada przeważnie taką wielkość
Trzeba pamiętać numer sektora, numer ścieżki i numer głowicy ( na talerzu ). Maszyna musi stworzyć system pliku, do którego będziemy się odwoływać, a nie przez współrzędne.
Numer sektora numer ścieżki numer talerza
23 1571 5
system plików do których będziemy się odwoływać przez nazwę np.: list.txt
nasępmy element
ochrona zasobów i systemu błędów ( wszelkie zasoby jakie będziemy mieli w naszym systemie komputerowym należy chronić) musimy chronić kod programu jak : dane.
Współdziałanie programów ( jedna z metod to dane wspólne - tworzymy obszar danych wspólnych, muśmy teraz stworzyć mechanizmy które umożliwiają bezpieczną wymianę. Obszar wspólny musi być kontrolowany. Raz musi mieć dostęp do jednego programu a dopiero później drugiego
Sterowanie programami - porozumiewanie się z maszyną
za pomocą klawiatury
Rodzaje systemów operacyjnych :
systemy dla indywidualnego użytkowania
prostota budowy
wygoda obsługi
(wielozadaniowe, jednozadaniowe, Windows)
systemy sterowania procesami (systemy czasu rzeczywistego)
występowanie sprzężenia zwrotnego (system czymś steruje i mierzy wyniki swojego sterowania np. : linią produkcyjną)
niezawodność ( musi być specjalnie testowany) - musi zapewniać bezpieczne wyłączenie procesu po awarii
Zastosowanie : w produkcji np. : do monitowana, do kontroli w przemyśle, w medycynie.
Systemy przeglądania ( przechowywania, przetwarzania) plików: ( do przeglądania i modyfikowania dużych baz danych np.: baza danych policji, medyczna)
Systemy przetwarzania transmisji (np.: bankowych, sprzedaż miejsc w samolocie)
W bazie danych występują bardzo często zmiany ( wielokrotnie w ciągu sekundy)
Nastawiane są na bezpieczeństwo transmisji.
Systemy ogólnego przeznaczenia ( przeznaczone są dla szerokiej rzeszy odbiorców, którzy będą używać różnorodnego oprogramowania, sprzętu. Muszą być przygotowane do obsługi wielu urządzeń )
Można podzielić je na :
systemy wsadowe
systemy interaktywne (wielodostępne)
ad. a) zlecamy wykonanie jakiejś pracy, system to realizuje bez naszego udziału, po czym odbieramy
wyniki
ad. b) mamy możliwość współpracy z systemem - jest możliwość ingerencji w wykonywanie zadania, system coś robi, my wprowadzamy dane itd.
Systemy można podzielić na :
jednostanowiskowe( jednośrodowiskowe)
systemy rozproszone ( pewną część systemów komputerowych połączonych jakimiś łączami pracujących na jednym systemie operacyjnym; sprzętów fizycznych będzie kilka na których pracuje jeden system )
Struktury systemu operacyjnego
Struktura jednolita - procedury czy funkcje mogą wywołać każdą inną i mogą być wywołane przez każdą dowolną. Może się pojawić n - błędów. Taka struktura może być pożyteczna przy małych ilościach funkcji i procedur czyli dla bardzo małych systemów operacyjnych.
Struktura warstwowa - opiera się na kolejnych warstwach systemu utworzonych jedna nad drugą. Dowolny podprogram jednej warstwy może odwoływać się do dowolnego programu innej warstwy
( wszystkich niższych ) i własnej warstwy. Trzeba określić co będzie robić dana warstwa (jakie funkcje będzie udostępniać innym warstwom). Budując warstwę należy zadbać by wyższym warstwom udostępnić warstwy niższe oraz należy udostępnić wszystkie warstwy wszystkim blokom. Każda z warstw może być realizowana przez osobny zespół, gdy wykryjemy błąd to wymieniamy jedną warstwę.
Odmianą struktury warstwowej jest struktura pierścieniowa : z n - tej warstwy możemy się odwołać o
k - tą warstwę wstecz.
Struktura klient - serwer - system operacyjny dzielimy na szereg modułów ( równorzędnych mniej lub bardziej ). Każdy realizuje różne funkcje. Do realizacji zadania z modułu 1 potrzebne jest wywołanie programu z modułu 3. Odwołanie następuje przez mikro jądro. Nadawca ( moduł 1) wysyła sygnał do odbiorcy (moduł 3) odbiorca wykonuje usługę i tą samą drogą sygnał wraca powrotem do nadawcy
(moduł 1). W tym momencie moduł 1 jest klientem a moduł 3 serwerem. Jeśli w dowolny moduł jest uszkodzony, to zostaje on wymieniony na nowy, sprawny moduł i system znowu pracuje bez problemów.
Może być tak że jeden moduł jednocześnie może być klientem dla innego modułu a dla jeszcze innego może być serwerem. Strukturę tą można dowolnie rozszerzać, lub zmieniać według własnych potrzeb (dodawać lub usuwać moduły)
Odwoływanie się :
I
Bezpośrednie
Pośrednie (przez tablicę)
II
Odwołanie się do ostatniej warstwy a ta rozdziela zadania na pozostałe
III
Może być specjalny moduł przez który można odwołać się do systemu, lub wejście które rozdzieli komunikat na odpowiednie moduły.
Surowa struktura systemu (bez oprogramowania)
Mechanizmy pracy i doskonalenie pracy komputera
Wykonanie zadania w czasie:
Czytanie programu wykonanie wydruk czas zauważenia wyników
z karty przez Operatora
Działanie takiego systemu było uzależnione od dwóch czynników:
Czynnika ludzkiego tzn. szybkości z jaką działa operator
Czynnika maszyny tzn. opóźnienia związane z działaniem systemu
Poprawa pracy sytemu
Można do czytnika włożyć wiele zadań, ale trzeba je rozdzielić czyli wprowadzić dodatkowe karty
rozdzielające. Uzyskujemy w ten sposób język sterowania, dzięki któremu system działa w następujący sposób: Na początku do pamięci należ wprowadzić program, który będzie interpretował język sterowania a następnie wprowadzane są poszczególne zawartości kart będących konkretnymi programami do wykonania przez maszynę. Następuje tu zwiększenie wydajności, za cenę pewnego obszaru pamięci zajmowanego przez program interpretujący język sterowania.
Zwiększenie wydajności przez wprowadzenie taśm magnetycznych ( szybsze jest czytanie taśmy magnetycznej niż z karty perforowanej)
Wprowadzenie komputerów pośrednich, co pozwala na czytanie i równoczesne wykonywanie programu. W tym systemie odbywać się będą prace wsadowe tzn. zadania będą się odbywać przez komputery pomocnicze które pobiorą, skompilują program a następnie prześlą go do wykonania.
Mechanizm stosu
Stos informacji na którym układane są informację jedna nad drugą, a następnie w miarę potrzeb są zdejmowane z tego stos, ale tylko z góry do dołu (od najmłodszej informacji do najstarszej). Mechanizm ten wykorzystywany jest przy wywoływaniu funkcji i procedur.
Działanie mechanizmu stosu
Podprogram przed rozpoczęciem wykonywania zostawia na stosie adres powrotny
Podprogram zaczyna się wykonywać
Gdy podprogram skończy się wykonywać pobiera adres powrotny i wraca do wykonywania programu głównego (wraca do tego samego miejsca programu głównego w którym przerwał działanie odwołując się do podprogramu)
A
C
Jeśli wchodzimy do podprogramu to na stosie zapisujemy gdzie mamy wrócić po wykonaniu się programu.
Na stosie można przechowywać chwilowo informację. Na stosie jest adres który określa ostatnie zajęte miejsce.
Stos działa jak ścieżka dostępu, zaczynając działanie podprogram zostawia na stosie adres miejsca do którego ma powrócić. Gdy skończy się wykonywać podprogram
Przerwanie
To pewnego rodzaju wstrzymanie programu głównego w celu wykonania innego programu
Czyli podczas wykonania zadania 1 można odczytać zadanie 2 a w trakcie wykonywania zadania 2 można odczytać kolejne zadanie.
Podział przerwań :
przerwania maskowalne
przerwania niemaskowalne
zazwyczaj występuje jedno przerwanie niemaskowalne i wiele przerwań maskowalnych.
Przerwanie maskowalne - Przejęte i wykonywane przez procesor, używane do prawidłowego działania sprzętu. Jeśli nastąpi uszkodzenie sprzętu pojawi się przerwanie niemaskowalne. Może być wykorzystywane do testowania elementów systemu podczas obsługi.
Przerwanie maskowalne - nie musi być wykonywane przez procesor, system przerwań maskowalnych może być wyłączony. W niektórych systemach można zamaskować wszystkie przerwania lub każde z kolei.
Priorytety przerwań
mogą być przydzielone na stałe
można przypisać priorytety do poszczególnych przerwań
układ kontrolera przerwań będzie zmieniał priorytety przerwań
przerwanie o wyższym priorytecie może przerwań wykonywanie zadania o niższym priorytecie
Kontroler przerwań
8 linii wejściowych - kontroler może przyjąć maksymalnie 8 przerwań
W komputerach typu PC znajduje się 15 przerwań.
Co się dzieje gdy urządzenie zewnętrzne żąda obsługi przerwania ?
Potwierdza do kontrolera przez magistralę fakt przyjęcia przerwania, procesor wykonuje rozkaz programu obsługi przerwań, jednocześnie pobiera z magistrali danych numer przerwania, zapamiętując adres następnej komórki pamięci z której normalnie pobrał by dane i umieszcza go na stosie, automatycznie umieści rejestr FLAG a następnie wykonuje skok do podprogramu obsługi przerwania, na którego końcu znajduje się rozkaz zakończenia podprogramu, pobierany jest adres ze stosu i następuje powrót do wykonywania programu głównego. Podprogram obsługi przerwania może trwać kilka lub kilkanaście mikrosekund.
Mechanizm kanału
Bezpośredni dostęp do pamięci.
Po sygnale żąda przerwania DMA żąda zwolnienia magistrali. Magistrala dzieli się na pewne cykle, normalnie procesor ma kontrolę nad wszystkimi cyklami. Gdy procesor dostaje żądanie zwolnienia magistrali przechodzi on w stan wysokiej impedancji. Układ DMA przesyła dane a potem zwalnia magistralę.
Procesor pobiera dane i umieszcza je w kolejce po czym wykonuje je po kolei.
Jeśli ma być wykonany skok pod inny adres (lub wywołanie podprogramu )Jeżeli w tym momencie zostanie wydane żądanie bezpośredniego dostępu do pamięci wtedy procesor nie będzie pracował cały czas tylko zostanie wstrzymany na jeden cykl. Po ostatnim cyklu transmisyjnym poprzez kanał jest generowane przerwanie. Z INTC może współpracować DMA jak również urządzenie zewnętrzne.
Jeżeli jest wykonywane jakieś zadanie i np. zgłasza się żądanie odczytu pliku z dysku albo coś zapisać w czasie odczytu bądź zapisu nie wykonuje się zadanie (A). Więc mimo wszystko nie jesteśmy w stanie wykorzystać procesora. Więc umieszcza się drugie zadanie (B) gdy zostaje wstrzymane zadanie (A). Aby wykorzystać w pełni nasz system należy wykonać nie pojedyncze zadanie ale grupy zadań. W ten sposób przechodzimy do monitora wsadowego jednostrumieniowego ( przechodzimy do wykonywania wielu zadań).
System interaktywny jest wielozadaniowy, wielodostępny.
Zadania systemu operacyjnego :
Segregowanie prac
Sterowanie pracami lub interpretowanie języka poleceń
Obsługa urządzeń wejścia wyjścia
Obsługa błędów
Obsługa przerwań
Kontrolowanie prac
Sterowanie zasobami - urządzeniami zewnętrznymi, procesami, pamięcią
Ochrona zasobów ( pamięć, urządzenia peryferyjne, pliki)
Umożliwienie wielodostępności
Umożliwienie dobrego sposobu komunikacji z operatorem
Interfejs graficzny
Ewidencjonowanie zasobów komputera
Właściwości systemu operacyjnego
Współbieżność - wykonywanie wielu czynności jednocześnie (należy zadbać o to by jedno zadanie miało wpływu na inne zadanie)
Wspólne korzystanie z zasobów systemu
Pamięć długookresowa
Niedeterminizm
Pożądane cechy systemu operacyjnego
Wydajność (Procent wykorzystania zasobów) (przepustowość informacyjna)
Niezawodność
Pielęgnowalność
Dobra dokumentacja sytemu :
dokumentacja dla użytkownika
---------------- dla administratorów systemu
---------------- dla programistów którzy będą tworzyć oprogramowanie
---------------- wewnętrzna firmy prowadzącej system, w której powinien się znaleźć dokładny opis podprogramów systemu.
By system miał mały rozmiar, by nie zawierał dużo pamięci.
Program -to statyczny zestaw instrukcji wykonywany przez jednostkę centralną i realizujący określone
zadanie.
Proces - dynamiczny ciąg działań wykonywany na podstawie programu. Jest czynnością, która powstaje
w wyniku wykonywania programu. W celu wykonania jakiegoś procesu wywołujemy program.
Procesor - urządzenie sprzętowe lub sprzętowo programowe ( połączenie procesora i programu)
Wątek - (proces) proces specjalny, który ma dostęp do kodu i do danych innego procesu
Współbieżność - jest to wykonanie wielu procesów jednocześnie
Niedeterminizm - kolejność przełączeń między tymi procesami jest inna za każdym razem gdy te procesy
przełączamy.
Komunikacja - działanie procesu w celu wykonania jakiegoś zadania
1.
Wzajemne zapewnianie by jeden proces korzystał z zasobów niepodzielnych .
Zasoby do których procesy mogą rościć jakieś prawa, to zasoby niepodzielne.
Zasoby podzielne to takie które mogą być dołączone w dowolnym czasie,
Pliki do odczytu czyli bloki pamięci zawierające stałe, do zasobów proces może odwołać się w każdej chwili., a w niepodzielnych procesy nie mogą się odwołać w każdym momencie.
Drukarka jest urządzeniem niepodzielnym ponieważ nie możemy jej udostępnić dwóm procesom naraz.
W przypadku udostępnienia zasobów więcej niż jednemu procesowi mogą pojawić się pewne zaburzenia
Proces A Zmienna X=5 Proces B
Proces A odczyta wartość x zwiększy o 1 (czyli 6) i zapisze do pamięci Proces B odczyta x zmniejszy o 1 i zapisze 5
Co się stanie kiedy zanim proces A zapisze wartość 6 proces B pobierze wcześniejszą wartość i zmniejszy ją.
Procesy te działają współbieżnie.
Trzeba zapewnić wzajemne wyłączanie tak aby tylko w danym momencie pracował tylko jeden proces.
Synchronizacja
Jeże li proces A jest wykonywany przez proces 1 to ten sam proces A nie może być wykonywany przez proces 2
Blokada (zakleszczenie) - procesy współzawodniczą o zasoby niepodzielne
A Z1 Z2 B Z1 Z2
Gdy A zażąda dostępu do Z2 to system odmówi dostępu do Z2 przez wstrzymanie A proces B zwolni Z2 i proces A zacznie go ponownie wykorzystywać. Jeśli A zażąda dostępu do Z2(B) a B zażąda dostępu do Z1 (A) to A nie zwolni Z1 bo czeka na zwolnienie Z1(B) a B czeka na zwolnienie Z2 (A) i nastąpi BLOKADA.
Mechanizmy ułatwiające komunikację między procesami.
Semafor - liczba nieujemna na której można wykonywać dwie operacje CZEKAJ i SYGNALIZUJ.
Na liczbie semafora można wykonywać operacje
Operacja CZEKAJ wykonuje operację S:= S - 1 (o ile jest to możliwe)
Operacja SYGNALIZUJ wykonuje operację S:= S + 1
Semafor nie może być ujemny czyli nie może mieć wartości mniejszej niż S>=0
Proces przez semafor komunikuje się z innym procesem.
Sekcję krytyczną należy obarczyć poleceniem czekaj i sygnalizuj
Dopóki wykonuje się SK procesu A proces B zostaje wstrzymany.
Wzajemne wyłączanie ( otaczając sekcję krytyczną odwołają się do zasobów niepodzielnych operacjami czekaj i sygnalizuj)
Synchronizacja procesu
A czekaj B sygnalizuj
Proces A czeka na wykonanie procesu B, proces A jest zsynchronizowany. Może być tak że oba procesy mogą się zsynchronizowane.
A czekaj B sygnalizuj
A sygnalizuj B czekaj
Działają w tym samym czasie, zsynchronizowały się ale działają asynchronicznie
Proces wytwórcy i konsumenta
Proces wytwórcy wytwarza jakieś informacje, umieszcza je w buforze na n - tym wolnym miejscu,
Proces konsumenta pobiera dane z bufora i przetwarza je dalej
Synchronizacja wewnętrzna obu procesów.
Proces A przez semafor B sygnalizuje że w buforze są dane, proces B przez semafor W sygnalizuje że jest wolne miejsce w buforze. Proces A będzie czekał aż proces B pobierze dane to zwolni się miejsce i proces A może pracować dalej
Jeżeli gdzieś w takim programie nastąpi błąd nastąpi blokada
Korzystanie z semaforów:
Przykład I
Dowolna liczba pisarzy i czytelników. Gdy pisze to czytelnik nie może czytać
Mamy dwa rodzaje procesu : pisarza który zapisuje i czytelnika który czyta. Jeśli się pojawi jakiś czytelnik to musi czekać aż zasób zostanie zwolniony. Czytelnicy mogą czytać jednocześnie, ponieważ nie konsumują tej informacji, pozostaje ona w buforze.
Przykład II
To przykład 5 głodnych filozofów.
Filozofowie myślą i jedzą na zmianę. Każdy ma talerz i po obu stronach ma łyżkę. (jest tylko 5 łyżek i każdy z filozofów może jeść tylko dwoma łyżkami.) Każdy z procesów (filozof ) by działał musi wziąć 2 zasoby (łyżki)
Filozof żeby myśleć musi jeść.
Co się stanie gdy wszyscy filozofowie na raz zechcą jeść ?
Instrukcja region (region krytyczny )
Monitor - struktura która umożliwia współdzielny obszar
Składa się :z trzech elementów.
danych
procedur dostępu
programu inicjującego
W jaki sposób można korzystać z semaforów w systemie WINDOWS ?
Istnieją semafory systemowe, jak również procesy użytkownika które mogą tworzyć własne semafory.
Istnieją funkcje które mogą odwoływać się do semaforów.
Funkcje API w systemie WINDOWS
Create Semaphore - proces który tworzy semafor o określonej nazwie. Zwraca uchwyt do semafora który jest tworzony. Każdy z semaforów będzie miał nazwę. Wszystkie odwołania do semaforów będą się odwoływać przez nazwę.
Open Semaphore - ten zwraca uchwyt do semafora
Release Semaphore - funkcja ta realizuję operację sygnalizacji, zwiększa wartość semafora, którego wartość zostanie podana jako parametr ; musimy określić krok o ile będzie zmieniany ( liczba całkowita). Podajemy liczbę o jaką możemy zwiększy nie koniecznie o 1.
Wait For Single Object - czekaj na pojedynczy semafor (obiekt). Podajemy jako parametr uchwyt do semafora, a drugim parametrem jest czas oczekiwania. Jeśli czas zostanie przekroczony to operacja zostanie zakończona.
Gdy obiekt przestanie istnieć
Jeśli czas oczekiwania zostanie przekroczony
Cclose Handle - funkcja która usuwa pojedynczy semafor, uchwyt do semafora, który został utworzony. Parametrem jest uchwyt do semafora. Funkcja ta usuwa też inne obiekty.
Komunikaty w systemie klient, serwer
Oprócz semaforów istnieją również komunikaty głównie w systemach klient, serwer.
Żeby przekazywać informacje potrzebna są dwie operacje
Nadaj
Odbierz
Obie te operacje mogą przyjmować różne postacie :
Postać blokująca - gdy obie te operacje będą oczekiwać na wysłanie lub odebranie komunikatu (informacji)
Postać nie blokująca - wysyłany komunikat może być gdzieś przeczytany, jeśli dotrze do miejsca docelowego to ok., jeżeli nie dotrze do celu to nic się nie stanie.
Operacje te mogą być wykonane w sposób pośredni lub bezpośredni
Bezpośrednio - Jeśli podamy identyfikację procesu gdzie będzie wysyłany komunikat, odbiorca musi
wiedzieć z jakiego procesu otrzyma komunikat
nadaj (pid, komunikat)
odbierz (A , komunikat)
Pośredni komunikaty sa przesyłane do pewnych skrzynek
Komunikat - może być wysyłany w różnej formie. Najczęściej kilka słów, które zawierają pewne informacje, czyli komunikat to pewna ilość słów danych. Niektóre są odbierane jako wskaźnik do obszarów pamięci \. Mogą też być buforowane przez system. Operacje nadaj odbierz są operacjami systemowymi bo odwołują się do systemu. System może zapewnić buforowanie lub nie. Jeśli system nie zapewni buforowania to komunikat nie musi być dostarczony. Jeśli będzie buforowanie i zakończy się zapis to system może przystąpić do nadawania go. Można zażądać potwierdzenia dostarczenia komunikatu (czyli proces nadawcy musi być pewien, że komunikat dotarł do odbiorcy. Bufory mogą mieć różne pojemności bądź mogą być nieograniczone.
Elementy systemu operacyjnego
Zawsze będzie występować warstwa lub moduł zwany jądrem. Jest to najbardziej wewnętrzna warstwa która musi być utworzona (zapisana) jako pierwsza. Jądro będzie dawać połączenie między surową maszyną a resztą systemu operacyjnego.
Trzeba postawić wymaganie sprzętowi aby móc postawić system.
Mechanizm przerwań - jest konieczny do obsługi urządzeń zewnętrznych pozwala na odbiór danych. Daje
nam możliwość transmisji danych, stosuje się go do przełączenia między procesami. Wydaje się niezbędny.
Ochrona pamięci operacyjnej - powinna być wbudowana wewnątrz procesów. Procesy nie powinny się wzajemnie skłócać. Dlatego trzeba aby ta ochrona pamięci była wbudowana wewnątrz urządzenia adresowego
Występowanie zbiorów rozkazów uprzywilejowanych - ( można je wykorzystać w trybie nadzorcy systemu operacyjnego) Muszą istnieć dwa tryby ale może być ich więcej 4,9,16 ( w procesorach INTEL występują 4 takie tryby)
Poziom systemu operacyjnego
Tryb użytkownika
Każdy z nich ma inny poziom. Wyróżnia się kilka grup[ rozkazów uprzywilejowanych.
włączanie i wyłączanie przerwań - (zależy tu na tym aby przerwania były włączane i wyłączane w trybie systemu operacyjnego)
rozkazy przełączania między procesami
rozkazy obsługi rejestrów pamięci wirtualnej - (pamięć jest chroniona przez pewne rozkazy, rejestry obsługujące pamięć wirtualną ; rozkazy muszą być wykonywane przez procesy systemowe)
operacje wejścia/ wyjścia - rozkazy odnoszące się do urządzeń peryferyjnych (rozkazy odczytu i zapisu) Ochrona zasobów niewspółdzielnych 0to tylko część operacji we / wy. Użytkownicy mają pliki które są dostępne to nie są już chronione.
Rozkazy sterujące - czyli rozkazy które mają wpływ na funkcjonowanie procesora.
Tryb pracy nadzorcy i użytkownika
Przejście z trybu użytkownika na tryb odbiorcy - kiedy?
Odwołanie się do systemu operacyjnego w celu wykonania funkcji systemowej lub rozkazu uprzywilejowanego
Wywołanie API - przy Windows - przełączamy się na tryb nadzorcy. System wykonuje operacje wydane mu przez procesy użytkownika. Proces użytkownika może zwrócić się do systemu aby on wykonał jakiś proces, ale system może odmówić.
Wystąpienie przerwania - jeśli zostanie przyjęte to system wykonuje program obsługi przerwań
Wystąpienie błędu w procesie użytkownika. Mogą być różne błędy:
błąd adresowania
Próba wykonania rozkazu uprzywilejowanego - jeśli proces użytkownika wykonać taki rozkaz to powstaje wyjątek, przy takim wystąpieniu wyjątku system przechodzi do trybu nadzorcy.
Występowanie zegara czasu rzeczywistego - Można go nie umieszczać ale przy każdym uruchomieniu systemu musimy podawać datę i czas. W oparciu o jego cykliczne przerwanie możemy dokonywać przełączania procesów. W oparciu o wskazanie zegara możemy planować wykonanie procesów oraz rozliczać zasoby.
Gdy są spełnione te wszystkie wymagania to możemy rozpocząć budowę systemu operacyjnego.
Jądro systemu składa się z 3 elementów
programu wstępnej obsługi przerwań
dyspozytora procesów
Implementacji operacji czekaj sygnalizuj
TG - tablica główna zawierająca informacje o naszym systemie
TG - wskaźnik do tablic, list które mogą znajdować się poza jądrem, do struktury procesów.
|
|
Data bierzące |
Czas bierzący |
Data uruchomienia |
Czas uruchomienia |
Informacje o adresach urządzeń zewnętrzny adres portu równoległego Adres portu szeregowego Adres karty sieciowej |
|
II - Inne informacje np. czas uruchamiania procesu (ile był w czasie wykonywany )
ŚV - obszar środowiska ulotne ( dyskryptor sprzętowy) - jest to miejsce do przechowywania wiadomości o rejestrach segmentowych o tym wszystkim co jest potrzebne, aby zatrzymać i wznowić proces.
Podstawowe stany procesu
wykonawczy ( bieżący ) dany proces jest wykonywany przez jakiś inny proces. Tylko jeden może być wykonywany w jednym momencie przez jeden procesor.
Procesów może być wykonywane tyle ile jest procesorów
wykonywalny proces w danym momencie nie jest wykonywany, ale może być w każdej chwili wznowiony
Niewykonywalny ( w oczekiwanie, wstrzymany ) nie może zostać wznowiony, został wstrzymany ;tak długo aż nie zmieni się ich stan procesów niewykonalnych nie możemy ich wznowić
Załadowany - wczytany do pamięci, ale nie pobrany
Zakończony - zakończony ale jeszcze nie usunięty z pamięci.
Dp zawiera również inne pola np. : uruchomienia procesu, wykonywanie procesu. Mogą być informacje o ilości pamięci przydzielonej do procesu. Będzie też zawierać obszar zwany środowiskiem ulotnym ( dyskryptor ulotny). Gdy proces jest przerywany np. a jego stan jest zapisywany w środowisku ulotnym, wykonywana jest instrukcja BC i potem pobiera ten stan ze środowiska i wykonuje dalej proces A; rozpoczęcie tego procesu musi być w takim samym stanie w jaki zostało przerwane.
Jak wykonuje się proces?
Z pamięci są pobierane rozkazy funkcjonujące w rejestrach procesora zmieniają ich wartość. Trzeba zapamiętać stan przerwanego procesu w środowisku, tak aby móc wznowić proces w tym samym miejscu, gdzie został przerwany ( stan wszystkich rejestrów wskaźników musi być taki sam, aby mógł być wznowiony.
Jak działają programy ?
Elementy programowe
Wstępna obsługa przerwań
Zadania :
określić źródło przerwania
ma zainicjować obsługę przerwania dla wybranego urządzenia .
Mogą wystąpić priorytety, czyli niektóre przerwania będą wcześniej obsługiwane niż inne. W trakcie przerwania może nastąpić zmiana stanu procesu
Przykład jak wygląda wstępna obsługa przerwań, w przypadku gdy sprzęt ma możliwość jednego przerwania:
W niektórych procesach zostało to inaczej rozwiązane i w pamięci znajduje się tablica przerwań zawierająca wskaźniki do POP. Gdy generujemy przerwanie to urządzenie które to robi wysyła na szynę numer. Procesor odczytuje określone miejsce w tablicy przerwań, odczytuje adres i wywołuje POP o podanym adresie. Wszystko dzieje się sprzętowo. ( całkowicie przez procesor) Może się zdarzyć że kilka urządzeń generuje ten sam numer obsługi przerwania : cześć obsługi przerwań zostaje zrobiona sprzętowo a część programowo łańcuch będzie rekrutki. Ten pośredni schemat występuje u nas w komputerze (w PC jest 15 przerwań) a czasem potrzebujemy 17 i wtedy potrzebna jest wstępna obsługa przerwań dla niektórych z nich.
Dyspozytor (drugi element który występuje w jądrze ) wykonuje przełączenia między procesami.
Przydziela on, określa że po wstrzymaniu procesu A będzie wykonywał się proces B
Kiedy następuje przejście do dyspozytora?
Przerwanie zewnętrzne zmieniające stan jakiegoś stanu procesu np. z wykonywalnego zrobić bieżący, w takim przypadku przechodzimy do dyspozytora
Po wywołaniu systemu który wstrzymuje jakiś procesu wykonanie operacji na semaforze=0 wstrzymanie procesu bieżącego aby inny był bieżący
Błąd krytyczny w bieżącym procesie ( przekazanie sterowanie do innego procesu) przechodzimy do dyspozytora którego zadaniem jest przełączenie na inny proces.
Jak działa dyspozytor ?
Deskryptor sprawdza czy proces jest bieżący, czy może być kontynuowany i czy ma najwyższy priorytet. Jeśli tak to jest kontynuowany. Jeśli nie to należy zapamiętać środowisko ulotne wstrzymanego procesu, aby móc go wznowić. Następnie szukamy najodpowiedniejszego procesu do wznowienia. Po znalezieniu tego procesu odtwarzamy SV wcześniejszego procesu po czym przekazujemy mu sterowanie / działanie. Aby ułatwić dyspozytorowi zadanie , zamiast odwoływać się do struktury systemu będzie odwoływać się do kolejki która zawiera wszystkie procesy, które są w danym momencie bieżące i wykonywalne procesy niewykonywalne nie będą w tej kolejce umieszczane. KP - kolejka procesu.
Deskryptor przy wyborze procesów będzie się posługiwał procesami z kolejki. Kolejka ta może być kolejką uporządkowaną wg. priorytetów ( na początku o najwyższym priorytecie, na końcu o najniższym). Deskryptor podglądając kolejkę będzie pobierał pierwszy proces który jest wykonywalny ( nie bieżący bo już jest wykonywany przez proces) i uczyni go wykonywalnym. Proces pierwszy o najwyższym priorytecie który nie jest wstrzymywany to deskryptor. Znowu może odwołać się do pierwszego o najwyższym priorytecie, jednak występuje tu pewne niebezpieczeństwo. Można temu zaradzić, mianowicie po sprawdzeniu kolejki - pierwszy w kolejce jest pobierany i przesuwany na koniec - jest to kolejka cykliczna mamy zabezpieczenie że proces nie utknie w kolejce. Po przez deskryptor możemy dokonywać starzenia priorytetów procesów jeśli znajdują się one zbyt długo w kolejce i nie jest wykorzystywany czy wznawiany. Inne rozwiązanie to kolejka wielopoziomowa ze sprzężeniem zwrotnym. Każda kolejka będzie miała inny priorytet. Wykonujemy jeden wstrzymania, i na koniec kolejki Priorytety mogą być przypisane do poszczególnych kolejek. Z priorytetów będzie wynikał czas przydzielony do danego procesu :
Najwyższy - krótki czas ale często - procesy krótkie
Najniższy - długi czas ale rzadko - procesy długie
Modyfikacje tej kolejki czyli zastosowanie podwyższenia priorytetów poszczególnych poziomów.
Jeśli proces wykonuje w całości cały swój odcinek czasu to można powiedzieć że jest to proces który będzie wykonywany długo.
Gdy wykorzysta dane mu dwa odcinki czasu to można przydzielić mu jeszcze pewne odcinki czasu. Tak samo odwrotnie. Gdy proces nie wykorzysta całego czasu to ich priorytet roście dostaje krótkie odcinki czasu ale często (na każde żądanie)
Implementacja dwóch operacji czekaj i sygnalizuj
Powody występowania tych sygnałów:
Dostępność dla wszystkich procesów działających w systemie
Operacja „czekaj” może spowodować zatrzymanie procesu
Operacja „sygnalizuj” może uczynić jakiś proces wykonywalnym
Dodatkowo
czas ostatniej zmiany semafora
czas ostatniego użycia semafora
zamiast pola S może się pojawić tablica semaforów
lista operacji odwracalnych - możemy wykonać operacje czekaj i sygnalizuj w klasyczny sposób na semaforze ale można również podejść inaczej i stworzyć listę operacji odwracalnych - wtedy te operacje będą zanotowane na liście identyfikator i typ operacji (operacje odwracalne potrzebne są do np.: proces został usunięty z systemu, mógłby wykonać pewne operacje „cz” i „sygn”, gdyby wykonał „czekaj” tzn usuniemy w trakcie „czekaj” to pewien proces przywłaszczy sobie operacje sygnalizuj. Wtedy wykonujemy operację odwracalną która przywróci )
maksymalne wartości semafora
Możemy utworzyć w pamięci listę której długość będzie określona przez semafor. Możemy nie ograniczać od góry naszego semafora. Stworzymy dynamiczną listę.
Uproszczona struktura
KS - kolejka semafora - wskaźnik do listy, w której będziemy mieli identyfikator procesu IP. Jeśli wartość =0 proces zostaje wstrzymany tzn umieszczany w kolejce.
Jeśli proces wykonuje operację czekaj na semaforze =0 to zostanie dodany do kolejki. Jeśli proces wykonuje operację sygnalizuj to któryś z procesów znajdujących się w kolejce zostanie usunięty z kolejki. Ich stan z niewykonalnego staje się wykonalny.
Operacje niepodzielne
To takie które rozpoznajemy, nie możemy ich przerwać i musimy je skończyć. Nie można w ich trakcie wybrać innych operacji, żaden inny proces nie może się wykonać. Czekaj i sygnalizuj są więc operacjami sekcji krytycznej. Trzeba więc w jakiś sposób chronić dostęp do nich. Do tego celu wykorzystuje się rozkazy procesora:
wymień zawartość dwóch komórek - mamy dwie komórki pamięci i wymieniamy ich zawartość
sprawdź i ustaw - odczytuje zawartość danej komórki i jednocześnie zapisuje nową wartość
Implementacja operacji czekaj
Czekaj (S)
Zajmij
If S>0then S:=S-1
Else begin
ZDBP // znajdź deskryptor bieżącego procesu
UzKP // usuń z kolejki procesora (z bieżącej zmienia się na niewykonalną )
DdKS // dodaj do kolejki semafora operację czekaj
End
Uwolnij // zwalniamy dostęp do semafora
Dyspozytor // wywołujemy dyspozytor aby mógł ustalić proces który będzie wznowiony
Implementacja operacji sygnalizuj
Sygnalizuj (S)
Zajmij
If KS;P then S:=-S+1 //czy kolejka semafora jest pusta: tak, zwiększyć zawartość semafora.
Else begin
VzKP // usuń z kolejki semafora wybrany
DdKP // dodaj do kolejki procesora
End
Uwolnij
dyspozytor
Zajmij i uwolnij działają podobnie do czekaj i sygnalizuj ( jednak nie mogą być takie same) obie maja zapewnić niepodzielność określonej sekcji krytycznej.
Jeśli posiadamy system jednoprocesorowy to operacje zajmij i uwolnij mogą odpowiadać wyłączeniu i włączeniu przerwań ( zajmij , zamknij, uwolnij - otwórz) To te operacje są niepodzielne.
Jeśli mamy system wieloprocesorowy (może się wykonać wiele procesów jednocześnie) to operacje zamknij i uwolnij mogą się zażądać Dlatego mamy:
I - rozkaz - zmień zawartość dwóch komórek
Mamy dwa procesy A i B oraz semafor S:
Instrukcja ta jest instrukcją niepodzielną
Jeśli mamy zwykłą sekcję krytyczną to nie posługujemy się aktywnym czekaniem ( wykonuje to między dwoma procesami). W czekaj i sygnalizuj są bardzo krótkie czasy, ale np.: w czasie drukowania ten czas jest b długi i t nie ma sensu. Znacznie prościej jest umieścić taki proces w kolejce semafora i umożliwić innym procesom pracę.
Przykład z rozkazem sprawdź i ustaw
Implementacja inaczej (zmniejszamy wartość semafora zanim sprawdzimy)
To podejście trochę upraszcza operację czekaj sygnalizuj i powoduje że wartość semafora może przyjmować wartości ujemne
Wartości bezwzględne S ( jeśli S<0) mówi nam ile procesów jest w kolejce semafora.
Zarządzanie pamięcią operacyjną
Cel zarządzania pamięcią operacyjną :
Przemieszczania procesów - bloki pamięci zawierają kod dane, zależy nam abyśmy mogli te bloki przesuwać, przemieszczać. Kod ma być umieszczony w komórce o zadanym adresie
System CP/M system 64 KB pamięci jednoprocesorowy, w którym można było mieścić jeden proces( jego kod początkowy 100H)
W pliku programu znajduje się tablica informująca procesor o tym które komórki mają być zwiększone. Generowany adres określa dokładne położenie procesu, ale nie możemy go przesuwać, możemy umieścić w dowolnym miejscu. Wszystkie adresy są adresami względnymi a więc wszystko jedno gdzie umieścimy kod programu, i tak będzie działał poprawnie.
Nie mamy wystarczająco dużo obszarów pamięci ale możemy je zsumować i wtedy możemy przenieść jakiś duży proces. Gdy chcemy umieścić blok ale jest zbyt duży przesuwamy inny i robimy tym samym miejsce.
Ochrona zawartości pamięci - mamy wiele programów, musimy chronić wiele obszary przydzielone do tych programów. Nie można dopuścić by jeden proces mógł ingerować do innego procesu.
Dostęp do obszarów dzielonych - obszary dzielone - do tych obszarów ma dostęp kilka procesów (wybranych) trzeba określić mechanizm który będzie mówił, które procesy mają do czego dostęp. Zapis może i ma mieć tylko jeden w danym momencie.
Organizacja logiczna pamięci - Pamięć ma strukturę liniową. Mamy adresy i one się zmieniają liniowo, Jeśli budujemy jakiś program tworzymy:
Każdy z tych elementów może być kodowany niezależnie. Chcemy by ten logiczny obszar programu był umieszczony w pamięci ale nie koniecznie jako jeden cały obszar ale jako mniejsze obszary. Chcielibyśmy używać pewnych segmentów czyli by każdy element był realizowany (stworzony) osobno przez różne osoby. Chcielibyśmy aby ten logiczny schemat odzwierciedlał nam program.
Organizacja fizyczna pamięci - czyli podział na pamięć główną ( operacyjną) i pomocniczą (dyski twarde, dyskietki), pamięć pomocnicza rozszerzona pamięć główną. Procesy mogą się wykonywać tylko w pamięci głównej co jednak nie oznacza że nie mogą być odesłane do pamięci pomocniczej
Zarządzanie pamięcią operacyjną (główną) będziemy realizować przez pamięć wirtualną zapewniającą odwzorowanie przestrzeni adresów na przestrzeni pamięci tzn. każdy proces działający w systemie będzie generował adresy i to jest przestrzeń adresowa tego procesu. Przestrzeń pamięci to cała pamięć operacyjna.
Pamięć wirtualna to zmiana przestrzeni adresów generowanych przez proces na przestrzeń w pamięci w której jakieś dane się znajdują.
Adresy mogą być generowane przez proces. Przestrzeń adresów którą miał każdy proces zamiana przestrzeni adresów na przestrzeń pamięci. (adresy generowane przez proces są inne niż przestrzenie adresów to już pamięć wirtualna)
Programy programowane od zera
Jeżeli mamy 16 MB Pamięci fizycznej a potrzebujemy 64 więc tworzymy pamięć wirtualną
sektor
ścieżka
talerz
Użytkownik odwołuje się z zewnątrz lub wewnątrz
Procesor
Pamięć
Urządzenie I/O
Co na początku powinniśmy wykonać ?
Wprowadzenie programu do pamięci, ustawienie rejestrów rozkazów, aby były wykorzystane na początku, uruchomienie.
SK
Dzięki przełącznikom wprowadzano dane do pamięci
Adres i wartości wpisywano ręcznie
Następne wykonanie np.: czytanie informacji z zewnątrz.
Czytnik kart magnetycznych
System komputerowy
drukowanie
Czytnik kart magnetycznych
Przepisywanie z kart perforowanych na taśmy magnetyczne
Pamięć
Procesor
I/O
NTC - Kontroler przerwań (przyjmuje żądania poszczególnych urządzeń i kieruje je do procesora
Z kontrolera przerwań sygnał przerwań
Program obsługi przrewań
Gdy następuje przerwanie musi zostać zapamiętany stan rejestru przy głównym programie
Czas potrzebny na wykonanie rozkazu
przerwanie
Wykonanie obsługi przerwania
Wykonanie programu głównego
CK
SK
DW
Stosując przerwania, można w tle jednego zadania wykonywać inne, wykorzystując w pełni czas naszego systemu
INTC
INTC
Kontroler nadrzędny
Kontroler podrzędny
Połączenie kaskadowe kontrolerów
P
dma
intc
By procesor wykonywał swoje zadania należy połączyć urządzenie peryferyjne z INTC. Do tego celu służy kanał. Dane przepływają między urządzeniem a pamięcią bez udziału procesora. Jest wbudowany w układ kontrolera DMA sterującego bezpośrednim dostępem do pamięci.
A B A C D B
Proces wykonuje się potem zostaje przerwany i znowu się wykonuje. Stan procesu w momencie wznowienia musi być identyczny ze stanem w momencie przerwania.
A
czekaj (S)
sekcja krytyczna
sygnalizuj (S)
B
czekaj (S)
sekcja krytyczna
sygnalizuj (S)
A - wyznacza dane ( proces wytwórcy)
Whille trwa do begin
Czekaj (W)
Czekaj (B) (b wartość początkowa k=1)
SK Zapisz
Sygnalizuj (B) (sygnalizuje że inne procesy mogą mieć dostęp)
Sygnalizuj (D) (sygnalizuje że w buforze znajduje się jakaś dana )
End.
B - Proces konsumenta
Whille trwa do begin
Czekaj (D) (będzie działać gdy jakieś dane będą się znajdować w buforze
Czekaj (B) (czeka na dostęp do bufora)
SK Pobierz pobierz dane
Sygnalizuj (B) (zwolni dostęp do bufora)
Sygnalizuj (W) (zasygnalizuje na semaforze W że zwolnił jeden z
elementów bufora i że jest wolne miejsce )
licz
end.
P
Czekaj (B)
Zaois
Sygnalizuj (B)
Po zapisie zwalniany jest dostęp do bufora
C
Czekaj (M)
Licznik:=licznik+1
If licznik = 1 then czekaj (B)
Sygnalizuj (B) (zwalniany jest
semafor M)
czekaj (M)
licznik:=licznik-1
if licznik=0 then sygnalizuj (B)
sygnalizuj (M)
F
Repeat
Czekaj (S[i]) (bierze pałeczkę)
Czekaj (S[i+1]mod 5) (2 pałęczki)
Jedzenie
Sygnalizuj (S[i])
Sygnalizuj(S[i+1] mod 5)
Until false
Jeżeli wszyscy w tej samej chwili będą chcieli jeść (wszystkie procesy chcą skorzystać jednocześnie ze swoich zasobów ) to doprowadzimy do BLOKADY.
Co robić ?
Możemy ograniczyć filozofom dostęp do jedzenia wprowadzając czekaj (j) i sygnalizuj (j)
F
Repeat
Czekaj (j)
Czekaj (S[i])
Czekaj(S[i+1])
Jedzenie
Sygnalizuj(S[i])
Sygnalizuj(S[i-1])
Sygnalizuj (j)
Nawet jeśli wartość semafora ustawi się na 4 nie uzyskujemy zjawiska BLOKADY ponieważ procesy pobierają dopuszczalną ilość zasobów i odkładają je.
Wystarczy ustawić semafor na niewłaściwą wartość i nie będziemy mogli korzystać z konstrukcji
type m = monitor
deklaracja zmiennych
procedura p1
procedura p2
.........
procedura pN
begin
inicjalizacje
end.
Dostęp do zmiennych jest ograniczony można się do nich odwołać przez procedury Deklaracja monitora przypomina deklarację obiektu. Trzeba zapewnić aby procedury miały wyłączny dostęp do zmiennych
Struktura warstwowa
Sp
|
ID - identyfikator procesu który nie może się powtórzyć |
S - stan procesu, może ulec zmianie |
I I |
|
S V |
|
|
|
|
|
|
|
1?
2?
N?
POP 2
POP 1
POP N
T
T
T
N
N
Występuje błąd
Program obsługi przerwania
Taki łańcuch może być wykonywany jako wstępna obsługa przerwań ( wykonywane przez program wstępnej obsługi przerwań)
Łańcuch sprawdzeń ( najpierw sprawdzamy te urządzenia które często generują przerwanie)
S
KS
BU
S - semafor ( nieujemna liczba całkowita, na której
wykonujemy operacje czekaj i sygnalizuj)
KS - (kolejka semafora) lista, pole jest wskaźnikiem,
wskaźnik do list
BU - (bit uzycia) czy dany semafor jest w danym
momencie używany czy jakaś operacja w danym
momencie wykorzystuje sygnały „czekaj” i
„sygnalizuj”
S
KS
BU
OK
IP
PP
IP
Organizacja kolejki
Priorytet procesu
Stan procesu zmienia się z niewykonalnego na wykonalny i umieszczony w kolejce procesora. Skąd można go wywołać
A
S
Bu
0
1
B
1
0
0
0
Operacja zajmij będzie polegała na tym że będziemy zamieniać bity użucia 1 na wartość procesora. Jeśli uzyskamy 1 to wykonuje jakieś operacje na końcu których jest operacja zwolnij czyli oddajemy 1, zwalniamy semafor zwalniamy dostęp do niego, jeśli uzyskamy 0 to wracamy do nieego
0
1
1
Wykonujemy operację
Należy wrócić aby wykonać operację zamień
Operacja zajmij jeśli =0 to wracamy tzw aktywne oczekiwanie (procesor czeka na dostęp do semafora
A
S
Bu
B
0
0
1
1
0
1
Jest czytane przez proces A
I proces B odczytuje (tylko z opóźnieniem)
Aktywne czekanie
Operacja uwolnij
ustaw
1
ustaw
wraca
Czekaj (S)
Zajmij
S:=S-1
If S<0 begin
ZDBP
VzKP
DdKS
End
Uwolnij
dyspozytor
Sygnalizuj (S)
zajmij
S:+S+1
If S<=0 then begin
VZKS
DdKP
End
Uwolnij
dyspozytor
PG
DG
A
IV
PP
PG - program główny
DG - dane pobrane korzystamy z bibliotek
A - algorytmy
IV - interfejs użytkownika
PP - podprogramy pomocnicze