Systemy operacyjne i sieci komputerowe - laboratorium

Ćwiczenie: Procesy w Systemie Unix

wersja z dnia 06.03.2005

1. Wstęp

Celem niniejszego ćwiczenia jest zaprezentowanie podstawowych zagadnień związanych z procesami w systemie Unix. Ćwiczenie należy wykonywać w środowisku Solaris z wykorzystaniem X-Windows.

Unix jest systemem wielozadaniowym, co oznacza, że wiele procesów wykonuje się pozornie jednocześnie. Pozorność ta polega na tym, że jądro systemu udostępnia kolejno poszczególnym procesom czas procesora na krótkie (milisekundowe) okresy i tak naprawdę w danej chwili wykonuje się tylko jeden proces.

Każdy proces ma swój unikalny w zakresie całego systemu numer identyfikacyjny zwany PID (ang. process identification number). Oprócz numeru PID każdy proces (z jednym wyjątkiem) na numer PID swojego rodzica - tzw. PPID (ang. parent PID), czyli numer PID procesu, przez który został uruchomiony.

Jedynym procesem, który nie ma swojego rodzica, jest proces o nazwie init, który jest jako pierwszy uruchamiany po starcie systemu operacyjnego. Proces init jest przodkiem wszystkich innych procesów.

2. Wyświetlanie informacji o procesach

Do wyświetlania informacji o procesach działających aktualnie w systemie służy polecenie ps. Polecenie ps ma wiele opcji. Pełen opis tego polecenia można uzyskać wpisując polecenie man ps.

Aby wyświetlić pełną listę wszystkich działających w systemie procesów, wykonaj w okienku terminala polecenie

	% ps -ef

Prawdopodobnie lista ta będzie dłuższa niż liczba linii terminala. Aby wyświetlić tę listę z podziałem na strony, wpisz polecenie

	% ps -ef | more

Wynik będzie miał postać:

     UID   PID  PPID  C    STIME TTY      TIME CMD
    root     0     0  0   lut 11 ?        0:16 sched
    root     1     0  0   lut 11 ?        0:00 /etc/init -
    root     2     0  0   lut 11 ?        0:00 pageout
    root     3     0  0   lut 11 ?        7:27 fsflush
    root    48     1  0   lut 11 ?        0:00 /usr/lib/sysevent/syseventd
    root    50     1  0   lut 11 ?        0:00 /usr/lib/sysevent/syseventconfd
    root    63     1  0   lut 11 ?        0:01 /usr/lib/picl/picld
    root    58     1  0   lut 11 ?        0:00 devfsadmd
    root   154     1  0   lut 11 ?        0:00 /usr/lib/nfs/lockd
    root   164     1  0   lut 11 ?        0:12 /usr/lib/autofs/automountd
    root   195     1  0   lut 11 ?        0:07 /usr/sbin/nscd -S passwd,yes
toczyskt 20110 20061  0 17:54:54 ?        0:00 /bin/ksh /usr/dt/bin/Xsession
    root   188     1  0   lut 11 ?        0:03 /usr/sbin/cron
    root   257     1  0   lut 11 ?        0:01 /usr/dt/bin/dtlogin -daemon
toczyskt 20120 20110  0 17:54:55 ?        0:00 /usr/openwin/bin/fbconsole
toczyskt 20060   257  0 16:10:43 ?        0:03 /usr/openwin/bin/Xsun :0 -nobanner -auth /var/dt/A:0-kJaiGa
    root 20233 20218  0 17:59:47 pts/5    0:00 ps -ef
toczyskt 20189 20182  0 17:55:00 ??       0:00 /usr/dt/bin/dtterm -session dtdhayTb
toczyskt 20192     1  0 17:55:01 ?        0:00 /bin/ksh /usr/dt/bin/sdtvolcheck -d -z 5 cdrom,zip,jaz,dvdrom,rmdisk
toczyskt 20218 20216  0 17:55:09 pts/5    0:00 /bin/zsh

Znaczenie poszczególnych kolumn jest następujące:

Zauważ, że właścicielem wielu procesów w systemie jest użytkownik o nazwie root. Znaczy to, że procesy te są procesami systemowymi bądź zostały uruchomione przez administratora systemu.

Wśród wszystkich procesów działających w systemie znajdź procesy, których jesteś właścicielem. Znajdź również procesy, które należą do innych użytkowników (np. kolegów z grupy).

Aby wyświetlić wszystkie procesy tylko jednego użytkownika, wpisz polecenie

	% ps -fu nazwaużytkownika

4. Zadania (ang. jobs)

Obok pojęcia procesu, kolejnym ważnym pojęciem w systemie unix jest zadanie (ang. job). Zadanie jest to proces, który został uruchomiony przez wywołanie komendy z danego terminala.

Przykładowo, aby uruchomić kalkulator okienkowy, wpisz w terminalu komendę:

	% kcalc

Spowodowało to utworzenie nowego zadania związanego z danym terminalem.

Zostało otworzone okienko klakulatora. Zauważ, że działanie terminala, z którego wywołano kcalc zostało zawieszone do czasu zakończenia zadania kcalc

Można jednak przywrócić działanie terminala poprzez zawieszenie (zatrzymanie) działania kalkulatora. Aby tego dokonać, w aktywnym okienku terminala wciśnij kombinację klawiszy CTRL-Z. W okienku terminala ukaże się wtedy komunikat

	zsh: suspended  kcalc

Powyższy komunikat oznacza, że zadanie kcalc zostało zawieszone - objawia się to między innymi tym, że nie można od tej chwili używać kalkulatora. Od tej chwili można już natomiast używać terminala.

Z poziomu terminala można uruchamiać zadania działające w tle, tzn. takie, których działanie nie powoduje zawieszenia działania terminala. Do uruchamiania zadań w tle służy sympol "&" umieszczany na końcu polecenia.

Aby uruchomić w tle program bitmap (prościutki edytor grafiki), wpisz polecenie

	% bitmap &

Otworzy się okienko programu bitmap. Zauważ, że teraz zarówno terminal jak i okienko programu bitmap są aktywne, czyli terminal i program bitmap działają równolegle.

Aby wyświetlić informacje o wszystkich związanych z danym terminalem zadaniach, wpisz polecenie:

	% jobs

Powinien wyświetlić się następujący komunikat:

[1]  + suspended  kcalc
[2]  - running    bitmap

Pierwsza linijka oznacza, że zadanie kcalc ma numer 1 i jest w stanie "suspended", czyli zawieszone. Druga linijka oznacza, że zadanie bitmap ma numer 2 i jest w stanie "running" czyli działające.

Tak jak już wcześniej napisano, zadanie jest to szczególny rodzaj procesu. Używając komend ps -ef | more lub ps -fu nazwaużytkownika wyszukaj procesy kcalc i bitmap. Zauważ, że są one związane z tym samym terminalem (kolumna TTY).

Aby uaktywnić w tle zawieszone zadanie, korzystamy z polecenia bg (od angielskiego słowa background - tło), po którym podajemy numer zadania poprzedzony znakiem "%".

Przykładowo, aby wznowić działanie programu kcalc, wpisz

	% bg %1

Sprawdź, że teraz można już używać kalkulatora.

Wykonaj ponownie polecenie

	% jobs

Powinno ono dać następujący wynik:

[1]  - running    kcalc
[2]  + running    bitmap

Oznacza to, że oba zadania są działające.

5. Polecenie kill

Do zmiany stanu zadania lub procesu służy polecenie kill. Ma ono wiele wariantów. Tutaj zajmiemy się jedynie dwoma z nich.

Aby zatrzymać (zawiesić) zadanie używamy polecenia kill -STOP z numerem zadania poprzedzonym znakiem "%".

Aby zatrzymać zadanie nr 2 (czyli program bitmap), wpisz polecenie

	% kill -STOP %2

Aby sprawdzić w jakim stanie są zadania, wpisz polecenie

	% jobs

Wynik powinien być następujący:

[1]    running    kcalc
[2]  + suspended (signal)  bitmap

Stan "suspended (signal)" oznacza, że zadanie zostało zawieszone przy użyciu polecenia kill.

Sprawdź, że program bitmap został zawieszony, co objawia się np. tym, że przestał reagować na wciśnięcia przycisków.

Aby zabić dane zadanie (czyli spowodować bezwarunkowe zakończenie jego wykonywania) należy użyć polecenia kill -9 z numerem zadania poprzedzonym znakiem %.

W celu zabicia zadania nr 1 (czyli programu kcalc) wpisz polecenie

	% kill -9 %1

Spowoduje to zakończenie działania programu kcalc i wypisanie komunikatu:

[1]    killed  kcalc

Aby się przekonać, że zadanie kcalc zostało zakończone, możesz obejrzeć aktualną listę zadań, wpisując polecenie:

	% jobs

Możesz również używając polecenia ps -ef | more lub ps -fu nazwaużytkownika przekonać się, że proces kcalc przestał istnieć w systemie.

W niniejszym punkcie zostało zaprezentowane użycie poleceń kill -STOP oraz kill -9 z numerem zadania poprzedzonym symbolem "%". Identyczne efekty można uzyskać używając numeru PID procesu zamiast numeru zadania poprzedzonego symbolem "%". Przykładowo, jeśliby w systemie istniał proces o numerze PID równym 7777, to możnaby go zabić poleceniem kill -9 7777.

W ramach samodzielnych eksperymentów, stwórz nowe zadania i przetestuj na nich działanie poleceń kill -STOP oraz kill -9 użytych z numerem PID procesów.

W systemach unixowych zwykły użytkownik (nie będący administratorem) może manipulować jedynie procesami, które do niego należą. Aby się o tym przekonać w ramach samodzielnych eksperymentów, spróbój zabić jakiś dowolny proces, którego nie jesteś właścicielem.

6. Procesy potomne

Tak jak już na początku niniejszej instrukcji napisano, każdy proces ma, oprócz własnegu numeru PID, numer PPID - tj. numer PID procesu rodzica, czyli procesu przez który został wywołany.

W systemach unixowych zakończenie działania danego procesu powoduje zakończenie działania wszystkich jego procesów potomnych. Aby się o tym przekonać, uruchom w tle program xterm wywołując polecenie

	% xterm &

Program xterm jest innym typem terminala i można z niego korzystać w niemal identyczny sposób jak z terminala, którego używaliśmy do tej pory. W tej chwili mamy otworzone na pulpicie dwa terminale. Aby uniknąć nieporozumień, terminal, którego używaliśmy do tej pory będziemy nazywać "standardowym".

Aby uruchomić kalkulator kcalc jako proces potomny względem terminala xterm, wpis w oknie terminala xterm polecenie:

	% kcalc

Powinno się pojawić okienko kalkulatora.

Przejdź do terminala standardowego. Używając poleceń ps -ef | more lub ps -fu nazwaużytkownika odszukaj procesy xterm oraz kcalc. Porównując numery PID i PPID procesów zauważ, że rodzicem Twojego procesu kcalc jest pewien proces o nazwie zsh - jest to interpreter poleceń. Rodzicem tego procesu zsh jest natomiast Twój proces xterm. Oznacza to, że Twój proces kcalc jest potomkiem drugiego pokolenia procesu xterm.

Przekonaj się teraz, co się stanie z procesem kcalc gdy proces xterm zostanie zabity. W tym celu aby się dowiedzieć, jaki jest numer zadania związanego z terminalem xterm, w terminalu standardowym wpisz polecenie

	% jobs

Wynik tego polecenia powinien być następujący:

[1]  + running    xterm

Oznacza to, że zadanie xterm ma numer 1. Zabij więc to zadanie poleceniem

	% kill -9 %1

Spowodowało to zamknięcie okienka terminala xterm. Zauważ, że zostało również zamknięte okienko kalkulatora kcalc. Świadczy to o tym, że zakończenie danego procesu powoduje również zakończenie jego procesów potomnych.

Uwaga: W praktyce, zakańczanie działania programów za pomocą polecenia kill -9 stosuje się jedynie w sytuacja awaryjnych, gdy nie ma możliwości zakończenia programu w sposób dla niego naturalny (np. poprzez wybranie w programie opcji "Koniec pracy"). Użycie polecenia kill -9 powoduje natychmiastowe zakończenie działania procesu. Proces ten nie ma wtedy możliwości zapisania obrabianych danych i czasami dane te mogą zostać bezpowrotnie utracone.

7. Co jeszcze oferuje nam Unix ...

Niniejsze ćwiczenie miało na celu zaprezentowanie jedynie podstawowych zagadnień związanych z procesami w systemie Unix. System ten oferuje użytkownikom znacznie większe możliwości zarządania procesami, np:

Osoby zainteresowane powyższymi zagadnieniami zachęcam do zgłębiania tajników systemów unixowych.


Opracowanie: Tomasz Toczyski Tomasz.Toczyski@isep.pw.edu.pl

Uaktualnienie: Waldemar Graniszewski

Ostatnia modyfikacja:

[AD-SIZE]