System operacyjny Unix/Linux Wykład 4 Zarzadzanie procesami Sławomir Nowaczyk Slawomir.Nowaczyk@agh.edu.pl Laboratorium Informatyki Autormatyki Akademia Górniczo-Hutnicza May 14, 2010 System operacyjny Unix/Linux Zarządzanie procesami p. 1/52
Plan wykładów Wprowadzenie do systemów operacyjnych Powłoki systemowe Laboratorium: języki skryptowe Środowiska programowania w GNU/Linux Architektura systemu GNU/Linux procesy, pamięć, wejście/wyjście, itp. Architektura systemu GNU/Linux instalacja, zarządzanie pakietami, itp. Konfiguracja i zarządzanie systemem GNU/Linux Współpraca systemu GNU/Linux z innymi komputerami i systemami operacyjnymi System operacyjny Unix/Linux Zarządzanie procesami p. 2/52
Proces Program w czasie wykonywania kod binarny rejestry procesora stos (zmienne lokalne) sterta (zmienne dynamiczne) dane (zmienne globalne) Jeden program wiele procesów Jeden proces wiele programów System operacyjny Unix/Linux Zarządzanie procesami p. 3/52
Stan procesu TASK_RUNNING wykonywane są instrukcje lub oczekuje na przydział procesora TASK_INTERRUPTIBLE czeka na wystąpienie jakiegoś zdarzenia np. zakończenie operacji wejścia/wyjścia TASK_UNINTERRUPTIBLE czeka na wystąpienie jakiegoś zdarzenia ignoruje nadchodzące sygnały TASK_STOPPED proces został wstrzymany np. poprzez sygnał SIGSTOP System operacyjny Unix/Linux Zarządzanie procesami p. 4/52
Stan procesu TASK_TRACED proces został zatrzymany przez debugger EXIT_ZOMBIE proces zakończył działanie rodzic procesu nie wykonał jeszcze wywołania systemowego wait() informacje o procesie muszą być nadal przechowywane przez system operacyjny EXIT_DEAD rodzic wywołał wait() informacje o procesie są usuwane System operacyjny Unix/Linux Zarządzanie procesami p. 5/52
Stan procesu System operacyjny Unix/Linux Zarządzanie procesami p. 6/52
Blok kontrolny procesu Umieszczony w pamięci należącej do jądra niedostępny bezpośrednio dla użytkownika Informacje niezbędne do zarządzania procesami stan procesu pid, pgrp, session, tgid zawartość rejestrów procesora tablica deskryptorów plików priorytet procesu informacje o organizacji pamięci ograniczenia nałożone na proces uid, euid, suid, fsuid rodzic, dzieci System operacyjny Unix/Linux Zarządzanie procesami p. 7/52
Blok kontrolny procesu System operacyjny Unix/Linux Zarządzanie procesami p. 8/52
Watki Konceptualnie podobne do procesów proces lekki (lightweight process) Podstawowa jednostka wykorzystania procesora Wątek posiada własny licznik rozkazów zbiór rejestrów obszar stosu Współdzieli z innymi wątkami kod programu obszar danych tablicę deskryptorów plików... System operacyjny Unix/Linux Zarządzanie procesami p. 9/52
Process ID Każde zadanie ma własny task_struct zarówno procesy i wątki System gwarantuje że pid jest zawsze unikalny chociaż wewnętrznie jądro nie używa pid tylko wskaźników do deskryptorów procesów Aplikacja wielowątkowa powinna mieć jeden pid widoczny dla użytkownika wywołanie systemowe getpid() zwraca tgid a nie pid aktualnego zadania thread group leader id pierwsze zadanie z danej grupy System operacyjny Unix/Linux Zarządzanie procesami p. 10/52
Ograniczenia Zapobiega przeciążeniu całego systemu przez pojedynczy proces getrlimit() / setrlimit() rlim_cur / rlim_max RLIMIT_AS rozmiar pamięci RLIMIT_CPU czas CPU (w sekundach) RLIMIT_FSIZE rozmiar pliku RLIMIT_NOFILE liczba otwartych plików RLIMIT_NPROC liczba procesów użytkownika RLIMIT_DATA rozmiar sterty RLIMIT_STACK rozmiar stosu System operacyjny Unix/Linux Zarządzanie procesami p. 11/52
/proc Pseudo-system plików struktura i dostęp jak do klasycznych plików nie są umieszczone na dysku /proc/pid informacje o procesie /proc/pid/cmdline /proc/pid/cwd /proc/pid/environ /proc/pid/fd /proc/pid/root /proc/* informacje o jądrze /proc/version /proc/uptime System operacyjny Unix/Linux Zarządzanie procesami p. 12/52
Tworzenie procesów Klasycznym rozwiązaniem jest para fork/exec Wywołanie systemowe fork potomek dziedziczy wszystkie dane rodzica zapisane w task_struct wymaga skopiowania całej pamięci przydzielonej procesowi bardzo czasochłonne Wywołanie systemowe exec ładuje nowy kod do wykonania zastępując ten aktualnie wykonywany niszcząc to co przed chwilą skopiowano System operacyjny Unix/Linux Zarządzanie procesami p. 13/52
task_struct System operacyjny Unix/Linux Zarządzanie procesami p. 14/52
Tworzenie procesów Proces lekki pozwala skopiować samą strukturę wskazywane dane są współdzielone shallow copy Proces ciężki wymaga skopiowania wszystkich danych wskazywanych przez task_struct deep copy Używana jest technika copy on write potomek i rodzic współdzielą pamięć odczyt nie powoduje konfliktu jeśli którykolwiek proces próbuje zapisać dane, zawartość pamięci jest kopiowana System operacyjny Unix/Linux Zarządzanie procesami p. 15/52
Procesy lekkie Wywołanie systemowe clone funkcja do wykonania, argumenty flagi, adres stosu,... Flagi sygnał wysyłany do rodzica po zakończeniu CLONE_VM, CLONE_FS, CLONE_FILES,... CLONE_THREAD, CLONE_SETTLS,... W jądrze Linux fork jest zaimplementowany jako odwołanie do clone child_stack to aktualny wskaźnik na stos sygnał do wysyłania to SIGCHLD żadna flaga nie jest ustawiona System operacyjny Unix/Linux Zarządzanie procesami p. 16/52
vfork Tworzy proces który współdzieli pamięć rodzica Wykonywanie procesu rodzica jest wstrzymane do czasu zakończenia potomka lub wykonania przez niego exec zabezpiecza przed nadpisaniem przez rodzica danych potrzebnych dziecku Nie trzeba kopiować struktur danych kopia jest potrzebna tylko przez chwilę Linux implementuje wywołanie systemowe vfork przy użyciu clone flagi CLONE_VM i CLONE_VFORK System operacyjny Unix/Linux Zarządzanie procesami p. 17/52
do_fork Funkcja do_fork wykonuje większość pracy Znajduje nowy wolny numer pid Kopiuje deskryptor procesu Sprawdza czy flagi są sensowne np. CLONE_SIGHAND i CLONE_VM Zwiększa licznik procesów użytkownika Wpisuje wartość 0 do rejestru EAX wartość zwracana przez funkcję fork() Ustawia pola parent i real_parent Ustawia pola tgid i group_leader Umieszcza proces w kolejce planisty System operacyjny Unix/Linux Zarządzanie procesami p. 18/52
Procesy jadra Proces 0 idle process statycznie alokowane struktury danych jeden proces 0 dla każdego procesora nieskończona pętla instrukcji hlt Proces 1 init process tworzony normalnie żyje aż do zamknięcia systemu Wątki jądra kapmd obsługa zdarzeń APM kswapd odzyskiwanie pamięci pdflush zapisywanie stron na dysku ksoftirqd wykonuje tasklety System operacyjny Unix/Linux Zarządzanie procesami p. 19/52
Deskryptory plików Struktura files_struct liczba procesów współdzielących strukturę maksymalna liczba deskryptorów tablica wskaźników file* tablica otwartych deskryptorów plików Struktura file f_count, f_flags, f_mode f_pos f_op f_uid, f_gid f_security System operacyjny Unix/Linux Zarządzanie procesami p. 20/52
Tworzenie procesów Wywołanie funkcji fork() zwraca 0 w procesie-dziecku zwraca pid dziecka w procesie-rodzicu W procesie-dziecku wywołanie funkcji execvp() execvp(const char *file, char *const argv[]); W procesie-rodzicu wywołanie funkcji wait() Przekierowanie wejścia i wyjścia int open(const char *path, int oflag,...); funkcje dup() i dup2() System operacyjny Unix/Linux Zarządzanie procesami p. 21/52
Sygnały Bardzo krótkie wiadomości wysyłane do procesu lub grupy procesów Zawierają jedynie numer sygnału nie ma żadnej dodatkowej treści Poinformowanie procesu o wystąpieniu zdarzenia wywołują procedurę obsługi sygnału Sygnały mogą być blokowane gdy proces nie jest wykonywany gdy zostaną explicite zablokowane Sygnały czasu rzeczywistego wielokrotne wywołania są kolejkowane System operacyjny Unix/Linux Zarządzanie procesami p. 22/52
Obsługa sygnałów Sygnały mogą być dostarczone w dowolnym momencie pracy programu przerywając normalną pracę struktury danych mogą być niespójne procedura obsługi sygnału powinna być jak najprostsza i jak najkrótsza Jądro przekazuje sygnał poprzez przełączenie procesu do procedury obsługi przerwania po jej zakończeniu program powraca do miejsca przerwania i kontynuuje działanie Procedura obsługi przerwania często ustawia w programie jakąś flagę wykonaj X przy najbliższej okazji System operacyjny Unix/Linux Zarządzanie procesami p. 23/52
Sygnały SIGHUP T Hang up controlling terminal or process SIGINT T Interrupt from keyboard SIGQUIT D Quit from keyboard SIGILL D Illegal instruction SIGABRT D Abnormal termination SIGFPE D Floating-point exception SIGTERM T Process termination daje procesowi możliwość posprzatania SIGKILL T Forced-process termination nie ma możliwości przechwycenia SIGUSR1 T Available to processes do wykorzystania przez programistę SIGUSR2 T Available to processes do wykorzystania przez programistę System operacyjny Unix/Linux Zarządzanie procesami p. 24/52
Sygnały SIGSTOP S Stop process execution tymczasowe zatrzymanie działania procesu SIGCONT C Resume execution wznowienie działania wstrzymanego procesu SIGTTIN S Background process requires input procesy w tle nie maja dostępu do terminala SIGTTOU S Background process requires output SIGCHLD I Child process stopped SIGSEGV D Invalid memory reference SIGURG I Urgent condition on socket SIGXCPU D CPU time limit exceeded SIGXFSZ D File size limit exceeded SIGSYS D Bad system call System operacyjny Unix/Linux Zarządzanie procesami p. 25/52
Używanie sygnałów Polecenie kill <pid> kill -9 <pid> kill -KILL <pid> Definiowane procedur obsługi sigaction() W przypadku aplikacji wielowątkowych sygnał dociera do jednego z wątków wybranego losowo wątki w ramach jednego procesu muszą współdzielić procedury obsługi sygnałów ale mogą indywidualnie blokować sygnały jeśli nieobsłużone przerwanie powoduje zakończenie wątku, jądro zabija cały proces System operacyjny Unix/Linux Zarządzanie procesami p. 26/52
Komunikacja między procesami System plików operacje atomowe wymiana danych Potoki Semafory Wiadomości System V POSIX Pamięć współdzielona Gniazda (sockets) System operacyjny Unix/Linux Zarządzanie procesami p. 27/52
Potoki Tworzone poprzez funkcję pipe() dwa deskryptory plików jednokierunkowe Potok musi zostać utworzony w procesie rodzica nowo utworzeni potomkowie dziedziczą otwarte deskryptory plików Po dwukrotnym wywołaniu funkcji fork() istnieje 6 kopii tych deskryptorów rodzic musi zamknąć oba deskryptory każdy z procesów potomnych musi zamknąć jeden koniec potoku System operacyjny Unix/Linux Zarządzanie procesami p. 28/52
ls more Rodzic (shell) wywołuje pipe() otrzymując parę (3, 4) dwukrotnie wykonuje fork() używa close() żeby zamknąć fd3 i fd4 Pierwsze dziecko (ls) wywołuje dup2(4,1) wywołuje close(3) i close(4) wywołuje execve() Drugie dziecko (more) wywołuje dup2(3,0) wywołuje close(3) i close(4) wywołuje execve() System operacyjny Unix/Linux Zarządzanie procesami p. 29/52
Wiadomości POSIX Message Queues mqd_t mq_open(const char *name, int oflag) Wsparcie dla priorytetów wiadomości mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio); mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio); Asynchroniczne informowanie o przychodzących wiadomościach mq_notify(mqd_t mqdes, const struct sigevent *notification); przy użyciu sygnałów lub wątków System operacyjny Unix/Linux Zarządzanie procesami p. 30/52
Semafory Synchronizacja dostępu do zasobów sekcja krytyczna Dodatnia wartość semafora = zasób jest dostępny dostęp poprzez pomniejszenie wartości jądro blokuje proces przy wartości ujemnej semget(key_t key, int nsems, int semflg); utworzenie lub wyszukanie semafora semop(int semid, sembuf *sops, unsigned nsops); struct sembuf { unsigned short sem_num; short sem_op; short sem_flg; } System operacyjny Unix/Linux Zarządzanie procesami p. 31/52
Pamięć współdzielona Wiele procesów może równocześnie korzystać ze wspólnego regionu pamięci int shmget(key_t key, size_t size, int shmflg); utworzenie lub wyszukanie obszaru pamięci void *shmat(int shmid, void *addr, int shmflg); pobranie wskaźnika do pamięci może być używany jak normalny wskaźnik printf("shared contents: %s", data); Dostęp do pamięci współdzielonej powinien być zabezpieczony przed race condition na przykład poprzez semafory Efektywne przy dużym rozmiarze danych System operacyjny Unix/Linux Zarządzanie procesami p. 32/52
Połaczenia TCP/IP Interfejs sieciowy eth0, wlan0, wifi0, lo... Konfiguracja interfejsu sieciowego ifconfig eth0 192.168.1.13 netmask 255.255.255.0 up Polecenia ifup oraz ifdown Plik /etc/network/interfaces iface lo inet loopback iface eth0 inet static address 192.168.1.102 netmask 255.255.255.0 gateway 192.168.1.254 System operacyjny Unix/Linux Zarządzanie procesami p. 33/52
Dynamic Host Configuration Protocol Klient DHCP automatycznie pobiera dane niezbędne do korzystania z sieci od istniejącego serwera dhclient /etc/dhcp3/dhclient.conf interface "eth0" { } prepend domain-name-servers 10.1.8.1; supersede domain-name wstie.edu; Serwer DHCP /etc/dhcpd.conf System operacyjny Unix/Linux Zarządzanie procesami p. 34/52
Domain Name Service /etc/hosts statyczna lista adresów IP Klient DNS wysyła zapytania do odpowiednich serwerów /etc/resolv.conf search cs.mit.edu mit.edu nameserver 192.168.1.1 Serwer DNS globalna hierarchiczna struktura każdy serwer DNS odpowiada tylko za własną, lokalną część przestrzeni nazw etc/bind/named.conf System operacyjny Unix/Linux Zarządzanie procesami p. 35/52
Network Address Translation Często nazywane Port Address Translation albo IP masquerading implementowane przez iptables również filtrowanie pakietów IP Wykorzystanie jednego publicznego adresu IP przez wiele komputerów w sieci lokalnej router pośredniczy w komunikacji z siecią przechowuje listę otwartych połączeń każdy przychodzący pakiet danych przekazuje automatycznie do odpowiedniego komputera w sieci wewnętrznej shorewall System operacyjny Unix/Linux Zarządzanie procesami p. 36/52
System plików ext2 Second Extended File system Partycja jest podzielona na grupy bloków z których każda zawiera kopię superbloku kopię tablicy grup bloków bitmapę bloków bitmapę inode ów tablicę inode ów bloki danych Grupy działają jak logiczne pod-partycje zmniejszając fragmentację systemu plików System operacyjny Unix/Linux Zarządzanie procesami p. 37/52
Superblok Superblok zawiera podstawowe informacje o organizacji dysku magic number: 0xEF53 informację o wersji systemu plików liczbę montowań systemy plików rozmiar bloków i liczbę bloków w grupie czas ostatniego montowania systemu i zapisu danych status i informacje o błędach listę wolnych bloków i inode ów adres pierwszego inode a Pierwszy inode odpowiada katalogowi "/" System operacyjny Unix/Linux Zarządzanie procesami p. 38/52
inode Każdy plik i katalog w systemie ext2 jest opisany przy użyciu struktury zwanej inode Mode: prawa dostępu i rodzaj inode a plik, katalog, dowiązanie symboliczne lub urządzenie Informacja o właścicielu pliku Rozmiar w bajtach Timestamps czas utworzenia, modyfikacji i dostępu Bloki danych bezpośrednie i pośrednie System operacyjny Unix/Linux Zarządzanie procesami p. 39/52
inode System operacyjny Unix/Linux Zarządzanie procesami p. 40/52
Katalogi W systemie ext2 katalog jest specjalnym rodzajem pliku lista plików znajdujących się w tym katalogu inode, następny wpis, długość nazwy, nazwa System operacyjny Unix/Linux Zarządzanie procesami p. 41/52
Pytania? System operacyjny Unix/Linux Zarządzanie procesami p. 42/52
Zaliczenie przedmiotu Laboratoria zaliczenie: dwa projekty MasterMind napisany w bash u shell napisany w C lub C++ Wykład zaliczenie: kolokwium w czasie wykładu 29.05 test wyboru, około 40 zadań głownie aspekty teoretyczne, chociaż z elementami praktycznymi System operacyjny Unix/Linux Zarządzanie procesami p. 43/52
Podsumowanie: wykład 1 Podstawy systemów operacyjnych Usługi oferowane przez system operacyjny Relacja między SO a sprzętem Tryb uprzywilejowany Wywołania systemowe Pamięć operacyjna i masowa Pamięć wirtualna Bezpieczeństwo Podstawowe polecenia GNU/Linux System operacyjny Unix/Linux Zarządzanie procesami p. 44/52
Podsumowanie: wykład 2 GNU/Linux POSIX i LSB Dystrybucje GNU/Linux Działanie powłoki systemowej Przekierowania Zmienne środowiskowe Konfiguracja powłoki Kontrola zadań Skrypty powłoki zmienne, pętle, argumenty,... System operacyjny Unix/Linux Zarządzanie procesami p. 45/52
Podsumowanie: wykład 3 Środowisko programowania Edytor, IDE Kompilator, etapy kompilacji Debugger Make, configure, CVS Biblioteki readline Boost sqlite Doxygen Valgrind System operacyjny Unix/Linux Zarządzanie procesami p. 46/52
Podsumowanie: wykład 4 Procesy stan procesu, blok kontrolny procesu,... /proc fork, vfork, exec Deskryptory plików Sygnały Potoki Wiadomości, semafory, pamięć współdzielona Połączenia sieciowe System plików ext2 System operacyjny Unix/Linux Zarządzanie procesami p. 47/52
Podsumowanie: wykład 5 GRUB X Window aptitude, apt-get i dpkg Użytkownicy i grupy SUID i SGID ACL CUPS cron samba Konfiguracja Apache, shorewall, named System operacyjny Unix/Linux Zarządzanie procesami p. 48/52
Działanie powłoki Parsowanie polecenia fork() zwraca 0 lub pid dalsze działanie programu zależy od tego czy jesteśmy rodzicem czy dzieckiem Rodzic (powłoka) oczekuje na zakończenie wywołując wait() Dziecko (wywołane polecenie) otwiera pliki wejściowe/wyjściowe kopiuje deskryptory przy użyciu dup2 wykonuje zadane polecenie przez execvp int execvp(const char *file, char *const argv[]); System operacyjny Unix/Linux Zarządzanie procesami p. 49/52
Parsowanie linii poleceń Wszystko do pierwszej spacji to nazwa polecenia Resztę linii trzeba podzielić na słowa jeśli słowo zaczyna się od > to jest przekierowaniem wyjścia jeśli słowo zaczyna się od < to jest przekierowaniem wejścia jeśli słowo zaczyna się od to jest to potok w przeciwnym wypadku jest to argument który trzeba przekazać do polecenia ls -l -a >abc.txt ls -l -a more System operacyjny Unix/Linux Zarządzanie procesami p. 50/52
Parsowanie linii poleceń class Polecenie { string nazwa; string argumenty[10]; string wejscie; string wyjscie; string drugie_polecenie; }; System operacyjny Unix/Linux Zarządzanie procesami p. 51/52
Parsowanie linii poleceń Polecenie parsuj(string line) { Polecenie p; int arg_nr = -1 int index=0; for (int i=1;i<line.size();i++) { if (line[i]!= ) continue; string slowo = line.substr(index,i); if (arg_nr==-1) { p.nazwa=slowo; arg_nr=0 } else { p.argumenty[arg_nr] = slowo; arg_nr++; } index = i; } } System operacyjny Unix/Linux Zarządzanie procesami p. 52/52