Pytania_z_odp_1.doc

(135 KB) Pobierz
Pytania egzaminacyjne podstawowe

Przedmiot WSO 1

Pytania egzaminacyjne podstawowe

 

1. Co to jest system operacyjny?

 

System operacyjny spełnia 2 główne zadania:

1.Podział zasobów –  SO musi rozdzielać zasoby ( procesor , pamięć i urządzenia we-wy) komputera między wielu równoczesnych jego użytkowników. 

2. Tworzenie maszyny wirtualnej – przekształcenie „surowego” sprzętu w maszynę, która jest łatwiejsza w użyciu – maszynę wirtualna, której właściwości użytkowe są inne niż danej maszyny fizycznej ale znacznie przydatniejsze dla użytkownika.

 

2. Co oznacza wielodostępność, a co wielozadaniowość?

 

Unix jest wielozadaniowym, wielodostępnym i interaktywnym systemem operacyjnym o szerokim zakresie zastosowań.

Wielozadaniowość oznacza, że system może wykonywać jednocześnie wiele zadań (programów), w tym również na rzecz jednego użytkownika.

Wielodostępność oznacza, że z usług systemu może korzystać jednocześnie wielu użytkowników.

 

3. Jakie funkcje spełnia wielodostępny system operacyjny i jakie podsystemy wchodzą w jego skład?

System operacyjny Linux jest systemem wielodostępnym i wielozadaniowym, tak więc jądro systemu operacyjnego musi realizować następujące zadania:

-

dzielić zasoby,

-

szeregować procesy, koordynować ich pracę, zarządzać nimi, umożliwiać ich współpracę

-

umożliwiać współpracę z urządzeniami peryferyjnymi (wspólnymi dla wielu użytkowników),

-

zapewnić bezkolizyjne wykorzystanie pamięci operacyjnej,

-

zorganizowć system plików, zarządzać plikami, chronić pliki,

-

obsługiwać błędy

 

W systemach wielodostępnych ( lub interaktywnych ) użytkownik może wykonywać jeden lub wiele programów wywołując je za pośrednictwem terminala i mioże posługiwać się terminalem w celu nadzorowania przebiegu programów i sterowania ich wykonywaniem. SO rozdziela zasoby obliczeniowe między różnych użytkowników w taki sposób , aby wydawało się iż każdy z nich ma wyłączny dostęp do całej maszyny.

 

4. Co jest przedmiotem standaryzacji w wielodostępnych systemach operacyjnych?

 

5. Co to jest proces?

UNIX pozwala swoim użytkownikom rozpoczynać różne zadania jako procesy współbieżne. Proces jest to (w uproszczeniu) aktywny program, któremu przydzielono pewien obszar pamięci i pewne zasoby systemowe. Użytkownik poprzez powłokę lub z własnych programów może rozpoczynać, synchronizować i kończyć procesy. Zaletami mechanizmu procesów jest to, że:

·         kompleksowe zadania mogą zostać rozłożone na autonomiczne części, które potrzebują każdorazowo tylko pewnej części zasobów,

·         czasochłonne działania mogą być wykonywane drugoplanowo (np. wsadowo), a użytkownik może w tym czasie przeprowadzać inne działania.

Oprócz tego mechanizm procesu stwarza doskonałą podstawę do realizacji takich działań administracyjnych jak zarządzanie kolejkami, usługi oparte o kalendarz, regularne wykonywanie kopii systemu i danych itd.

Po otwarciu sesji (komendą login) rozpoczynany jest dla każdego użytkownika jego pierwszy proces, który pozostaje aktywny na czas sesji. Ten proces powłoki (Login Shell) inicjalizuje dla każdej komendy dalsze procesy, na których wykonanie powłoka czeka (procesy synchroniczne), lub które przebiegają równolegle drugoplanowo (procesy synchroniczne).

Nowy proces jest tworzony i rozpoczynany przez proces aktywny. Synchronizacja procesów jak i ich komunikacja może odbywać się poprzez pliki, sygnały, semafory, wspólną pamięć i wiadomości. Programiści mają dostęp do tych mechanizmów poprzez odpowiednie funkcje systemowe. Język powłoki stwarza również szereg możliwości efektywnego wykorzystania koncepcji procesu

Program a proces

Zacznijmy od określenia co to jest program. Jest to zestaw instrukcji i danych przechowywanych na dysku w postaci wykonywalnego pliku zwykłego. W i-węźle takiego pliku znajduje się informacja o tym, że plik jest wykonywalny. Po to, by uruchomić program jądro systemu musi utworzyć nowy proces. Każdy proces składa się z trzech segmentów:

·         segment instrukcji

·         segment danych użytkownika

·         segment danych systemowych

Te 3 segmenty nazywane są również środowiskiem, w którym program się wykonuje. Po zainicjowaniu procesu nie ma już powiązania między procesem a programem przez ten proces wykonywanym. Można na podstawie jednego programu zainicjować kilka procesów wykonywanych jednocześnie i również nie ma powiązania między takimi procesami. Jądro systemu może wszystkim procesom zainicjowanym na podstawie tego samego programu przydzielić ten sam segment instrukji - cel takiego postępowania jest oczywisty, mianowicie oszczędzanie pamięci.

W segmencie danych systemowych są między innymi informacje o bieżącym katalogu, o otwartych plikach, o czasie wykorzystania procesora i wiele innych, których część poznamy teraz. Proces nie może w sposób bezpośredni zmieniać danych systemowych.

Każdy proces (z wyjątkiem procesu init) jest tworzony przez jądro systemu na "prośbę" bieżąco wykonywanego procesu, który staje się przodkiem nowego procesu - potomka. Potomek dziedziczy część danych systemowych procesu macierzystego (np. jeśli proces macierzysty miał otwarte pliki, to potomek ma je również otwarte).

Każdemu procesowi przyporządkowany jest identyfikator procesu - PID. Jest on liczbą całkowitą dodatnią i jego wartość jednoznacznie określa proces. Każdy proces ma swój proces macierzysty, a jego identyfikator określony jest skrótem PPID (parent proces ID). Można jedno zadanie podzielić na kilka procesów i utworzyć grupę procesów. Grupie procesów przyporządkowywany jest również identyfikator PGID.

Rozpoczęcie sesji przez użytkownika wiąże się z pobraniem jego UID i GID i uczynienie ich identyfikatorami odpowiednio użytkownika i grupy użytkowników dla pierwszego uruchamianego procesu - jest nim powłoka (np. bash). Po takim przypisaniu otrzymujemy rzeczywity identyfikator użytkownika RUID, oraz grupy RGID. Z każdym procesem związane są jeszcze dwa identyfikatory, są to obowiązujący (również nazywany efektywnym) identyfikator użytkownika - EUID i grupy EGID. W większości zadań rzeczywiste identyfikatory użytkownika i grupy są takie same jak identyfikatory obowiązujące. Programy, które muszą operować na plikach niedostępnych zwykle dla użytkownika, ustawiają odpowiednio efektywny identyfikator użytkownika. Takim programem jest np. program zmieniający domyślną powłokę użytkownika. Identyfikator obowiązujący dla danego procesu służy do określania praw dostępu. Np. program, który jest własnością root'a i ma ustawiony specjalny bit dostępu, zwany bitem ustanowienia identyfikatora użytkownika (set user ID) powoduje, że użytkownik na czas wykonania tego programu otrzymuje uprawnienia właściciela programu - root'a. Po wykonaniu polecenia

·         l /usr/bin/chsh

otrzymasz

-rws--x--x   1 root     root        13800 Apr 17  1999 /usr/bin/chsh

w którym prawo dostępu na wykonanie dla właściciela zostało ustawione na s, a to oznacza, że każdy użytkownik mający prawo wykonania tego pliku dostaje prawo root'a (tylko na czas wykonywania tego programu).

Każdy proces ma swój priorytet (nice), służy on do szeregowania procesów przez jądro systemu. Proces użytkownika może obniżyć swój priorytet, jedynie proces super-użytkownika może podwyższyć swój priorytet.

Proces jest to pojedynczy program wykonujący się we własnej wirtualnej przestrzeni adresowej . Różnica między procesem , a zadaniem czy poleceniem polega na tym , że te ostatnie składać się mogą z wielu procesów  realizujących określoną czynność . Proste polecenie takie jak np.  ls wykonuje się jako jeden proces. Wykonywanie bardziej złożonych poleceń , korzystających z potoków , powoduje uruchamianie jednego procesu dla każdego segmentu potoku.

Slajdy – wso_2_28

 

6. Co to jest blok kontrolny procesu i do czego służy?

 

Każdy proces można reprezentować przez deskryptor procesu , nazywany też czasem blokiem kontrolnym procesu ( ang .process control block) lub wektorem stanu , który jest obszarem pamięci operacyjnej zawierającym wszystkie ważne informacje o danym procesie.

 

Slajdy – wso_2_29

 

7. Co oznacza współbieżne wykonywanie procesów?

 

Współbieżność można rozumieć jako uaktywnienie kilku procesów ( tj . wykonywanie kilku programów ) w tym samym czasie. Jeżeli procesów jest więcej niż procesorów to można uzyskać pozorną współbieżność przełączając procesor od jednych procesów  do drugich. Jeżeli przełączenia dokonywane są w dostatecznie małych okresach czasu , to system obserwowany przez dłuższy czas pozwoli stworzyć iluzje współbiezności. Pozorna współbieżność powstaje w wyniku przeplatania procesów w jednych procesorze.

 

Slajdy – wso_2_28

 

8. Jak powstaje nowy proces?

 

Nowy proces w systemie uruchamiany jest w nastęopujący sposób. Po pierwsze istniejący proces wykonuje czynność zwana rozwidleniem ( forking) , polegającą na utworzeniu dokładnej kopji samego siebie. Utwoerzony w ten sposób nowy proces określanuy jako proces dziecko, posiada własny identyfikator PID , chociaż jego srodowisko jest dokładnie takie samo jak procesu rodzica. W tym momencie w wyniku wykonania funkcji systemowej o nazwie exec treść programu zawarta w przestrzeni adresowej procesu dziecka ulega wymianie na treśc tego programu , który ma być wykonany w ramach danego procesu ( fork –and –exec) Treść nowego programu kompletnie zastępuje tę odziedziczoną od procesu rodzica. Bez zmian pozostaje jesdnak srodowisko procesu , w tym ustawienia zmiennych , przypisania strumienia standardowergo wejscia, stand wyj oraz stan wyj błędów, a także priorytet procesu.

Slajdy – wso_2_30

 

9. Jak proces jest kończony?

 

W momencie kiedy proces kończy swoje działanie , proces rodzic zostaje o tym poinformowany przez odpowiedni sygnał . c.d. w następnym odcinku ;)

 

Slajdy – wso_2_31

 

10. Jak działa funkcja systemowa exec?

 

Przeznacznie:

Funkcja exec() zmienia kontekst poziomu użytkownika danego procesu na kopie programu wykonywalnego umieszczonego w pliku dyskowym. Jeżeli funkcja zostanie wykonana bezbłędnie, to poprzedni kontekst procesu znika i już nigdy nie zostanie odtworzony. Warto zwrócić uwagę, że funkcja exec nie powoduje powstania nowego procesu, lecz jedynie dokonuje wymiany kontekstu istniejącego procesu (wywołującego tę funkcję), który otrzymuje nowy segment danych, kodu i stosu.

Przykładowe zastosowanie:

W połączeniu z funkcjami systemowymi fork i wait można za pomocą funkcji exec zrealizować następujący mechanizm: przekazujemy sterowanie do uruchamianego programu, a po jego zakończeniu, kontynuujemy wykonywanie pierwotnego procesu wywołującego bez utraty żadnych danych.

Po wykonaniu funkcji fork() jądro tworzy - w przypadku sukcesu - nowy proces - bliźniaka. Aby nowopowstały proces wykonał kod leżacy w zewnetrznym pliku wykonywalnym należy wywołaż funkcje systemowa z rodziny exec().

 

11. Jak działa funkcja systemowa fork?

 

Funkcja fork() - tworzenie nowego procesu

Zadaniem funkcji fork() jest tworzenie nowego procesu, będącego potomkiem procesu wywołującego. Wszystkie procesy w systemie powstają za jej pomocą, oprócz procesu o pidzie 0, który jest tworzony wewnętrznie przez jądro przy ładowaniu systemu do pamięci.

Podstawowy interfejs programisty:

pid_t fork(),

gdzie wartość zwracana jest liczbą określającą tożsamość procesu:

·         ojciec otrzymuje pid potomka

·         potomek otrzymuje zero

lub informującą o błędzie w przypadku niepowodzenia przy tworzeniu nowego procesu: -1. Stąd typowy sposób użycia fork:

 

              main(argv,argc)

              {

                switch(fork())

                {

                  case -1 : /* zgłoszenie błedu */

                  case  0 : /* bezpośrednio kod potomka lub wywołanie funkcji exec */

                  default : /* kod ojca */

                }

              }

 

Proces potomny dziedziczy po macierzystym cały jego kontekst, z jedynym wyjątkiem - właśnie wartością zwracaną przez fork(). Powstanie nowego procesu jest niemożliwe w przypadku braku pamięci lub przy przekroczeniu limitu na liczbę procesów.
 

fork

Najważniejsze czynności wykonywane przez funkcję fork():
 

o        utworzenie nowej struktury task_struct dla procesu,

o        utworzenie nowego stanu kontekstu jadra,

o        przydzielenie nowego identyfikatora procesu,

·         kopiowanie zasobow procesu macierzystego,

·         utworzenie nowej struktury mm_struct,

·         utworzenie nowego katalogu stron, lub podłączenie do katalogu procesu macierzystego,

·         "kopiowanie" pamięci wirtualnej.

Cztery ostatnie pozycje dotyczą pamięci.

 

12. Co to są funkcje systemowe?

 

13. W jakich stanach może być proces?

 

W strukturze task_struct umieszczone jest pole

volatile long state;

Pole to określa stan, w jakim aktualnie znajduje się dany proces. Proces może, reagując na pewne zdarzenia i okoliczności, zmieniać swój stan. Pole to może przyjąć jedną z następujących wartości:

·         TASK_RUNNING (0) - proces jest procesem, który aktualnie wykorzystuje procesor lub czeka na jego przydzielenie (jest na liście procesów gotowych do wykonywania).

·         TASK_INTERRUPTIBLE (1) - proces czeka na określone zdarzenie. Różnica pomiędzy tym stanem, a TASK_UNINTERRUPTIBLE jest taka, że tutaj proces obsługuje nadchodzące sygnały. Proces w tym stanie jest po prostu uśpiony i po nadejściu sygnału lub zajściu zdarzenia, na które czekał, umieszczany jest w kolejce procesów gotowych do wykonania.

·         TASK_UNINTERRUPTIBLE (2) - podobnie jak TASK_INTERRUPTIBLE, ale w tym stanie proces nie obsługuje nadchodzących sygnałów. Proces znajduje się w tym stanie zwykle w oczekiwaniu na spełnienie jakiegoś warunku związanego ze sprzętem.

·         TASK_STOPPED (4) - proces został wstrzymany po otrzymaniu odpowiedniego sygnału (SIGSTOP, SIGSTP, SIGTTIN, SIGTTOU) lub będąc monitorowanym przez inny proces przy użyciu wywołania systemowego ptrace przekazał sterowanie do procesu monitorującego. Opuszczenie tego stanu możliwe jest jedynie po otrzymaniu sygnału SIGCONT.

·         TASK_ZOMBIE (8) - proces został przerwany (skończył swój komputerowy żywot), ale jego struktura znajduje się jeszcze w tabeli procesów.

·         TASK_SWAPPING (16) - stała ta jeszcze nie jest używana w wersji systemu 2.2. Żaden proces nie znajduje się nigdy w tym stanie.

O procesie, który znajduje się aktualnie w stanie TASK_RUNNABLE i jest tym, który ma aktualnie przydzielony procesor, mówimy, że się właśnie wykonuje. Proces taki może wykonywać się w jednym z dwóch następujących trybów:

·         Tryb użytkownika - tryb podstawowy procesu.

·         Tryb jądra - w tym trybie możliwe jest wywoływanie funkcji systemowych.

Chyba nie oto chodziło , co? Szczególnie że dotyczy to raczej Linuxa niż Unixa.

Może więc to:

 

Procesy mogą znajdować się w kilku stanach

·         tworzenie procesu (SIDL)

·         wykonywanie procesu (SRUN)

·         zatrzymany proces (SSTOP)

·         oczekiwanie na zdarzenie (SSLEEP)

·         usuwanie procesu (SZOMB)

Proces ze stanu SIDL, jeśli uzyska wystarczające zasoby przechodzi do stanu SRUN. Od tego momentu stan procesu oscyluje między SRUN, SSLEEP, SSTOP do czasu zakończenia tzn. przejścia w stan SZOMB. Proces znajduje się w stanie SZOMB do chwili powiadomienia procesu macierzystego o zakończeniu procesu.

Wiemy już, że każdy proces (z wyjątkiem procesu init) jest powoływany do życia przez inny proces. Do powoływania do życia nowych procesów służą funkcje systemowe: grupa funkcji exec, oraz funkcja fork. Funkcje z grupy exec ponownie inicjują ten sam proces na podstawie wskazanego programu (podmieniają segment instrukcji) - proces zostaje ten sam. Funkcja fork, tworzy nowy proces przez skopiowanie wszystkich segmentów procesu, nowy proces nie jest inicjowany na podstawie programu. Użyteczność funkcji z grupy exec byłaby dość ograniczona, zaś funkcji fork bez exec praktycznie żadna. Dopiero łączne użycie tych funkcji daje potężne narzędzie programistyczne.

Jeśli z poziomu powłoki piszemy dowolne polecenie, to najpierw jest wywoływana funkcja fork, tworząca nowy proces (jest to kopia wszystkich segmentów procesu bash, a następnie odpowiednia funkcja z grupy exec, która podmieni segment instrukcji na podstawie wydanego polecenia. Z poziomu bash można wydać polecenie exec, które za pośrednictwem funkcji systemowej z grupy exec pozwoli na zastąpienie segmentu instrukcji procesu bash, nowym segmentem instrukcji. Wtedy po zakończeniu działania procesu nie należy się spodziewać, że proces bash będzie istniał. Można spróbować w jednym oknie napisać (najpierw sprawdzić PID procesu bash):

·         exec sleep 100

w drugim oknie sprawdzić PID procesu sleep i poczekać na zakończenie jego działania - okno, w którym uruchomione było polecenie exec zniknie, ponieważ proces bash został zastąpiony procesem sleep, a ten skończył działanie.

 

Stan procesu może przyjmować jedną z głównych wartości , proces może być :

1. wykonywany ( running ) bieżąco przez jakiś procesor

2. wykonywalny (runnable) czylio mógłby być wykonywany gdyby przydzielono do niego jakiś procesor

3. niewykonywalny (unrunnable), nie mógłby użyć procesora nawet gdyby mu go przydzielono. Najczęstszą przyczyną niewykonywalności jest fakt , że oczekuje on na zakończenie przesyłania danych z urzadzenia zewn .

 

Slajdy – wso_2_29

 

14. Co to jest "shell"?

 

Po rozpoczęciu sesji zaczynasz pracę w swojej domowej kartotece i jednocześnie uruchamiasz program ogólnie zwany powłoką (po angiesku shell czyli powłoka, skorupka). Domyślnie jest to powłoka o nazwie bash. Wszystko co napiszesz na klawiaturze po naciśnięciu znaku [ENTER] zostanie zinterpretowane przez program bash. Zgodnie z nazwą powłoka tworzy zewnętrzną warstę systemu operacyjnego, warstwę z którą kontaktuje się użytkownik systemu. Na rys 1...

Zgłoś jeśli naruszono regulamin