Transcript

Systemy operacyjne - konspekt

Systemy operacyjne1. 2. 3. 4. 5. 6. 7. 8. Systemy plikw Rozwidlanie procesw - fork Synchronizacja - semafory Pami dzielona - shared memory Mechanizm pipe Kolejki komunikatw - message queue Projekty

Pawe opata, Katedra Telekomunikacji AGH

1

Systemy operacyjne - konspekt

2. Systemy plikwSystemy plikw DOS i UNIX znacznie si rni. Rnice wystpuj na wielu poziomach. Inny jest format dysku i struktura suca zapisowi i mapowaniu sektorw fizycznych na kolejne bajty i fragmenty plikw. Inne s rwnie zasady i moliwoci umiejscawiania plikw w katalogach i inne jest znaczenie nazwy plikw. Fizyczny podzia dysku zapewnia nam producent, okrela on ilo gowic, ilo cieek (cylindrw) oraz ilo sektorw na ciece. Kodowanie pooenia danych na fizycznych sektorach dyskowych jest zalene od systemu operacyjnego. Kady dysk niezalenie od systemu operacyjnego (moe to by zalene od rodzaju sterownika np. IDE, SCSI) posiada Master Boot Record. Master boot record (MBR) Jest to pierwszy fizyczny sektor na dysku (head 0, cylinder 0, sector 1). Zawiera on program, ktry zostaje wczytany i uruchomiony po restarcie komputera, sucy do okrelenia, ktra partycja jest aktywna i wczytania tzw. boot sektora tej partycji a nastpnie uruchomienia programu zawartego w nim. W kocowej czci MBR znajduje si rwnie tzw. tablica partycji dysku, czyli opis podziau dysku na logiczne wolumeny. Tablica partycji moe zawiera cztery elementy - tak wic istniej cztery dopuszczalne partycje dyskw (tzw. primary partitions). przesunicie rozmiar zawarto +0 0x01be kod do zaadowania i uruchomienia prog+0x01be +0x01ce +0x01de +0x01ee +0x01fe 16 16 16 16 2ramu z boot-sektora aktywnej partycji 1 wiersz tablicy partycji 2 wiersz tablicy partycji 3 wiersz tablicy partycji 4 wiersz tablicy partycji 0x55 0xAA

Wiersz (element) tablicy partycji dysku: przesunicie +0 +1 +2 +4 +5 +6 +8 +12 +16 rozmiar 1 1 2 1 1 2 4 4 zawartoboot-flag /czy partycja jest aktywna/ 0-nie 127-tak HD - numer gowicy (head) rozpoczynajcej SEC/CYL - numer sektora i cieki rozpoczynajcej 6/10 bitw kod systemu operacyjnego - np. DOS-12, DOS-16, DOS-EXT, LINUX, itp. HD - numer gowicy ostatniego sektora SEC/CYL - numer sektora i cieki ostatniego sektora pocztkowy sektor wzgldny dostpny do operacji dyskowych rozmiar partycji w sektorach nastpna partycja lub bajty 0x55 i 0xAA

Indeks sektora wzgldnego okrela nastpujcy wzr: R EC = CY S S L ECperCY HEADS + HEAD S L ECperCY + ( S L EC 1) W kadej partycji typu DOS-EXT mona z kolei umieci pewn ilo tzw. dyskw logicznych (logical drives), ktre bd z poziomu systemu operacyjnego widoczne jako osobne urzdzenia. Odpowiednikami ich tablic partycji s tzw. drive tables. Rnice s takie, e z takich dyskw nie mona bootowa komputera, nie mona w nich umieszcza filesystemw innych ni DOS (i Linux). Kady z dyskw logicznych trzeba formatowa niezalenie, po to aby utworzy w nich trzy elementy: boot sektor, FAT, directory table. Boot sektory dyskw logicznych z reguy rni si w zalenoci od systemu operacyjnego. Filesystem Dysk podzielony na partycje jest widoczny jako kilka dyskw logicznych. Na dyskach logicznych musi zosta utworzona odpowiednia struktura logiczna umoliwiajca ich uycie. Proces tworzenia tej struktury to formatowanie dysku lub zakadanie filesystemu. W przypadku DOS formatowanie dzieli dysk na tzw. klastry, tworzy boot sektor, tablice FAT oraz root directory. W systemie UNIX zakadanie filesystemu powoduje podzia dysku na tzw. bloki, tworzony jest boot blok, super blok oraz lista i-nodew.

Pawe opata, Katedra Telekomunikacji AGH

2

Systemy operacyjne - konspekt

Boot sektor dysku logicznego w systemie DOS Dysk logiczny w DOS moe by utworzony bezporednio w fizycznej partycji FAT-12, FAT-16 (jeden logiczny dysk to jedna primary partition) albo moe by jednym z kilku dyskw logicznych w partycji rozszerzonej extended DOS partition. System Linux rwnie pozwala na tworzenie partycji extended z logicznymi dyskami, umieszczonymi wewntrz niej. przesunicie +0 +3 +11 +13 +14 +16 +17 +19 +21 +22 +24 +26 +27 +29 rozmiar 3 8 2 1 2 1 2 2 1 2 2 1 2 zawartokod skoku do boot kodu identyfikator np.nazwa i wersja systemu operacyjnego BYTES per SECTOR SECTORS per CLUSTER sektory zarezerwowane liczba tablic FAT maksymalna liczba directory entries cakowita liczba sektorw typ FAT (typ partycji) ten sam bajt co w tablicy FAT[0] liczba sektorw w jednym FAT SECTORS per TRACK HEADS (powierzchnie - dwustronna fizyczna gowica to dwie powierzchnie) sektory ukryte (zarezerwowane) w systemie DOS tu moe by pocztek boot kodu BIOS Parameter Block

File allocation table (FAT) w systemie DOS FAT jest w systemie DOS tablic , uywan w celu odwzorowania fizycznego pooenia danych na dysku na pliki widoczne z poziomu systemu operacyjnego. W kadym directory entry znajduj si dwa bajty przeznaczone na indeks (numer) klastra od ktrego zaczynaj si kolejne bajty pliku. Jest to pierwszy klaster tzw. acucha alokacji (cluster allocation chain). Pod tym indeksem w tablicy FAT znajduje si indeks kolejnego klastra lub oznaczenie, e jest to ju ostatni klaster pliku. Przykad: Directory entry: FAT : M Y F I L E T X T a . . ... . . 0 8 . ...

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 00 ID ff 03 04 05 ff 00 00 09 0a 0b 15 00 00 00 00 10 00 00 00 00 00 16 17 ff 00 00 00 00 f7 00 00 00 20 . . .

Directory entry w systemie DOS: 32 bajty przesunicie +0 +8 +11 +12 +22 +24 +26 +28 rozmiar 8 3 1 10 2 2 2 4 zawartoF I L E N A E X T atrybuty zarezerwowane czas modyfikacji pliku data modyfikacji pliku numer klastra pocztkowego rozmiar pliku M E

Atrybuty plikw w systemie DOS Atrybut pliku to 1 bajt zwizany z kad nazw/plikiem, zapisan w tzw. directory entry, opisujcym jeden element katalogu - np. plik. Rne bity tego bajtu informuj o tym czy nazwa oznacza plik, katalog, etykiet dysku oraz czy jest on tylko do odczytu, czy jest systemowy, czy jest ukryty i czy by ostatnio zarchiwizowany

Pawe opata, Katedra Telekomunikacji AGH

3

Systemy operacyjne - konspekt

(to ostatnie jest uywane w zasadzie tylko przez systemowe programy backup i xcopy, ktrych nikt inny nie uywa). Zasady tworzenia nazw w systemie DOS Due i mae litery s nierozrnialne (w Windows 95 s rozrnialne - do pewnego stopnia). Dopuszczalne znaki, ktre mona uy w nazwie katalogu lub pliku to: litery od A do Z oraz od a do z, cyfry 0 do 9, a take inne znaki: !, @, #, $, %, &, (, ), -, _, { } , `, ~. Znak ~ posiada pewne znaczenie specjalne w systemie W95, w przypadku wykorzystywania tych samych dyskw i plikw w systemie DOS. Nie mona uywa znakw takich jak: spacja, /, ,, ;, ^, +, [, ], , =. Natomiast znaki: *, ?, :, ., \, |, maj znaczenie specjalne. Posta cieki dostpu do pliku: drive: dirname filename .ext drive: jedna litera z dwukropkiem; Litery A i B zarezerwowane s dla stacji dyskw lub dyskw logicznych, pozostae litery dyski fizyczne lub logiczne. Ostatnia dopuszczalna litera okrelona jest klauzul LASTDRIVE w pliku konfiguracji systemu. Z kad zarezerwowan liter wie si pewna ilo zarezerwowanej pamici RAM systemu (okoo 80 bajtw). W systemach W95/NT nie ma to praktycznie adnego znaczenia. LASTDRIVE=Z kosztuje okoo 2kB. dirname jest to lista katalogw, oddzielonych znakiem backslash \, ktra prowadzi od katalogu gwnego (root) do katalogu docelowego, w ktrym znajduje si plik. Dugo poczonej nazwy katalogu i nazwy pliku nie moe przekroczy 63 znakw. Nie s dopuszczalne wildcards w nazwach katalogw. Dwie specjalne nazwy s zarezerwowane. Kropka . oznacza katalog aktualny, ten w ktrym si akurat jest, a dwie kropki .. oznacza katalog nadrzdny w stosunku do aktualnego. Katalog gwny nie posiada swojego katalogu nadrzdnego. filenamejest to waciwa nazwa pliku; dugo od 1 do 8 znakw; Due i mae litery s nierozrnialne. Niektre nazwy plikw s zarezerwowane, z tego wzgldu, e odnosz si do urzdze. S to PRN, LPTn, AUX, COMn, NUL, CON. Kade rozszerzenie dodane do tych nazw plikw jest ignorowane. ext rozszerzenie nazwy pliku, mogce okrela jego typ. Od 0 do 3 znakw, poprzedzone znakiem kropki .. Rozszerzenia COM, EXE, OVL, BAT, OBJ, LIB, SYS s tradycyjnie zarezerwowane. Rozszerzenia niepoprawne np. wicej ni trzy-znakowe mog by w niektrych przypadkach automatycznie poprawiane przez system, np. obcinane po trzech znakach. Struktura dysku logicznego w systemie UNIX blok 0 BOOT blok 1 SUPER blok 2 8 inode blok 3 8 inode blok 4 8 inode ... ... blok i dane ... ... blok i+1 wolne ... ...

Boot blok w systemie UNIX peni tak sam rol jak boot sektor w systemie DOS. Znajduje si w nim kod programu adujcego dalsze elementy systemu operacyjnego. Struktura super bloku liczba blokw w filesystemie nazwa urzdzenia nazwa filesystemu liczba i-nodew wskanik na pierwszy element tablicy wolnych blokw wskanik na pierwszy element tablicy i-nodew data modyfikacji data ostatniego dostpu rozmiar bloku Tablice wolnych blokw i i-nodew rwnie znajduj si superbloku i cay czas rezyduj w pamici operacyjnej. Dziki temu system jest w stanie bardzo szybko znale wolny blok lub i-node przy tworzeniu lub modyfikacji plikw. W tablicach tych nie musz znale si wszystkie bloki i i-nodey. W przypadku braku wolnego i-nodeu lub bloku w tablicy, wykonywany jest specjalny algorytm poszukujcy odpowiedniego elementu w strukturze filesystemu. Katalogi i wzy plikw - i-node

Pawe opata, Katedra Telekomunikacji AGH

4

Systemy operacyjne - konspekt

W systemie UNIX kady element katalogu jest reprezentowany przez struktur informacyjn nazywan i-node. Pooenie i-nodeu katalogu gwnego (root directory) danego filesystemu jest cile okrelone. Jest to i-node o numerze 2. W UNIX kady katalog jest prawie zwyczajnym plikiem. Kolejne bajty tego pliku zawieraj informacj o zawartoci katalogu. przesunicie +0 +2 +16 +18 +32 +34 +48 +50 ... rozmiar 2 14 2 14 2 14 2 14 ... zawartonumer i-node pliku . nazwa pliku . numer i-node pliku .. nazwa pliku .. numer i-node pliku nazwa pliku numer i-node pliku nazwa pliku Directory Entry

...

Dowolny plik (rwnie katalog) posiada wic oprcz nazwy numer swojego i-nodeu. Dalsze informacje o pliku mona odczyta odtwarzajc zawarto komrki tablicy i-nodew okrelon zadanym numerem i-nodeu. Struktura i-nodeu Wze pliku zawiera m.in. nastpujce elementy: typ pliku / prawa dostpu licznik dowiza userID / groupID data modyfikacji i-nodeu data modyfikacji pliku data dostpu do pliku wskanik #1 na blok danych pliku wskanik #2 na blok danych pliku ... wskanik #10 na blok danych pliku wskanik poredni 1-go stopnia na blok wskanikw wskanik poredni 2-go stopnia na blok wskanikw wskanik poredni 3-go stopnia na blok wskanikw

blok 512 B danych blok 512 B danych ... blok 512 B danych blok 128 wskanikw 128 128 wskanikw 128 128 128 wskanikw

Przy blokach 512 bajtowych maksymalny rozmiar pliku w UNIX wynosi wic 1 GB, a przy blokach o wielkoci 1 kB wynosi 16 GB. Atrybuty pliku w systemie UNIX W systemie UNIX nie istnieje odpowiednik bajtu atrybutw plikw z systemu DOS. W wle pliku jest zapisany typ pliku (np. plik zwyky, device driver, katalog, soft link, itp.) oraz parametry dostpu uytkownika, grupy i pozostaych osb. Nie istnieje atrybut informujcy o tym czy plik jest ukryty, czy nie. Ukrycie pliku jest moliwe przez nadanie mu nazwy rozpoczynajcej si od znaku kropki .. To czy plik jest wykonywalny nie zaley od rozszerzenia, ani od zawartoci pliku, a jedynie od parametru dostpu - ten kto prbuje plik wykona musi mie takie uprawnienia. W systemie DOS istniaa moliwo tworzenia wielu wolumenw dyskowych niezalenych. W UNIX istnieje jeden wsplny filesystem. Jeden fizyczny filesystem jest filesystemem gwnym, pozostae dyski logiczne (np. partycje) lub dyski sieciowe docza si do podkatalogw filesystemu gwnego. Nazwy plikw i metaznaki Nazwy plikw w systemie UNIX s ograniczone do 14 znakw. Due i mae litery s rozrnialne. Znak kropki moe wystpi w nazwie i to wielokrotnie. Nie istnieje co takiego jak rozszerzenie pliku, chocia istniej konwencje dodawania pewnych przyrostkw do plikw okrelonego typu. Np. .c jest plikiem tekstowym, zawierajcym kod programu w jzyku C, .C jest plikiem zawierajcym kod programu w C++, itp. W UNIX istniej wiksze moliwoci maskowania znakw w nazwach plikw. Znak * okrela dowolny cig znakw (rwnie pusty). Znak ? okrela dokadnie jeden dowolny znak. Znaki [ i ] umoliwiaj

Pawe opata, Katedra Telekomunikacji AGH

5

Systemy operacyjne - konspekt

zdefiniowanie zbioru dopuszczalnych znakw. Zapis [...-...] umoliwia zdefiniowanie zakresu dopuszczalnych znakw. Metaznaki mog wystpowa wielokrotnie, zarwno w nazwie pliku, jak i w nazwach katalogw na ciece dostpu do pliku. Kolejne katalogi na ciece dostpu do pliku oddzielane s znakiem /, a nie tak jak w systemie DOS znakiem \. W kadym pliku katalogu istniej dwa specjalne wpisy o nazwach . i .., ktre oznaczaj odpowiednio katalog aktualny i katalog nadrzdny. Jedynie w pliku katalogu gwnego oba te wpisy prowadz do tego samego miejsca - do katalogu gwnego. wiczenia: polecenie ls, opcje -l -a -i -F pliki z . na pocztku polecenie rm, opcja -r maskowanie nazw plikw polecenie ln src dest

Pawe opata, Katedra Telekomunikacji AGH

6

Systemy operacyjne - konspekt

3. Rozwidlanie procesw - forkW systemie UNIX wszystkie procesy s tworzone przez inne procesy. Dla danego procesu zawsze mona okreli proces, ktry go utworzy. Wszystkie procesy tworzone s przy pomocy tego samego mechanizmu rozwidlania procesw (fork). W systemie UNIX wszystkie procesy posiadaj swoje identyfikatory tzw. PID (process identifier). Funkcja getpid (IBM AIX 3.2): prototyp: header files: pid_t getpid ( );

opis: Funkcja getpid zwraca warto identyfikatora danego procesu. Jest to identyfikator unikalny w systemie. Warto typu pid_t mona wywietli w postaci liczby cakowitej (np. po zrzutowaniu na int). Funkcja getppid (IBM AIX 3.2): prototyp: header files: pid_t getppid ( );

opis: Funkcja getppid zwraca warto identyfikatora procesu, ktry utworzy wczeniej (parent process) dany proces. Jeeli proces ten (parent) z jakiego powodu ju w systemie nie istnieje, wwczas dany proces (child) staje si tak zwanym procesem osieroconym. Jego identyfikatorowi PPID bdzie przypisana nowa warto identyfikatora procesu specjalnego - procesu init i bdzie to warto rwna 1. W systemie UNIX, kady proces musi mie unikalny identyfikator PID i odpowiedni identyfikator PPID. Std bierze si ten mechanizm przejmowania odpowiedzialnoci za procesy osierocone, przez proces systemowy init. Sam proces init ma identyfikator PID rwny 1, a jego identyfikator PPID wynosi 0. Jest to pierwszy proces powstajcy po uruchomieniu systemu i jedyny, ktry nie posiada swojego procesu parent. Funkcja sleep (IBM AIX 3.2): prototyp: header files: unsigned int sleep ( unsigned int sekundy );

opis: Funkcja sleep zawiesza wykonywanie procesu na czas okrelony w sekundach. Oczekiwanie moe zosta przerwane w przypadku, gdy proces otrzymuje sygna od systemu, lub gdy jest przerywany i koczy dziaanie. Zwracana jest warto 0, gdy funkcja koczy dziaanie po penym okresie zawieszenia procesu. Gdy funkcja koczy dziaanie wczeniej, np. z powodu odebrania sygnau przez proces, wwczas zwracana jest liczba sekund, ktre jeszcze zostay do odczekania, natomiast zmienna globalna errno przyjmuje warto kodu bdu - czyli kodu przyczyny wczeniejszego przerwania funkcji sleep. Polecenie systemowe ps (IBM AIX 3.2): skadnia: ps [-A][-a][-d][-e][-f][-k][-l][-F Format][-G Glist][-g Glist][-p Plist][-t Tlist][-U Ulist][-u Ulist] ps [a][c][e][ew][eww][g][n][U][w][x][l|s|u|v][t Tty][ProcessNumber]

opis: Polecenie systemu ps umoliwia wywietlenie informacji o stanie prosesw w danym systemie. Szczegowy opis wszystkich opcji - help do systemu operacyjego: man ps. Przykad 1#include #include int main() { int myID, myParentID; myID = (int) getpid(); /* rzutowanie jest potrzebne, bo funkcje zwracaj typ pid_t a nie dokadnie int */ myParentID = (int) getppid(); printf( Mj identyfikator PID = %d, a identyfikator mojego parenta PPID = %d\n, myID, myParentID ); return 0; }

Pawe opata, Katedra Telekomunikacji AGH

7

Systemy operacyjne - konspekt

Przykad 2#include #include int main() { int myID, myParentID; myID = (int) getpid(); myParentID = (int) getppid(); printf( Mj identyfikator PID = %d, a identyfikator mojego parenta PPID = %d\n, myID, myParentID ); sleep( 10 ); return 0;

}

program naley po skompilowaniu uruchomi w tle ( np. a.out & ) i zaobserwowa wyniki polecenia ps.

Funkcja fork (IBM AIX 3.2): prototyp: header files: pid_t fork ( );

opis: Funkcja fork powoduje utworzenie nowego procesu. Proces ten, nazywany procesem potomnym (child process) jest niemal dokadn kopi procesu tworzcego, nazywanego procesem rodzica (parent process). Cay segment danych procesu jest kopiowany i proces potomny otrzymuje dokadn kopi danych procesu tworzcego (wraz ze wskanikami, przydzielon dynamicznie pamici itp.) Dokadniej proces potomny dziedziczy z procesu tworzcego nastpujce elementy: rodowisko, znaczniki okrelajce zamykanie uchwytw (handlers) przy zamykaniu procesu, ustawienia obsugi sygnaw, bity Set user ID mode i Set group ID mode, dziedziczone, efektywne oraz maksymalne parametry (wektory) uprawnie, stan trusted, status profiling, warto nice, wszystkie doczone biblioteki dzielone, identyfikator grupy procesw, identyfikator grupy tty, biecy katalog, katalog gwny root, domyln mask uprawnie dla plikw przy ich tworzeniu, wielko ograniczenia rozmiaru plikw, doczone segmenty pamici dzielonej, doczone segmenty pamici reprezentowanej przez pliki, list zdarze, status znacznika audit, identyfikator procesu debugger i stan znacznika multi-process. Proces potomny rni si od rodzica tym, e posiada: inny (unikalny) identyfikator procesu PID, inny identyfikator procesu rodzica, wasn kopi deskryptorw plikw (ale oba procesy wspdziel wskaniki plikw), wasny katalog komunikatw dla procesu tworzcego, przy wyczonej opcji multiprocess debugging, znaczniki trace s zerowane, utime, stime, cutime s zerowane, locks dla procesu, tekstu i danych nie s dziedziczone, wszystkie alarmy (np. zwizane timerami) s zerowane, zbir sygnaw jest zerowany, Funkcja zwraca warto zero w procesie pochodnym, natomiast w procesie tworzcym zwracana jest warto identyfikatora utworzonego procesu (warto wiksza od zero). W przypadku, gdy nie udao si utworzy procesu potomnego zwracana jest warto -1, a kod bdu jest wpisywany do globalnej zmiennej errno. Wykonanie odpowiedniego kodu (rnych kodw) w procesie parent i w procesie potomnym mona uzyska poprzez zastosowanie konstrukcji warunkowej if, ktra zbada co zwrcia funkcja fork. Przykad 3#include

Pawe opata, Katedra Telekomunikacji AGH

8

Systemy operacyjne - konspekt#include extern int errno; int main() { int forkValue; printf( Przed fork: PID = %d, PPID = %d\n, (int) getpid(), (int) getppid() ); forkValue = (int) fork( ); /* rzutowanie jest dlatego, e fork zwraca typ pid_t a nie dokadnie int */ if( forkValue == -1 ) { printf( Nie mona utworzy procesu potomnego funkcj fork! Warto errno = %d\n, errno ); perror(Error); exit(); } if( forkValue == 0 ) /* to znaczy jestemy w procesie child */ { printf( Warto z fork = %d, PID = %d, PPID = %d\n, forkValue, (int) getpid(), (int) getppid() ); sleep( 10 ); } else /* to znaczy jestemy w procesie parent */ { printf( Warto z fork = %d, PID = %d, PPID = %d\n, forkValue, (int) getpid(), (int) getppid() ); sleep( 10 ); } } return 0;

program naley po skompilowaniu uruchomi w tle ( np. a.out & ) i zaobserwowa wyniki polecenia ps.

Funkcje exec (IBM AIX 3.2): prototypy: header files: int execl ( const char * path, const char * arg0, const char * arg1, ... , 0 ); int execv ( const char * path, char * const argTAB [] ); ........

opis: Funkcja exec we wszystkich swoich postaciach powoduje uruchomienie nowego programu w rodowisku wywoujcego procesu. Funkcja ta nie tworzy nowego procesu! Biecy program jest likwidowany (nie proces), a w jego miejsce nakadany jest nowy tzw. new-process image. Plik z adowanym programem moe mie format execa, czyli tzw. extended COFF format, lub moe to by plik tekstowy z procedur shellow. Otwarte deskryptory plikw pozostaj otwarte w nowym programie. Wskanik pliku tych deskryptorw nie ulega zmianie. Procedury obsugi sygnaw zostaj przywrcone (tzn. ustawiane s domylne procedury obsugi). Pierwszy parametr okrela ciek dostpu do pliku, z ktrego adowany jest nowy program, pozostae parametry okrelaj jakie argumenty zostan przekazane do nowego programu. Naley pamita, e warto zerowego argumentu powinna zawiera nazw pliku z ktrego adowany jest program (niezalenie od tego, e bya ona przekazana w pierwszym parametrze funkcji). Nowy process-image dziedziczy ze starego procesu nastpujce elementy: warto nice, identyfikator procesu PID, identyfikator swojego procesu nadrzdnego (parent) PPID, identyfikator grupy TTY, katalog biecy, login name uytkownika, i inne. W przypadku, gdy funkcja uruchomi nowy program, adna warto nie jest zwracana (co jest oczywiste, bo w tym momencie stary program ju nie istnieje - zaczyna si nowy). Jeeli jaka warto jest zwracana, to tylko -1 w przypadku wystpienia bdu. Zmienna globalna errno okrela jego kod (np. bdna cieka dostpu do pliku, lub brak uprawnie).

4. Synchronizacja procesw - semaforyW systemie UNIX wszystkie procesy mog by wykonywane rwnolegle. W przypadku maszyn z jednym procesorem, rwnolego wykonywania si programw zapewniaj odpowiednie mechanizmy np. scheduling i wywaszczanie. System decyduje, kiedy i przez jaki czas dany program bdzie si wykonywa. Ze wzgldu na to, e czasy wykonywania i czasy przestoju s bardzo niewielkie, dla uytkownika wyglda to tak, jak by programy wykonyway si rzeczywicie rwnolegle. W przypadku, gdy mamy do czynienia z maszynami o

Pawe opata, Katedra Telekomunikacji AGH

9

Systemy operacyjne - konspekt

wikszej liczbie procesorw, programy mog wykonywa si rzeczywicie rwnolegle. Z drugiej strony wikszo zasobw systemu jest wsplna. S to np. pami, dyski i pliki, terminale. Podczas rwnoczesnych prb dostpu do tych zasobw przez rne procesy musi istnie jaki mechanizm umoliwiajcy regulacj tego dostpu i synchronizacj procesw. Inny przypadek, kiedy synchronizacja procesw jest niezbdna to komunikacja midzy procesami, odbywajca si poprzez pewne wsplne medium np. przez system plikw lub mechanizm wsplnej pamici. Proces, ktry oczekuje komunikatw moe je odczytywa tylko w tym momencie, gdy inny proces je utworzy i wysa, w przeciwnym wypadku mogyby zosta odczytane komunikaty puste, lub mogyby zosta odczytane kilkakrotnie te same komunikaty. Z kolei proces, ktry wysya komunikaty moe je wysa (wprowadzi do medium) tylko wtedy, gdy proces czytajcy zdy odczyta poprzedni komunikat, w przeciwnym wypadku tre poprzedniego komunikatu mogaby ulec zamazaniu. Niektre zasoby maj wasne mechanizmy zabezpiecze w rodowisku konkurencyjnego dostpu. Inne musz by synchronizowane przez programist. Najpopularniejszym mechanizmem synchronizacji procesw w systemie UNIX s semafory. Funkcja semget (IBM AIX 3.2): prototyp: header files: int semget ( key_t key, int semNB, int semFLG ); , ,

opis: Funkcja semget tworzy w systemie zbir semaforowy (nie jest to zbir w rozumieniu pliku) - set of semaphores (jest to struktura danych zawierajca midzy innymi indeksowaln tablic semaforw) i zwraca jego identyfikator. Identyfikator takiego zbioru jest tworzony na podstawie podanego klucza. Jeeli zostanie podany taki klucz, dla ktrego istnieje ju zbir semaforowy utworzony przez jaki inny proces, to wwczas funkcja bdzie prbowaa doczy si do tego istniejcego zbioru - zwrci identyfikator tego zbioru, ale bez tworzenia go na nowo. Zbir semaforw bdzie zawiera tyle pojedynczych semaforw ile wynosi warto parametru semNB. Bd one indeksowane od wartoci 0 do semNB - 1. Funkcja zawsze bdzie prbowaa utworzy nowy zbir semaforowy wtedy, gdy jako warto parametru key zostanie przekazane IPC_PRIVATE. Jest moliwe okrelenie ustalonego klucza, co spowoduje utworzenie zbioru semaforw z ustalonym identyfikatorem. Mona taki klucz ustali przez zrzutowanie pewnej liczby cakowitej na warto typu key_t lub uy np. funkcji ftok. W ten sposb rne programy/procesy mog si docza do tego samego zbioru semaforw (nie musz to by procesy zwizane ze sob zalenoci parent-child). Ostatni parametr okrela midzy innymi sposb tworzenia zbioru i uprawnienia procesw w zakresie dostpu i modyfikacji wartoci poszczeglnych semaforw w zbiorze. Jego warto powstaje przez wykonanie logicznej operacji or na poniszych wartociach: IPC_CREAT - utwrz zbir semaforw, jeeli jeszcze nie istnieje, lub docz si do istniejcego, IPC_EXCL - powoduje, e funkcja nie bdzie doczaa si do zbioru w systemie, jeeli ten istnieje, S_IRUSR - umoliwia odczyt wartoci semaforw procesowi, ktry utworzy zbir, S_IWUSR - umoliwia modyfikacj wartoci semaforw procesowi, ktry utworzy zbir, S_IRGRP - umoliwia odczyt wartoci semaforw grupie procesw zwizanych z procesem, ktry utworzy zbir, S_IWGRP - umoliwia modyfikacj wartoci semaforw grupie procesw zwizanych z procesem, ktry utworzy zbir, S_IROTH - umoliwia odczyt wartoci semaforw innym procesom, S_IWOTH - umoliwia modyfikacj wartoci semaforw innym procesom, W przypadku bdu funkcja zwraca warto -1 i wpisuje kod bdu do globalnej zmiennej errno. Dokadny opis funkcji - polecenie man semget.

Funkcja semctl (IBM AIX 3.2): prototyp: header files: int semctl ( int semID, int semIndex, int command, int value ); int semctl ( int semID, int semIndex, int command, struct semid_ds * buffer ); int semctl ( int semID, int semIndex, int command, unsigned short array [] ); ,

opis: Funkcja semctl umoliwia realizacj operacji kontrolnych na zbiorach semaforowych. Dziki niej mona midzy innymi usun z systemu zbir semaforowy, ustawia wartoci poszczeglnych semaforw w zbiorze, lub je odczytywa. Mona rwnie zmienia uprawnienia procesw w zakresie dostpu do zbioru semaforw. Parametr semID okrela identyfikator zbioru semaforw (zwrcony przez funkcj semget); semIndex okrela indeks semaforu, ktrego dotyczy dana operacja. Parametr command okrela

Pawe opata, Katedra Telekomunikacji AGH

10

Systemy operacyjne - konspekt

rodzaj operacji kontrolnej, ktr chcemy wykona na danym semaforze. Ostatni parametr zaley od rodzaju komendy i zawiera niezbdne dane do jej wykonania. Najwaniejsze operacje kontrolne: GETVAL - zwraca warto semafora (o ile proces ma uprawnienia do odczytu wartoci), czwarty parametr nie ma znaczenia dla tej operacji, warto semafora jest zwracana jako wynik dziaania funkcji, SETVAL - ustawia semafor na warto okrelon czwartym parametrem value (o ile proces ma uprawnienia do modyfikacji wartoci), GETALL - zwraca wartoci wszystkich semaforw w zbiorze, wpisujc je do tablicy array, SETALL - ustawia wszystkie semafory przypisujc im wartoci z tablicy array, IPC_STAT - pobiera informacj o statusie zbioru semaforw i wpisuje j do struktury wskazywanej przez parametr buffer, IPC_RMID - usuwa zbir semaforowy z systemu i likwiduje struktur danych opisujcych tablic semaforw. Zbir semaforw moe usun proces, ktry go utworzy. Dokadniejsze informacje - polecenie man semctl. Funkcja semop (IBM AIX 3.2): prototyp: header files: int semop ( int semID, struct sembuf * operations, int operationsNB ); ,

opis: Funkcja semop wykonuje cig operacji na zbiorze semaforowym. Opisy operacji s przekazane przy pomocy wskanika operations (w szczeglnoci moe to by jedna operacja). Liczba tych operacji przekazana jest przy pomocy paramteru operationsNB. Identyfikator zbioru semaforowego, ktrego dotycz operacje jest przekazany przy pomocy parametru semID. Opis pojedynczej operacji zawiera si w strukturze typu struct sembuf. Struktura ta midzy innymi posiada nastpujce pola: int sem_num; int sem_op; int sem_flg; Operacja okrelona przez pole sem_op jest wykonywana na semaforze okrelonym przez indeks sem_num. Pole sem_op moe okreli jedn z trzech rodzajw operacji semaforowych, w zalenoci od znaku: 1. sem_op ma warto ujemn, wwczas: Jeeli aktualna warto danego semafora jest wiksza bd rwna moduowi sem_op, to warto aktualna semafora jest pomniejszana o modu sem_op. Jeeli aktualna warto danego semafora jest mniejsza od moduu sem_op, to proces zawiesza wykonywanie dziaania do czasu, spenienia wczeniejszego warunku, usunicia z systemu zbioru semaforw (w tym przypadku funkcja zwrci bd), lub otrzymania sygnau. Jeeli aktualna warto danego semafora jest mniejsza od moduu sem_op i pole sem_flg jest ustawione na warto IPC_NOWAIT, wwczas proces nie zawiesza wykonywania dziaania, natomiast funkcja zwraca bd wykonania operacji (nie udao si ustawi danej wartoci). 2. sem_op ma warto dodatni, wwczas: Aktualna warto danego semafora jest powikszana o warto sem_op. 3. sem_op ma warto zero, wwczas: Jeeli aktualna warto danego semafora jest rwna zero, funkcja powraca natychmiast, Jeeli aktualna warto danego semafora jest rna od zera, funkcja zawiesza dziaanie procesu do czasu, gdy warto semafora zostanie ustawiona na zero, zbir semaforw zostanie usunity z systemu, lub proces otrzyma sygna. Jeeli aktualna warto danego semafora jest rna od zera i pole sem_flg jest ustawione na warto IPC_NOWAIT, wwczas proces nie zawiesza wykonywania dziaania, natomiast funkcja zwraca bd wykonania operacji. W przypadku poprawnie wykonanej operacji funkcja zwraca warto zero. W przypadku bdu funkcja zwraca warto -1, a zmienna globalna errno zawiera kod bdu. Polecenie systemowe ipcs (IBM AIX 3.2): skadnia: ipcs [ -m][ -q][ -s][ -a | -b -c -o -p -t][ -Ccorefile][ -N Kernel]

opis: Polecenie systemu ipcs umoliwia wywietlenie informacji o stanie zasobw systemowych - semaforw, pamici dzielonej i kolejek komunikatw. Wywietlany jest identyfikator danego zasobu, klucz, z ktrym by utworzony, jedenastoznakowy stan zasobu, dostpno zasobu dla rnych procesw i inne informacje. Szczegowy opis wszystkich opcji - help do systemu operacyjego: man ipcs.

Pawe opata, Katedra Telekomunikacji AGH

11

Systemy operacyjne - konspekt

Polecenie systemowe ipcrm (IBM AIX 3.2): skadnia: ipcrm [-m ShmID][-M ShmKEY][-q MsgqID][-Q MsgqKEY][-s SemID][-S SemKEY]

opis: Polecenie systemu ipcrm umoliwia usunicie z systemu zasobw okrelonych przez identyfikator lub przez klucz. Jest to szczeglnie przydatne, gdy jakie programy przez swoje nieprawidowe dziaanie zamiecaj system nieuywanymi zasobami (przy wychodzeniu z programu zasoby te nie s automatycznie zwalniane). Szczegowy opis wszystkich opcji - help do systemu operacyjego: man ipcrm. Przykad 1 - Schemat synchronizacji dwch procesw wypisujcych naprzemiennie kolejne liczby naturalne.Proces A Proces B

Schemat kodu programu A:f o r ( i = 0 ; i < 1 0 0 ; i + + o p u _ s e ( a f )o ;r m A w y p i s z _ l i c z b ( i p o d n i e _ s e mB a ) ; r ( f o ) ) ;

Schemat kodu programu B:{f o r ( i = 0 ; i < 1 0 0 ; i + + o p u _ s e ( a f )o ;r m B w y p i s z _ l i c z b ( i p o d n i e _ s e mA a ) ; r ( f o ) ) ; {

}

}

Semafor A

1 0

Semafor B

1 0

Wypisanie kolejnej liczby Semafor B 0 1

Wypisanie kolejnej liczby Semafor A 0 1

UWAGI:Program #1 do realizacji: 1. Funkcje semUP( int sn ), semDOWN( int sn ), child(), parent() 2. Tworzenie zbioru semaforowego 3. Rozwidlenie procesu 4. W procesie childa wywoanie funkcji child() 5. W procesie parenta wywoanie funkcji parent(), a nastpnie usunicie zbioru semaforw Funkcje semUP i semDOWN odpowiednio maj podnosi i opuszcza zadany semafor. Funkcje parenta i childa powinny wypisa w ptli kolejne n liczb naturalnych (z informacj o tym, ktry to proces). Program #2 do realizacji: 1. Uzupenienie programu #1 o schemat synchronizacji z przykadu 1

Pawe opata, Katedra Telekomunikacji AGH

12

Systemy operacyjne - konspekt

5. Pami dzielona - shared memoryW systemie UNIX istnieje mechanizm umoliwiajcy bardzo efektywn komunikacj midzy procesami. Jest to tak zwana pami dzielona. Obszar pamici dzielonej moe by utworzony przez pewien proces, a nastpnie inne procesy mog si do niego docza i z niego korzysta. To co zostanie do pamici dzielonej wpisane przez jeden proces jest natychmiast widoczne w innych procesach. Przy niezsynchronizowanych prbach dostpu do danych o tych samych adresach mog pojawia si konflikty (np. przy prbie wprowadzenia rnych danych do tego samego bajtu przez dwa rne procesy). Budowanie systemu komunikacji midzy procesami, w oparciu o mechanizm segmentw pamici dzielonej, wymaga zastosowania odpowiednich mechanizmw synchronizacji - np. semaforw. Funkcja shmget (IBM AIX 3.2): prototyp: header files: int shmget ( key_t key, size_t size, int shmFLG ); , ,

opis: Funkcja shmget tworzy w systemie struktur reprezentujc pami dzielon. Jest to struktura danych, z ktrej mona uzyska wskanik do tablicy bajtw, w ktrej mona przechowywa dane wsplne dla wielu procesw). Funkcja ta zwraca identyfikator pamici dzielonej. Identyfikator takiej struktury jest tworzony, podobnie jak w przypadku zbioru semaforowego, na podstawie podanego klucza. Jeeli zostanie podany taki klucz, dla ktrego istnieje ju segment pamici dzielonej utworzony przez jaki inny proces, to wwczas funkcja bdzie prbowaa doczy si do tego istniejcego segmentu - zwrci identyfikator tego segmentu, ale bez tworzenia go na nowo. Segment pamici dzielonej bdzie zawiera tyle bajtw ile zostao okrelone parametrem size. Funkcja zawsze bdzie prbowaa utworzy nowy segment wtedy, gdy jako warto parametru key zostanie przekazane IPC_PRIVATE. Jest moliwe okrelenie ustalonego klucza, co spowoduje utworzenie segmentu z ustalonym identyfikatorem. Mona taki klucz ustali przez zrzutowanie pewnej liczby cakowitej na warto typu key_t lub uy np. funkcji ftok. W ten sposb rne programy/procesy mog si docza do tego samego segmentu pamici dzielonej (nie musz to by procesy zwizane ze sob zalenoci parent-child). Ostatni parametr okrela midzy innymi sposb tworzenia segmentu i uprawnienia procesw w zakresie dostpu i modyfikacji wartoci bajtw wspdzielonego obszaru. Jego warto powstaje przez wykonanie logicznej operacji or na poniszych wartociach: IPC_CREAT - utwrz segment pamici dzielonej, jeeli jeszcze nie istnieje, lub docz si do istniejcego, IPC_EXCL - powoduje, e funkcja nie bdzie doczaa si do segmentu, jeeli ten istnieje, S_IRUSR - umoliwia odczyt danych z pamici procesowi, ktry utworzy segment, S_IWUSR - umoliwia modyfikacj danych procesowi, ktry utworzy segment, S_IRGRP - umoliwia odczyt danych grupie procesw zwizanych z procesem, ktry utworzy segment, S_IWGRP - umoliwia modyfikacj danych grupie procesw zwizanych z procesem, ktry utworzy segment, S_IROTH - umoliwia odczyt danych innym procesom, S_IWOTH - umoliwia modyfikacj danych innym procesom, W przypadku bdu funkcja zwraca warto -1 i wpisuje kod bdu do globalnej zmiennej errno. Dokadny opis funkcji - polecenie man shmget. Zarwno zbiory semaforowe jak i segmenty pamici dzielonej nie s automatycznie usuwane po zakoczeniu dziaania procesu, ktry je utworzy. Usunicie segmentu jest realizowane przez funkcj shmctl lub polecenie systemowe ipcrm. Funkcja shmctl (IBM AIX 3.2): prototyp: header files: int shmctl ( int semID, int command, struct shmid_ds * buffer ); ,

opis: Funkcja shmctl umoliwia realizacj operacji kontrolnych na segmentach pamici dzielonej. Dziki niej mona midzy innymi usun z systemu segment pamici dzielonej. Mona rwnie zmienia uprawnienia procesw w zakresie dostpu do pamici dzielonej. Parametr shmID okrela identyfikator segmentu pamici dzielonej (zwrcony przez funkcj shmget). Parametr command okrela rodzaj operacji kontrolnej, ktr chcemy wykona na pamici dzielonej. Ostatni parametr zaley od rodzaju komendy i zawiera niezbdne dane do jej wykonania. Najwaniejsze operacje kontrolne:

Pawe opata, Katedra Telekomunikacji AGH

13

Systemy operacyjne - konspekt

IPC_STAT - pobiera informacj o statusie segmentu pamici dzielonej i wpisuje j do struktury wskazywanej przez parametr buffer, IPC_RMID - usuwa segment pamici dzielonej z systemu i likwiduje struktur danych opisujcych ten segment. Segment pamici dzielonej moe usun proces, ktry go utworzy, albo proces, ktry ma do tego uprawnienia. W przypadku bdu funkcja zwraca warto -1 i wpisuje kod bdu do globalnej zmiennej errno. Dokadniejsze informacje - polecenie man shmctl. Funkcja shmat (IBM AIX 3.2): prototyp: header files: void * shmat ( int shmID, char * shmAddress, int shmFLG ); ,

opis: Funkcja shmat umoliwia doczenie procesu do utworzonego wczeniej przez ten lub inny proces segmentu pamici dzielonej. Dziki tej funkcji proces otrzymuje wskanik na tablic bajtw znajdujcych si we wsplnej pamici. Pierwszy parametr okrela identyfikator segmentu pamici dzielonej, z ktrego pobieramy wskanik (do ktrego nastpuje przyczenie). Drugi okrela adres z przestrzeni adresowej procesu, do ktrego programista chce przyczy pami dzielon. 1. Jeeli warto adresu podanego przez uytkownika wynosi zero (NULL), wwczas system operacyjny samodzielnie dobiera odpowiedni warto i zwraca j jako wynik dziaania funkcji. 2. Jeeli warto adresu podanego przez uytkownika jest niezerowa, wwczas: Jeeli ustawiona bya flaga SHM_RND, to system operacyjny dobiera tak warto, ktra znajduje si na dopuszczalnej granicy adresowej (granica ta wynosi SHMLBA), o adresie wikszym bd rwnym podanemu przez programist, a nastpnie zwraca j jako wynik dziaania funkcji. Jeeli flaga SHM_RND nie bya ustawiona, to system operacyjny prbuje doczy segment pamici dzielonej cile do podanego przez uytkownika adresu, jeeli nie jest to moliwe, wwczas funkcja zwraca bd (warto -1). Domylne ograniczenia zwizane z segmentami pamici dzielonej: Maksymalna wielko segmentu pamici dzielonej wynosi 256 MB, minimalna wielko wynosi 1 bajt, maksymalna liczba utworzonych segmentw wynosi 4096. Trzeci argument funkcji okrela parametry doczania do segmentu pamici dzielonej (dokadny opis polecenie man shmat). Zwracana warto: W przypadku pomylnego doczenia do segmentu pamici dzielonej, funkcja zwraca adres pocztku wspdzielonej tablicy bajtw. W przypadku wystpienia bdw zwracana jest warto -1. Typ zwracanej wartoci to void *. Aby prawidowo wykona kontrol bdw naley wic zwrcon przez funkcj warto zrzutowa na typ int i porwna ze sta -1. Jeeli warto ta jest rna od -1, to znaczy, e segment zosta prawidowo doczony i mona z niego korzysta. Aby mona byo z niego korzysta, naley kolejno zrzutowa zwrcon warto na wskanik na odpowiedni typ np. na char *. Przykad 1 - fragment kodu programu tworzcego pami dzielon i doczajcego si do niegoint shmID; char * sharedptr; shmID = shmget( IPC_PRIVATE, 128, IPC_CREAT | S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP ); if( shmID == -1 ) { printf(ERROR in shmget\n); exit(); } sharedptr = (char *) shmat( shmID, 0, 0 ); if( (int)sharedptr == -1 ) { printf(ERROR in shmat\n); exit(); } /* tu ju mona korzysta z pamici dzielonej * np. mona co do niej wpisa: */ strcpy( sharedptr, Ten tekst trafi do pamici dzielonej );

Funkcja shmdt (IBM AIX 3.2): prototyp: header files: int shmdt ( char * shmAddress ); ,

opis: Funkcja shmdt umoliwia odczenie procesu od utworzonego wczeniej przez ten lub inny proces segmentu pamici dzielonej, do ktrego dany proces jest doczony. Argument funkcji okrela adres

Pawe opata, Katedra Telekomunikacji AGH

14

Systemy operacyjne - konspekt

poprzez ktry proces jest doczony do segmentu pamici dzielonej. W przypadku pomylnego wykonania operacji funkcja zwraca warto zero. W przypadku bdu funkcja zwraca warto niezerow, a kod bdu wpisywany jest do zmiennej globalnej errno. Przykad 2 - fragment kodu programu odczajcego si od pamici dzielonej i usuwajcego struktur segmentu pamici dzielonej z systemu operacyjnego.shmdt ( sharedptr ); /* tu ju NIE mona korzysta ze wskanika sharedptr */ shmctl ( shmID, IPC_RMID, 0 ); /* tu ju pami dzielona nie istnieje */

Przykad 3 - Schemat synchronizacji przy przesyaniu przez pami dzielon komunikatu i odpowiedzi w relacji klient-serwer przy uyciu jednego bufora dla polecenia i dla odpowiedzi.Klient Oczekiwanie na wolny bufor Wprowadzenie polecenia Polecenie gotowe P 0 1 Z 1 0 Semafor Z Semafor P Semafor O zajtoci gotowoci gotowoci bufora polecenia odpowiedzi Serwer Oczekiwanie na polecenie Odczytanie polecenia Wykonanie polecenia P 1 0

Pami dzielona bufor komunikatw ...

Oczekiwanie na odpowied Odczyt odpowiedzi Odpowied odczytana

O 1 0

Przygotowanie odpowiedzi Wprowadzenie odpowiedzi

Z 0

1

Odpowiedz gotowa

O 0

1

W tym schemacie gdy dziaa tylko jeden klient, semafor Z nie jest potrzebny. UWAGI:Program #1 do realizacji: 1. Funkcje semUP( int sn ), semDOWN( int sn ), child(), parent() 2. Tworzenie zbioru semaforowego i segmentu pamici dzielonej 3. Rozwidlenie procesu 4. W procesie childa doczenie si do segmentu, wywoanie funkcji child() i odczenie si od segmentu 5. W procesie parenta doczenie si do segmentu, wywoanie funkcji parent(), a nastpnie odczenie si od segmentu, usunicie zbioru semaforw i segmentu pamici dzielonej Funkcje semUP i semDOWN odpowiednio maj podnosi i opuszcza zadany semafor (wzite z programu dotyczcego semaforw). Funkcja parenta powinna wpisa dowolny tekst do pamici dzielonej, natomiast funkcja childa powinna odczyta ten tekst i wypisa na ekranie Program #2 do realizacji: 1. Uzupenienie programu #1 o upienie procesu odczytujcego z pamici dzielonej na pewien czas przed odczytem. Program #3 do realizacji: 1. Uzupenienie programu #1 o synchronizacj i schemat komunikacji z przykadu 3; realizacja operacji mnoenia przez 2 w serwerze.

Pawe opata, Katedra Telekomunikacji AGH

15

Systemy operacyjne - konspekt

6. Mechanizm pipe, strumienie w UNIXW systemie UNIX istnieje mechanizm umoliwiajcy wymian danych midzy dwoma procesami zwizanymi zalenoci parent-child lub child-child. Jest to mechanizm strumieni. Pomidzy dwoma procesami tworzy si tzw. pipe czyli strumie, do ktrego procesy mog wpisywa informacj lub j z niego odczytywa. Utworzony strumie - pipe daje dwa deskryptory plikw (file handle - lub file descriptor). Poprzez jeden z deskryptorw moemy wpisywa dane do strumienia, a poprzez drugi, moemy dane odczytywa. W ten sposb jest moliwa realizacja jednokierunkowej komunikacji (bez dodatkowej synchronizacji). Z dodatkow synchronizacj komunikacja moe by dwukierunkowa. Dwukierunkowe przesyanie danych mona rwnie zrealizowa przy pomocy dwch niezalenych - jednokierunkowych strumieni. Np. pierwszy od klienta do serwera i drugi od serwera do klienta.

Proces A

Proces B

PIPEZapis Deskryptor pliku #1

Deskryptor pliku #0

Odczyt

Przykad 1 Schemat strumienia jednokierunkowego

Proces A

Proces B

Zapis

Deskryptor pliku #1 Deskryptor pliku #0

PIPE

Deskryptor pliku #1 Deskryptor pliku #0

Zapis

Odczyt

Odczyt

Przykad 2 Schemat strumienia dwukierunkowego (komunikacja wymaga pewnej synchronizacji) Funkcja pipe (IBM AIX 3.2): prototyp: header files: int pipe ( int FD [ 2 ] );

opis: Funkcja pipe tworzy komunikacyjny kana midzyprocesowy, ktry nazywany jest pipe. Ustawia warto dwch deskryptorw plikw. S to FD[ 0 ] oraz FD[ 1 ]. Deskryptor FD[ 0 ] jest otwarty dla odczytu, natomiast deskryptor FD[ 1 ] jest otwarty dla zapisu. Operacja odczytu przeprowadzona na deskryptorze FD[ 0 ] umoliwia odtworzenie tego co zostao wprowadzone przez operacj zapisu przeprowadzon przy pomocy deskryptora FD[ 1 ]. Strumie UNIXowy jest struktur typu FIFO (first-in, first-out). Funkcja zwraca warto 0 w przypadku poprawnego wykonania. W przypadku bdw zwraca warto -1, wwczas zmienna globalna errno przechowuje kod bdu. Makrodefinicja PIPE_BUF (IBM AIX 3.2):

Pawe opata, Katedra Telekomunikacji AGH

16

Systemy operacyjne - konspekt

header files:

opis: Makrodefinicja PIPE_BUF okrela dopuszczaln liczb bajtw, ktra jest zapisywana do strumienia w sposb niepodzielny. Jeeli do strumienia zostanie wprowadzona liczba bajtw mniejsza bd rwna PIPE_BUF, to jest zagwarantowane, e bajty te nie bd przemieszane z ewentualnymi innymi bajtami wprowadzonymi przez ewentualne inne procesy. W przypadku wprowadzania wikszej liczby bajtw ni PIPE_BUF mog one zosta pofragmentowane i przemieszane z innymi danymi, wprowadzanymi przez inne procesy. Zastosowanie funkcji pipe do komunikacji midzyprocesowej z reguy polega na utworzeniu jednego lub dwch (dla komunikacji dwukierunkowej) strumieni, a nastpnie rozwidlenia procesw potomnych. Kady z procesw potomnych otrzymuje swoje wasne kopie deskryptorw plikw (ale same wskaniki plikw s wspdzielone), tak wic rwnie kopie deskryptorw sucych do zapisu i odczytu ze strumienia. Przyjto, e procesy powinny pozamyka nie uywane deskryptory. Rwnie przed zakoczeniem dziaania procesy powinny pozamyka wszystkie otwarte deskryptory.M a i n i n to d C d o P [ 2 /* deklaracja strumienia od CHILD do PARENT */ ] ; p i p e o( d C d o P ) ; /* utworzenie deskryptorw w tablicy o d C d */ P o /* rozwidlenie procesw */ f o r k ( ) ;

P a r e n t C l o s eo (d C d o P [ 1 ] ) ;

C h i l d C l o s eo (d C d o P [ 0 ] ) ;

zamknicie deskryptora do zapisu w funkcji parent a

zamknicie deskryptora do odczytu w funkcji child a

Schemat tworzenia jednokierunkowego strumienia od procesu childa do procesu parenta. Po utworzeniu strumienia proces childa moe do niego wpisywa dane, a proces parenta odczytywa. Funkcja read (IBM AIX 3.2): prototyp: header files: int read ( int fh, void * bufor, size_t nbytes );

opis: Funkcja read umoliwia odczytywanie danych z pliku bd strumienia, poprzez podany deskryptor. Pierwszy parametr funkcji to wanie deskryptor otwartego strumienia lub pliku, drugi to obszar, do ktrego maj trafi odczytane bajty, a trzeci liczba bajtw do odczytania. W przypadku, gdy liczba bajtw do odczytania jest wiksza ni liczba bajtw znajdujcych si aktualnie w strumieniu, wwczas funkcja moe zablokowa dalsze dziaanie programu, do czasu, a inny proces wprowadzi do strumienia wystarczajc liczb bajtw. Ewentualna blokada dziaania programu jest uzaleniona od ustawionych opcji dla danego deskryptora pliku. Zwracana warto to liczba bajtw rzeczywicie wczytanych ze strumienia, lub warto -1 w przypadku wystpienia bdu. W przypadku bdu zmienna globalna errno przyjmuje warto kodu bdu. Funkcja write (IBM AIX 3.2): prototyp: header files: size_t write ( int fh, const void * bufor, size_t nbytes );

opis: Funkcja write umoliwia wpisanie danych do pliku bd strumienia, poprzez podany deskryptor. Pierwszy parametr funkcji to deskryptor otwartego strumienia lub pliku, drugi to obszar, z ktrego dane maj zosta pobrane, a trzeci to liczba bajtw, ktre maj trafi do strumienia. Jeeli liczba bajtw przekracza warto zdefiniowan przy pomocy makrodefinicji PIPE_BUF, wwczas wprowadzane dane mog zosta pofragmentowane i pomieszane z innymi. Jeeli strumie jest w danej chwili peny wwczas funkcja write moe zosta zablokowana, do czasu, a inny proces odczyta odpowiedni ilo bajtw, co spowoduje zwolnienie miejsca. Zwracana warto to liczba rzeczywicie wprowadzonych do strumienia danych. W przypadku bdu lub niepowodzenia zwracana jest warto -1, a zmienna globalna errno przyjmuje kod bdu operacji.

Pawe opata, Katedra Telekomunikacji AGH

17

Systemy operacyjne - konspekt

Funkcja close (IBM AIX 3.2): prototyp: header files: int close ( int fh );

opis: Funkcja close powoduje zamknicie pliku lub strumienia okrelonego przez podany deskryptor. Jeeli deskryptory wszystkich procesw korzystajcych ze strumienia zostan zamknite, a w strumieniu pozostan nieodczytane dane, to zostan one stracone. W przypadku poprawnego wykonania funkcja zwraca warto 0, w przypadku bdu warto -1 oraz zmienna globalna errno przyjmuje warto kodu bdu.Proces A Proces B

Zapis

Deskryptor pliku #1

PIPE 1 odAdoBnieuywane Deskryptor pliku #0 nieuywane Deskryptor pliku #1 Zapis Odczyt

nieuywane

PIPE 2 odBdoAnieuywane Odczyt Deskryptor pliku #0

Przykad 3 Schemat komunikacji dwukierunkowej przez dwa strumienie (komunikacja nie wymaga zewntrznej synchronizacji) UWAGI:Program #1 do realizacji: 1. Funkcje child(), parent() 2. Tworzenie dwch strumieni jednokierunkowych zgodnie z przykadem 3; np. odAdoB i odBdoA 3. Rozwidlenie procesu 4. W procesie childa zamknicie nieuywanych deskryptorw, wywoanie funkcji child() i zamknicie otwartych deskryptorw 5. W procesie parenta zamknicie nieuywanych deskryptorw, wywoanie funkcji parent() i zamknicie otwartych deskryptorw Program #2 do realizacji: 1. Uzupenienie programu #1 o komunikacj przez pipe w funkcjach child() i parent() - realizacja zamiany duych liter na mae Program #3 do realizacji: 1. Uzupenienie programu #2 o ptl w serwerze i kliencie oraz sterowanie wyjciem z programu (np. po odebraniu specjalnego tekstu).

Pawe opata, Katedra Telekomunikacji AGH

18

Systemy operacyjne - konspekt

7. Kolejki komunikatw - message queueTrzeci mechanizm komunikacyjny ze standardu IPC (InterProcess Communication) w systemie UNIX to kolejki komunikatw. Kolejka komunikatw moe by utworzona przez pewien proces, a nastpnie inne procesy mog wstawia lub pobiera z kolejki rne komunikaty. To co zostanie do kolejki wstawione przez jeden proces moe by odebrane w innych procesach. Funkcje do operacji na kolejkach komunikatw realizuj automatycznie synchronizacj na podstawowym poziomie. Funkcja msgget (IBM AIX 3.2): prototyp: header files: int msgget ( key_t key, int msgFLG ); , ,

opis: Funkcja msgget tworzy w systemie struktur reprezentujc kolejk komunikatw. Funkcja ta zwraca identyfikator pamici dzielonej. Identyfikator takiej struktury jest tworzony, podobnie jak w przypadku zbioru semaforowego lub segmentu pamici dzielonej, na podstawie podanego klucza. Jeeli zostanie podany taki klucz, dla ktrego istnieje ju kolejka komunikatw utworzona przez jaki inny proces, to wwczas funkcja bdzie prbowaa doczy si do tej istniejcej ju kolejki - zwrci jej identyfikator, ale bez tworzenia jej na nowo. Funkcja zawsze bdzie prbowaa utworzy now kolejk wtedy, gdy jako warto parametru key zostanie przekazane IPC_PRIVATE. Jest moliwe okrelenie ustalonego klucza, co spowoduje utworzenie kolejki z ustalonym identyfikatorem. Mona taki klucz ustali przez zrzutowanie pewnej liczby cakowitej na warto typu key_t lub uy np. funkcji ftok. W ten sposb rne programy/procesy mog si docza do tej samej kolejki (nie musz to by procesy zwizane ze sob zalenoci parent-child). Drugi parametr okrela midzy innymi sposb tworzenia kolejki i uprawnienia procesw w zakresie dostpu do kolejki. Jego warto powstaje przez wykonanie logicznej operacji or na poniszych wartociach: IPC_CREAT - utwrz kolejk komunikatw, jeeli jeszcze nie istnieje, lub docz si do istniejcej, IPC_EXCL - powoduje, e funkcja nie bdzie doczaa procesu do kolejki, jeeli ta istnieje, S_IRUSR - umoliwia odczyt danych z kolejki procesowi, ktry j utworzy, S_IWUSR - umoliwia wstawienie komunikatu do kolejki procesowi, ktry j utworzy, S_IRGRP - umoliwia odczyt komunikatw grupie procesw zwizanych z procesem, ktry utworzy kolejk, S_IWGRP - umoliwia zapis danych grupie procesw zwizanych z procesem, ktry utworzy kolejk, S_IROTH - umoliwia odczyt danych innym procesom, S_IWOTH - umoliwia modyfikacj danych innym procesom, W przypadku bdu funkcja zwraca warto -1 i wpisuje kod bdu do globalnej zmiennej errno. Dokadny opis funkcji - polecenie man msgget. Zarwno zbiory semaforowe, segmenty pamici dzielonej jak i kolejki komunikatw nie s automatycznie usuwane po zakoczeniu dziaania procesu, ktry je utworzy. Usunicie kolejki jest realizowane przez funkcj msgctl lub polecenie systemowe ipcrm. Funkcja msgctl (IBM AIX 3.2): prototyp: header files: int msgctl ( int msgID, int command, struct msqid_ds * buffer ); ,

opis: Funkcja msgctl umoliwia realizacj operacji sterujcych na kolejkach komunikatw. Dziki niej mona midzy innymi usun z systemu kolejk komunikatw. Mona rwnie zmienia uprawnienia procesw w zakresie dostpu do kolejki. Parametr msgID okrela identyfikator kolejki komunikatw (zwrcony przez funkcj msgget). Parametr command okrela rodzaj operacji kontrolnej, ktr chcemy wykona na kolejce komunikatw. Ostatni parametr zaley od rodzaju komendy i zawiera niezbdne dane do jej wykonania. Najwaniejsze operacje kontrolne: IPC_STAT - pobiera informacj o statusie kolejki komunikatw i wpisuje j do struktury wskazywanej przez parametr buffer, IPC_RMID - usuwa kolejk komunikatw z systemu i likwiduje struktur danych opisujcych j. Kolejk moe usun proces, ktry j utworzy, albo inny proces, ktry ma do tego uprawnienia. W przypadku bdu funkcja zwraca warto -1 i wpisuje kod bdu do globalnej zmiennej errno. Dokadniejsze informacje - polecenie man msgctl. Funkcja msgsnd (IBM AIX 3.2):

Pawe opata, Katedra Telekomunikacji AGH

19

Systemy operacyjne - konspekt

prototyp: header files:

int msgsnd ( int msgID, void * msgPtr, size_t msgSize, int msgFLG ); ,

opis: Funkcja msgsnd umoliwia wstawienie komunikatu do kolejki. Pierwszy parametr okrela identyfikator kolejki komunikatw, do ktrej wstawiamy dane. Drugi parametr okrela adres, pod ktrym znajduje si struktura (reprezentujca cay komunikat) zawierajca midzy innymi wstawiane dane. Trzeci parametr okrela rozmiar danych w bajtach, ktre przekazujemy do wstawienia (rozmiar pola mtext struktury komunikatu). Czwarty parametr okrela co system ma zrobi, jeeli nie jest w danej chwili moliwe wstawienie komunikatu do kolejki. Aby wstawi dane do kolejki trzeba najpierw utworzy odpowiednio du struktur o cile okrelonej postaci. Struktura ta musi posiada dwa pola: long mtype; char mtext[ ]; waciwe dane, ktre przekazuje si do kolejki powinny by wstawione do pola mtext. Zwracana warto: W przypadku pomylnego wstawienia komunikatu do kolejki, funkcja zwraca warto 0, w przeciwnym przypadku -1, a do zmiennej globalnej errno jest wstawiany kod bdu. Przykad 1 - fragment kodu funkcji wstawiajcej do kolejki napis tekstowytypedef struct { long mtype; char mtext [100]; } komunikat; void wstawNapis( char * napis ) { komunikat kom; strcpy( kom.mtext, napis ); kom.mtype = 1; msgsnd( msgID, & kom, strlen( kom.mtext ) + 1, 0 ); }

Funkcja msgrcv (IBM AIX 3.2): prototyp: header files: int msgrcv ( int msgID, void * Ptr, size_t Size, int Type, int msgFLG ); ,

opis: Funkcja msgrcv umoliwia pobranie komunikatu z kolejki. Pierwszy parametr okrela identyfikator kolejki komunikatw, z ktrej pobieramy komunikat. Drugi parametr okrela adres, pod ktrym znajduje si struktura (reprezentujca cay komunikat), do ktrej ma zosta przekopiowany komunikat (musi ona by wystarczajco dua). Trzeci parametr okrela rozmiar akceptowanych danych w bajtach (rozmiar pola mtext struktury komunikatu) - jeeli komunikat jest wikszy to nastpi jego obcicie. Czwarty parametr okrela typ komunikatu jaki chcemy odebra: jeeli ma on warto zero, to znaczy, e chcemy odebra pierwszy komunikat z kolejki, jeeli ma warto dodatni, to znaczy, e chcemy odebra pierwszy komunikat o dokadnie takim typie jaki podajemy, jeeli ma warto ujemn, to znaczy, e chcemy odebra pierwszy komunikat o typie mniejszym bd rwnym moduowy zadanej wartoci. Ostatni parametr okrela co system ma zrobi, jeeli nie jest w danej chwili moliwe odczytanie z kolejki komunikatu o zadanym typie. Aby odebra dane z kolejki trzeba analogicznie jak w funkcji msgsnd, utworzy odpowiednio du struktur o cile okrelonej postaci (taka sama struktura jak w funkcji msgsnd). Struktura ta musi posiada dwa pola: long mtype; char mtext[ ]; Pole mtext musi mie na tyle duy rozmiar, aby pomieci dane odczytywanego komunikatu. Zwracana warto: W przypadku pomylnego odczytania komunikatu z kolejki, funkcja zwraca warto 0, w przeciwnym przypadku -1, a do zmiennej globalnej errno jest wstawiany kod bdu. Przykad 2 - fragment kodu funkcji odczytujcej z kolejki komunikattypedef struct { long mtype; char mtext [100]; } komunikat; void odczytajKomunikat() { komunikat kom;

Pawe opata, Katedra Telekomunikacji AGH

20

Systemy operacyjne - konspektmsgrcv( msgID, & kom, 100, 1, 0 ); /* maksymalnie 100 bajtw, typ komunikatu 1 */ printf( Odczytaem z kolejki: %s\n, kom.mtext );

}

UWAGI:Program #1 do realizacji: 1. Funkcje child(), parent() 2. Tworzenie kolejki komunikatw 3. Rozwidlenie procesu 4. W procesie childa wywoanie funkcji child() 5. W procesie parenta wywoanie funkcji parent(), a nastpnie usunicie kolejki komunikatw Funkcja parenta powinna realizowa serwer, ktry wykonuje polecenia i odsya odpowiedzi do childa - klienta

Pawe opata, Katedra Telekomunikacji AGH

21


Top Related