UNIX, Linux procesy - kurs

W tym post-cie, opiszę teoretycznie jądo systemu UNIX.
Jest to piąta część na moim blogu dotycząca teorii systemów operacyjnych.
W kolejnych częściach zajmę się systemem operacyjnym Windows.
W części pierwszej opisałem: wstęp do UNIX-a.
W części drugiej opisałem: system plików UNIX-a.
W części trzeciej opisałem: powłokę UNIX-a.
W części czwartej opisałem: jądro UNIX-a.

Uwaga - materiał pochodzi z mojej skarbnicy wiedzy zgromadzonej podczas studiów na UAM w Poznaniu na przełomie lata 1999-2002 i wtedy też był redagowany. Stanowi doskonałe teoretyczne uzupełnienie wiedzy dla studentów kierunku informatyka.

Proszę traktować tego posta, jako opis systemu operacyjnego UNIX bez podziału na wersje i rodzaje. Tam gdzie jest potrzeba wyraźnie zaznaczam jakiej wersji i jakiego rodzaju systemu operacyjnego UNIX-a dotyczy opis.


Materiał bazuje na książkach:
1. Podstawy systemów operacyjnych - wydawnictwo WNT, autorzy: Abraham Silberschatz i Peter B. Galvin
2. System operacyjny UNIX dla początkujących i zaawansowanych - wydawnictwo BUM, autorzy: Zbyszko Królikowski i Michał Sajkowski

Według mnie najlepsza książka dla osób rozpoczynajacych przygodę z systemem operacyjnym UNIX zarówno pod względem praktycznym jak i teoretycznym dla administratorów i programistów.



Tworzenie, usuwanie i zawieszanie procesów. Proces może utworzyć nowy proces, za pomocą funkcji systemowej fork. Jej wykonanie polega na rozwidleniu procesu wydającego to zlecenie na dwa procesy: macierzysty i potomny które mogą od tej pory pracować współbieżnie, niezależnie od siebie. Dla procesu potomnego jest inicjalizowany oddzielny obszar pamięci operacyjnej. W języku C zlecenie utworzenia nowego procesu możemy zapisać następująco pid=fork(). Zwykle, kiedy proces jest tworzony, ma on wykonywać program różny od wykonywanego przez jego proces macierzysty. Rodzina funkcji systemowych exec (plik, arg1,...,argn) umożliwia procesowi wykonywanie kodu zawartego we wskazanym pliku, przy czym plik ten zawiera polecenia UNIX-a lub program w postaci binarnej, natomiast arg1,...,argn są wartościami parametrów tego polecenia. Jego realizacja polega na wprowadzeniu w obszar pamięci operacyjnej procesu nowego kodu i danych. Następną instrukcją procesu jest wówczas pierwsza instrukcja wczytanego kodu. Tak więc proces potomny mający wykonać program np. alfa powinien wykonać zlecenie exec. Oczywiście nie może być ono wydane z procesu macierzystego. Rozwidlenie procesów (przy użyciu funkcji systemowej fork):

[Rysunek jest przerysowny osobiście prze zemnie, część oryginalna znajduje się w książce, pt.: "System operacyjny UNIX dla początkujących i zaawansowanych" - Autorzy: Zbyszko Królikowski i Michał Sajkowski - str 106.]

Funkcja systemowa wait jest zwykle używana do synchronizacji wykonywania procesu macierzystego i procesu potomnego i okazuje się szczególnie użyteczna, gdy oba procesy mają dostęp do tych samych plików. Mianowicie proces może zawiesić swoje działanie, dopóki któryś z jego procesów potomnych nie zakończy się. Należy w tym celu wykorzystać funkcję systemową wait, na przykład w następujący sposób: pid=wait(&status). Proces może zakończyć swoje działanie operacją exit(status). Powoduje ona zakończenie wykonywania procesu, zamknięcie plików i skasowanie obrazu pamięci procesu.