159
Sieciowe Systemy Operacyjne INEU 006 Tomasz Surmacz [email protected] c Tomasz Surmacz, Wroclaw, 30 listopada 2015

Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

  • Upload
    lyxuyen

  • View
    224

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

Sieciowe Systemy OperacyjneINEU 006

Tomasz Surmacz

[email protected]

c© Tomasz Surmacz, Wrocław, 30 listopada 2015

Page 2: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

Zagadnienia wstępne

Zagadnienia wstępne

• 30h wykładu w 10 tygodni (środa 17:05-19:35, 23/c3)Kolokwium zaliczeniowe pod koniec (ostatni wykład lub okolice, do ustalenia w ciągu najbliższych 2tygodni)

• 30h laboratorium (L2.1/C-16 – Technopolis, 013/C-3)Ocena na podstawie ćwiczeń wykonywanych podczas zajęć

Konsultacje i formy kontaktu

• Konsultacje: środa 14-16, piątek 12-14, pok. 105/c-3 – https://konsultacje.ict.pwr.wroc.pl/

• e-mail: [email protected], Subject: ”SSO”

• WWW: http://dream.ict.pwr.wroc.pl/sso/

Literatura

• Stevens, W. Richard – Programowanie zastosowań sieciowych w systemie UNIX (Programowanie usługsieciowych, tom 1.)

• Bach, Maurice J. – Budowa systemu operacyjnego UNIX

• Silberschatz, Abraham – Podstawy systemów operacyjnych

• Ben-Ari, M. – Podstawy programowania współbieżnego

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 2

Page 3: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX System UNIX

Program kursu

• Podstawy systemu UNIX

• System plików i prawa dostępu

• Wejście i wyjście w systemie UNIX

• Procesy, kontekst procesu, sterowanie procesami

• Sygnały, grupy procesów

• Strumienie pipe i FIFO

• Kolejki komunikatów

• Semafory, problemy współbieżności

• Pamięć wirtualna, stronicowanie i segmentacja

• Komunikacja sieciowa - model ISO, pakiety, odwzorowanie w funkcjach systemu UNIX

• Funkcje komunikacji za pomocą gniazdek

• Procesy uruchamiane przez inetd

• Komunikacja z użyciem protokołów TCP i UDP

• Serwery i klienci

• Zaawansowane zagadnienia komunikacji sieciowej

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-1

Page 4: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX System UNIX

Podstawy systemu UNIX

System UNIX

Początki – 1970: Ken Thompson, Dennis Ritchie (Bell Laboratories) na maszynie PDP-7, następnie PDP-11/20

• 1973 – pierwsza wersja z jądrem napisanym w C

• 1979 – BSD Unix (University of California, Berkeley)

• 1983 – Unix System V

• 1990 – Unix System V Release 4

• XINU (XINU Is Not UNIX) – system „edukacyjny”

• 1987 – Minix (A. Tanenbaum)

• 1991 – Linux 0.02 (Linus Torvalds)

Brian Kernighan – język C, powstał specjalnie w celu zapewnienia przenośności pisanego oprogramowania

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-2

Page 5: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX System UNIX

Podstawowe cechy systemu

• system wieloużytkownikowy

• system wielozadaniowy (wiele procesów)

• podział czasu

• wywłaszczanie procesów

• podsystem plików

• zarządzanie pamięcią

• biblioteki systemowe

• wszystkie urządzenia dostępne przez pliki specjalne

3 podstawowe wersje: (1988)

• Version 7 (wczesny odłam komercyjny)

• Berkeley – BSD 4.1 vs. BSD 4.2 (BSD4.4) (wersja „akademicka”)

• System V – SysV Rel.3, SysV Rel.2 (SVR4) (wersja komercyjna)

Obecnie: Pochodne BSD lub SysV (lub obu)

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-3

Page 6: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX System UNIX

Podstawowe różnice:

• parametry wykonania komend (np. ps -ef lub ps -aux)

• różne koncepcje dostępu do terminali (strumienie w SysV)

• inna obsługa przerwań systemowych (sygnałów)

• inne umiejscowienie standardowych programów

Standardy:

• ANSI C

• POSIX (Portable Operating System Interface)

• X/Open

• „Jedną z najwspanialszych zalet związanych ze standaryzacją jest to, że obowiązujących standardów jest takwiele, że zawsze znajdzie się taki, który nam odpowiada.”

Licencje:

• Systemy komercyjne: SysV, SCO, Solaris, HPUX, OSF, ...

• FreeBSD, Linux

• FSF & GNU

• Licencja GPL

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-4

Page 7: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Fundamentalne cechy wszystkich systemów UNIX

Fundamentalne cechy wszystkich systemów UNIX

• Mechanizm ochrony bezpieczeństwa rozgraniczający użytkowników i administratora systemu

• Podział na pracę w trybie użytkownika i w trybie jądra systemu(wspomagany mechanizmami ochrony procesora)

• W trybie jądra wykonują się wszystkie funkcje systemowe

• Przejście do trybu jądra realizowane przez przerwania programowe

• System sterowany zdarzeniami (a nie „polling ”) – aplikacje nie tracą czasu, oddając go innym procesom,a same są usypiane, biernie czekając na wystąpienie oczekiwanego zdarzenia

• Wszystkie1 urządzenia, mechanizmy komunikacji wewnętrznej i sieciowej itp. Dostępne są przez plikii deskryptory plików

• System plików umożliwiający kontrolę dostępu do plików i blokowanie prawa do zapisu pomiędzy proce-sami.

• Pamięć wirtualna i system plików stosują te same mechanizmy – pełna integracja.

• Prosty i spójny interfejs zapewniany przez system operacyjny – około 300 funkcji systemowych (MS-Windows – kilkadziesiąt tysięcy)

1prawie

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-5

Page 8: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX System plików

System plików• Separatorem ścieżki jest znak „/”

• Katalog / to „korzeń” (root) systemuplików

• Wszystkie katalogi/dyski są podłączonejako gałęzie drzewa katalogów –zarówno lokalne, jak i zdalne.

• Różne rodzaje systemów plików: UFS,SysV, minix, ext2, MSDOS, NFS

• Komendy związane z plikami: ls, cd,pwd, mkdir, rmdir, cat, mv, cp, rm,mount, umount, df, du, quota

• Pliki: /etc/fstab, /etc/mntab,/etc/exports

• Dziurawe pliki (sparse files – man tar,man rsync)

/

usr bin

local

lib

etcbin

lib

var

spool

bin

log

/dev/dsk/c0t0d1s1

/dev/dsk/c1t2d0s4home

user1user2

cyber:/export/home

/dev/dsk/c0t0d1s0

dev

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-6

Page 9: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Zarządzanie pamięcią

Zarządzanie pamięcią

• Pamięć fizyczna systemu podzielona jest na strony

• Rozmiar strony – z reguły 4-8-32 kB

• Dostęp do stron pamięci realizowany jest przez tablicę deskryptorów pamięci, z pomocą sprzętowychukładów MMU

• Pamięć wirtualna

– Swoboda adresowania– Możliwość zaadresowania większego obszaru pamięci niż dostępny– Stronicowanie pamięci/plik wymiany – dokonywane automatycznie

Podział pamięci w systemie UNIX

• Pamięć jądra systemu

• Bufory dyskowe

• Plik(i) wymiany (swap)

• Pamięć procesów użytkowników

– Kod programu (TEXT)– Dane– Stos– Stos wywołań systemowych

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-7

Page 10: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Biblioteki

Biblioteki

• Język C określa konstrukcje sterujące wykonaniem programu

• Funkcje nie są częścią języka C, lecz bibliotek systemowych lub programów – nawet najbardziej podsta-wowe, jak printf ()

• Funkcje systemowe znajdują się w bibliotekach dynamicznych, takich jak libc.so

• Biblioteki statyczne (np. /usr/lib/libc.a)

– dołączane w całości lub częściowo do kodu kompilowanego programu, w trakcie kompilacji– programy linkowane statycznie są większe, lecz nie wymagają działającego linkera ld

• Biblioteki dynamiczne (np. /usr/lib/libsocket.so.2)

– dołączane dynamicznie do kodu programu w trakcie jego uruchamiania– zajmują region pamięci współdzielony z innymi procesami– mniejsze zapotrzebowanie na pamięć– mniejsze programy– dynamiczny linker – programy ld i ldd

• Zmienna środowiskowa LD LIBRARY PATH

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-8

Page 11: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Biblioteki

Podstawowe biblioteki systemowe:

• libc.so – standardowe funkcje wejścia/wyjścia, zarządzania pamięcią, itp.

• libm.so – funkcje matematyczne

• ld.so – linker dynamiczny

• libsocket.so – funkcje sieciowe (SysV)

• libnsl.so – „name server library” – tłumaczenie nazw komputerów na adresy

• libX11.so – funkcje systemu okienkowego X11

Narzędzia przydatne do tworzenia/badania bibliotek dynamicznych

• ldd

• nm, ar, ranlib

• objdump, readelf

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-9

Page 12: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Użytkownicy

Użytkownicy

• System wielozadaniowy (multitasking)

• System wieloużytkownikowy (multiuser)

• Konieczność ochrony użytkowników przed sobą nawzajem

Atrybuty użytkownika – /etc/passwd:

root:x:0:1:Super-User:/root:/sbin/shts:x:103:10:Tomasz Surmacz:/home/ts:/usr/local/bin/tcshnobody:x:60001:60001:Nobody:/:

• Nazwa użytkownika

• Identyfikator (uid)

• Grupa (nazwa i identyfikator – gid)

• Komentarz (pole „GECOS” – imię/nazwisko, nr telefonu, itp.)

• Hasło dostępu – obecnie przeniesione do /etc/shadow

• Katalog domowy

• Interpreter poleceń (shell)

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-10

Page 13: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Użytkownicy

Dla jądra systemu istotne są:

• uid procesu

• gid procesu

• prawa dostępu do pliku

• uprawnienia specjalne (uid==0)

Polecenia operujące na uid/gid:

• newgrp, su, login, id

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-11

Page 14: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Prawa dostępu

Prawa dostępu

• Każdy plik w systemie ma swojego właściciela i właściciela grupowego

• Każdy plik opisany jest przez 3 grupy praw dostępu:

– dla właściciela (user)– dla grupy (group)– dla pozostałych użytkowników (other)

• Podstawowe prawa dostępu to

– (r)ead – odczyt– (w)rite – pisanie– e(x)ecute – wykonanie

drwxr-x--x 3

ogu

pozostali

grupa

właściciel

111101001

7 5 1

typ (katalog/plik/...)

root wheel

liczba dowiązań

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-12

Page 15: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Prawa dostępu

Przykładowa zawartość katalogu domowego:

drwxr-x--x 44 ts users 2048 Feb 27 16:39 .drwxr-xr-x 47 ts users 3072 Feb 28 00:28 ..-rw------- 1 ts users 3476 May 25 2007 .cshrc-rw-r--r-- 1 ts users 16 Jun 28 2007 .forwarddrwx------ 2 ts mail 1024 Feb 27 03:44 Maildrwxr-xr-x 3 ts users 1024 Jun 2 2007 News-rw-r--r-- 1 ts wheel 4029 Feb 27 03:13 back.tar.gzdrwxr-xr-x 3 ts users 1024 Dec 1 14:31 hgttgdrwxr-xr-x 3 ts users 1024 Feb 27 03:44 ssodrwxr-xr-x 3 ts users 1024 Feb 27 03:19 src

Komendy pozwalające zmieniać prawa dostępu:

• chmod, chgrp

• chown (tylko użytkownik root!)

• umask

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-13

Page 16: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Prawa dostępu

System plików UFS

• Sztywny podział na tablicęi-węzłów i bloki dyskowe

• I-węzeł numer 1 jest zawszekatalogiem głównym systemuplików

• I-węzeł zawiera prawa dostępu,liczbę dowiązań, daty (mtime,ctime, atime) i wskaźnik nanumer bloku zawierającego plik

• Katalog jest plikiem specjalnym,zawierającym nazwy plikówi odpowiadające im numeryi-węzłów

• Tablica i-węzłów w rzeczywistościzajmuje około 0.5-2% pojemnościdysku

• Plik znika z dysku dopiero gdyliczba dowiązań zmaleje do 0

• df -k, df -i

/

1 .

1 ..

2 tmp

blok 23450

70 usr

11 home

3 lib

95 var

ala ma k

ota. ala

ma kota

. ala ma

kota al

a ma kot

a. ala m

a kota.

ala ma k

ota. ala

blok 39834

81 39834

0644 83 21

25.09.2003

f

3 23450 d0755 0 0

13.10.2003

2 33220 d1777 0 0

10.10.2003

1 23450 d0755 0 0

13.09.2003

2 .

1 ..

81 kot-ali

blok 33220

93 plik

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-14

Page 17: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Prawa dostępu

Bity specjalne:

• -rwsr-xr-x – set-user-id

• -rwxr-sr-x – set-group-id

• -rw------T – sticky bit

• drwxr-sr-x – set-group-id

• drwxrwxrwt – sticky bit

• prw-rw-rw- – strumień (named pipe)

• srw-rw-rw- – gniazdo w domenie UNIX (UNIX-domain socket)

• brw-rw---- – urządzenie blokowe (block device)

• crw-rw---- – urządzenie znakowe (character device)

• lrwxrwxrwx – dowiązanie symboliczne (symbolic link)

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-15

Page 18: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Wejście/wyjście

Wejście/wyjście

• standardowe wejście – stdin

• standardowe wyjście – stdout

• wyjście błędów – stderr

• strumień pipe

• przekierowanie we/wy: < > << >> | >& |&

grep cat -n sort -t: +1

/etc/passwd

tee abc

abc

grep :0: < /etc/passwd | cat -n | tee abc | sort -t: +1

• system plików

• katalogi, podkatalogi, pliki

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-16

Page 19: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

1. Podstawy systemu UNIX Środowisko pracy i środowisko programistyczne

Środowisko pracy i środowisko programistyczne

Interpreter poleceń – shell

• /bin/csh

• /bin/sh

• /sbin/sh

• bash

• tcsh

• Inne (zsh, ksh, emacs ;-))

Edytory tekstu

• vi

• emacs

• jed

• joe

Kompilatory

• cc

• gcc

• g++

• Program make wywołujący odpowiednie kompilatory i linker

• Linkowanie – ld lub gcc

• Pliki nagłówkowe: /usr/include, /usr/local/include

• Biblioteki: /usr/lib, /usr/local/lib

Uruchamianie programów

• Debugger systemowy adb (debugowanie i zmiana parametrówjądra działającego systemu)

• Debugger GNU gdb

• Ścieżka wykonania – katalog . (kropka)

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 1-17

Page 20: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

2. Procesy

Procesy

• tworzone funkcją fork()

• unikalny pid

• przodek (rodzic)potomek (dziecko)

• grupa procesów i przewodnik grupy

• przełączanie procesów/przełączaniekontekstu

• tablica procesów

• priorytety

• nice

Stany procesów:

tryb użytk.

tryb jądra.

uśpiony gotowy

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 2-1

Page 21: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

2. Procesy Kontekst procesu

Kontekst procesu

• Każdy proces posiada własne segmenty kodu, danych i stosu.

• Jądro systemu, poprzez system obsługi pamięci wirtualnej, w chwili wykonywania procesu ma dostęp dojednego segmentu kodu, jednego segmentu danych i jednego(∗) segmentu stosu.

• Tablica procesów zawiera wskaźniki do zapamiętanych kontekstów poszczególnych procesów – zawie-rających ich prywatne mapy odwzorowujące wszystkie trzy segmenty programu na segmenty pamięcifizycznej.

CPU

1

2

3

4

5

RAM

CPU

1

2

3

4

5

RAMproces 1

proces 2

proces 1

proces 2

kod

dane

stos

kod

dane

stos

kod

dane

stos

kod

dane

stos

kod

dane

stos

kod

dane

stos

• Przełączenie kontekstu polega na zapamiętaniu aktualnego stanu procesu (odwzorowanie segmentówpamięci, stan procesora) w jego obszarze kontekstu, po czym wczytaniu do procesora kontekstu innegoprocesu.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 2-2

Page 22: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

2. Procesy Sterowanie procesami z powłoki użytkownika

Sterowanie procesami z powłoki użytkownika

• Każdy proces zwraca wartość: 0 – ok, >0 – błąd

• Separator komend: znak ; lub & lub znak nowej linii

• Uruchamianie w tle: proces &

• Łączenie procesów strumieniem: proces1 | proces2

• Warunkowe wykonanie drugiego procesu:

– jeśli pierwszy zakończył się poprawnie: proces1 && proces2– jeśli pierwszy zakończył się błędem: proces1 || proces2

• Przekierowanie wyjścia błędów:

– csh: proces >& plik oraz proces1 |& proces2– sh: proces > plik 2>&1

• Zatrzymanie procesu: stop %nazwa, Klawisz Ctrl-Z, kill -STOP, kill -SUSP

• Zabicie procesu lub wysłanie sygnału: kill, kill -WINCH, kill -HUP, kill -KILL itp.

• Ponowne uruchomienie zatrzymanego procesu: fg

• Ponowne uruchomienie procesu w tle: bg

• Sprawdzenie listy działających procesów: jobs, a także ps

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 2-3

Page 23: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

2. Procesy Tworzenie nowych procesów

Tworzenie nowych procesów

• Do tworzenia nowych procesów służy fynkcja fork() ze standardowej biblioteki libc.so.

• Nowy proces, utworzony funkcją fork() jest dokładną kopią rodzica i wykonuje się w tym samym miejscu– za wywołaniem funkcji fork()

printf("ok\n");

a=7;

p=fork();

if (p==-1)

...

printf("ok\n");

a=7;

p=fork();

if (p==-1)

...

printf("ok\n");

a=7;

p=fork();

if (p==-1)

...

printf("ok\n");

a=7;

p=fork();

if (p==-1)

...

pid=1234

pid=1234 pid=1240

• Oba procesy nie różnią się niczym, poza wartością zwróconą przez funkcję fork():

– rodzic: numer procesu potomnego– dziecko: wartość 0

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 2-4

Page 24: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

2. Procesy Tworzenie nowych procesów

Tworzenie nowych procesów (c.d.)• Sposobem na rozróżnienie obu procesów jest zbadanie wartości

zwracanej przez fork().

pid=fork();switch (pid) case -1: fprintf(stderr, "Błąd fork!\n");

exit(1);

case 0: /* dziecko / child */printf("Tu pisze dziecko. pid rodzica=%d\n", getppid());break;

default: /* rodzic / parent */printf("To drukuje rodzic. pid dziecka=%d\n", pid);

• Inne funkcje: getpid(), getppid(), wait(), kill(), exec()

printf("ok\n");

a=7;

p=fork();

if (p==-1)

...

printf("ok\n");

a=7;

p=fork();

if (p==-1)

...

printf("ok\n");

a=7;

p=fork();

if (p==-1)

...

printf("ok\n");

a=7;

p=fork();

if (p==-1)

...

pid=1234

pid=1234 pid=1240

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 2-5

Page 25: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

2. Procesy Tworzenie nowych procesów

Funkcja fork()• przydziela nowemu procesowi pozycję

w tablicy procesów

• przydziela nowemu procesowi nowy,unikalny identyfikator

• tworzy kopię kontekstu procesumacierzystego, kopiując segmentypamięci lub zwiększając licznikodwołań do segmentu (np.współdzielonego segmentu kodu)

• otwarte pliki rodzica pozostawiaotwarte w dziecku, a więc zwiększaliczniki w tablicy plików i i-węzłów

• przekazuje rodzicowi pid dziecka,a dziecku – wartość 0.

• nowy proces, choć nie był jeszczenigdy wykonywany, „budzi się” tak,jakby zasnął w oczekiwaniu na zasób(wychodzi ze stanu uśpienia)

tryb użytk.

tryb jądra.

uśpiony gotowy

fork()

wywłaszcz.

utworzony

zombie

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 2-6

Page 26: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

2. Procesy Tworzenie nowych procesów

Funkcje exec()

• Rodzina funkcji: execl(), execv(), execle(),execve(), execlp(), execvp()

• nazwa funkcji określa jednocześnie zakresprzekazywanych parametrów do nowegoprogramu (wektor argumentów, zmienneśrodowiskowe) oraz to, czy przeszukiwaćścieżkę (zmienną $PATH)

• 1. argument – rzeczywista ścieżka douruchamianego programu lub skryptu

• 2. argument i dalsze – paramentry wywołania

• Wywołanie nadpisuje w aktualnym kontekścieprocesu segmenty kodu, danych i stosunowym programem i wykonanie funkcjimain()

if ((pid=fork())==0) execl("/bin/ls", "ls", "-la", "/tmp", NULL);printf("Błąd!!! Ta instrukcja nie ma prawa się wykonać!\n");

else wait(NULL);

Nowy program dziedziczy:

• numer procesu i numer procesu rodzi-ca oraz przynależność do grupy proce-sów

• wartość nice

• wartość umask

• priorytet

• uid, gid i przynależność do grup użyt-kowników

• katalog bieżący

• limity zasobów

• otwarte plikia

• kilka innych wartości dotyczących blo-kad na plikach, semaforów i obsługi sy-gnałów (man exec)

aniekoniecznie! – uwaga na fcntl() i FD CLOEXEC

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 2-7

Page 27: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

2. Procesy Sygnały

Sygnały

Pozwalają zasygnalizować wystąpienie sytuacji specjalnej, takiej jak:

• śmierć potomka (przez wywołanie exit() lub w inny sposób)

• wyjątek – np. próba dostępu do pamięci poza przyznany zakres adresów, próba zapisu do pamięci z atry-butem read-only, itp.

• niespodziewany błąd podczas wykonywania programu (np. pisanie do łącza, którego już nikt nie czyta)

• błąd, z którym system nie potrafi sobie poradzić, np. brakpamięci na wykonanie exec() gdy już zostały zwolnione staresegmenty programu

• pobudka, czyli SIGALARM wysyłany na życzenie procesuprzez system

• interakcja z terminalem – klawisz BREAK, SUSPEND, itp.

• wysłanie sygnału przez inny proces

• wykonywanie programu krok po kroku przez debugger

Sygnały są obsługiwane tylko przy przejściu między trybem jądrasystemu a trybem użytkownika

tryb użytk.

tryb jądra.

uśpiony gotowy

fork()

wywłaszcz.

utworzony

zombie

sprawdź

sprawdź i obsłuż

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 2-8

Page 28: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

2. Procesy Sygnały

• Listę dostępnych sygnałów można w każdym systemie sprawdzić pisząc kill -list lub przeglądając plik/usr/include/sys/signal.h lub /usr/include/signum.h

#define SIGHUP 1 /* hangup */#define SIGINT 2 /* interrupt (rubout) */#define SIGQUIT 3 /* quit (ASCII FS) */...#define SIGFPE 8 /* floating point exception */#define SIGKILL 9 /* kill (cannot be caught or ignored) */#define SIGBUS 10 /* bus error */#define SIGSEGV 11 /* segmentation violation */#define SIGSYS 12 /* bad argument to system call */#define SIGPIPE 13 /* write on a pipe with no one to read it */#define SIGALRM 14 /* alarm clock */#define SIGTERM 15 /* software termination signal from kill */#define SIGUSR1 16 /* user defined signal 1 */#define SIGUSR2 17 /* user defined signal 2 */...#define SIGLOST 37 /* resource lost (eg, record-lock lost) */...

• Część sygnałów jest domyślnie ignorowana, część powoduje zakończenie procesu

• Każdy sygnał z wyjątkiem SIGKILL i SIGSTOP można przechwycić, rejestrując odpowiednią funkcję obsługisygnału za pomocą signal() lub sigset()

• Jeśli funkcja przechwytująca ma ignorować sygnał, wystarczy wywołać signal(SIG IGN) lub sigignore()

• Funkcją sigpause(numer sygnału) można zawiesić proces aż do momentu otrzymania żądanego sygnału

• Na czas obsługi sygnału przyjmowanie sygnałów tego samego typu zostaje zablokowane automatycznie (adodatkowo inne sygnały można blokować i odblokowywać wołając sighold() i sigrelse())

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 2-9

Page 29: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

2. Procesy Kończenie procesu

Grupy procesów

• grupę może stanowić np. interpreter poleceń (shell) i wszystkie procesy przez niego uruchamiane –naciśnięcie BREAK itp. wysyła sygnał nie tylko do wykonywanego procesu, ale i do interpretera.

• ustawienie grupy – funkcja setpgrp()

Kończenie procesu

• wait()

• exit()

• Zakończony proces staje się zombie i powoduje wysłanie do rodzica sygnału SIGCLD

• Wywołanie przez rodzica funkcji wait() pozwala odebrać status zwrócony przez exit()

• „uwolniony” zombie ostatecznie znika z systemu

• wywołanie wait(), gdy nie ma żadnego zombie, zawiesza proces, do momentu gdy któreś z dzieci zakończyżywot lub gdy już nie będzie żadnego. (Zawieszenie kończy się także po odebraniu sygnału przez proces).Różne funkcje wait():

pid_t wait (int *status);pid_t waitpid (pid_t pid, int *status, int options);pid_t wait3 (int *status, int options, struct rusage *rusage);pid_t wait4 (pid_t pid, int *status, int options, struct rusage *rusage);

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 2-10

Page 30: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

3. Strumienie pipe i FIFO Strumienie pipe

Strumienie pipe i FIFO

Strumienie pipe• pozwalają łączyć spokrewnione ze

sobą procesy

• transmisja jednokierunkowa

• z reguły łączą wyjście stdout jednegoprocesu z wejściem stdin innego

• tworzone funkcją pipe(int fd[2]) –wypełnia 2-elementową tablicędeskryptorów

• fd[1] jest końcem otwartym dopisania

• fd[0] jest końcem otwartym doczytania

proces 2

jadro systemuj–dro systemu

fd[1] fd[0]

proces 1

• oba końce to „zwykłe” deskryptory plików – można na nich operować takimi funkcjami jak read(), write(),fprintf (), czy close().

• jądro systemu gwarantuje, że operacje zapisu nie przekraczające rozmiaru strumienia są niepodzielne

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 3-1

Page 31: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

3. Strumienie pipe i FIFO Pisanie do strumienia pipe

Pisanie do strumienia pipe

proces 2

jadro systemujądro systemu

fd[1] fd[0]

proces 1

• strumień pipe pełni jednocześnie rolę bufora o pojemności (minimum 4kB)

• zapisanie danych, gdy jest miejsce w strumieniu, powoduje natychmiastowy powrót z funkcji write() itp.

• zapisanie danych powyżej maksymalnego rozmiaru powoduje zablokowanie procesu, do czasu aż zwolnisię miejsce w strumieniu (ktoś te dane przeczyta)

• za pomocą odpowiednich funkcji fcntl() lub ioctl() można ustawić opcję O NDELAY, lecz wówczas procespiszący musi być przygotowany na to, że może mu się udać zapis tylko części wysyłanych danych

• pisanie do strumienia, którego nikt nie czyta (jego drugi koniec został zamknięty) powoduje wysłanie doprocesu piszącego sygnału SIGPIPE

• zamknięcie zapisywanego końca powoduje, że proces czytający w wyniku wywołania funkcji read() otrzy-ma wartość 0

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 3-2

Page 32: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

3. Strumienie pipe i FIFO Czytanie ze strumienia pipe

Czytanie ze strumienia pipe• otrzymywane dane stanowią strumień nie podzielony na

żadne pakiety lub inne fragmenty

• czytanie ze strumienia może zwrócić mniej danych, niżzażądano

• jeśli strumień jest pusty i zamknięty do zapisu, funkcjaread() zwraca wartość 0, oznaczającą EOF.

• jeśli strumień jest pusty, ale otwarty do zapisu, funkcja read()zostaje zablokowana, do momentu gdy można będzie cośprzeczytać

• blokowania można uniknąć stosując opcję O NDELAY wfunkcji fcntl() lub korzystając z funkcji select()

• zamknięcie strumienia do odczytu, gdy ciągle znajdowały sięw nim nie przeczytane dane, generuje sygnał SIGPIPEwysyłany do procesu piszącego

• zamknięcie pustego strumienia danych nie powodujeżadnych konsekwencji dla procesu piszącego – dopóki niespróbuje czegoś zapisać.

• dzięki blokowaniu możliwe jest wykorzystanie strumieni dowzajemnej synchronizacji procesów

proces 2

jadro systemujądro systemu

fd[1] fd[0]

proces 1

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 3-3

Page 33: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

3. Strumienie pipe i FIFO Łączenie dwóch procesów strumieniem pipe

Łączenie dwóch procesów strumieniem pipe

fd[1] fd[0]

proces potomny

jadro systemu

proces

proces

jądro systemu

fd[1] fd[1]

fd[0] fd[0]

fd[1] fd[0]

jądro systemu

int fd[2];if (pipe(fd)==-1) perror("pipe));...

switch (p=fork()) case 0: /*dziecko*/ ... break; default: /*rodzic*/ ...

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 3-4

Page 34: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

3. Strumienie pipe i FIFO Łączenie dwóch procesów strumieniem pipe

Łączenie dwóch procesów strumieniem pipe (c.d.)

proces potomny

jadro systemu

proces

jądro systemu

fd[1]

fd[0]

fd[1] fd[0]

/*rodzic*/

close(fd[0]);write(fd[1], buf, strlen(buf)+1);

/*dziecko*/

close(fd[1]);n=read(fd[0], buf, BUFSIZE);

proces potomny

jadro systemu

proces

jądro systemu

fd[1] fd[1]

fd[0] fd[0]

fd[1] fd[0]

switch (p=fork()) case 0: /*dziecko*/ ... break; default: /*rodzic*/ ...

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 3-5

Page 35: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

3. Strumienie pipe i FIFO Tworzenie strumieni stdout-stdin

Tworzenie strumieni stdout-stdin

• Do kopiowania otwartych deskryptorów służą funkcje dup() i dup2()

• dup(n) kopiuje deskryptor n na najniższy wolny numer deskryptora

• Poniższy program:

int fdes;fdes=open("/tmp/test", "rt");close(0);dup(fdes);

spowoduje przepisanie deskryptora fdes do deskryptora nr 0.

• to samo można osiągnąć za pomocą dup2(fdes, 0)

Jak korzystając z dup() uzyskać efekt taki sam jak w dup2(fdes, 10)?

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 3-6

Page 36: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

3. Strumienie pipe i FIFO Tworzenie strumieni stdout-stdin

Tworzenie strumieni stdout-stdin

Najczęstszym zastosowaniem jest zastąpienie standardowego wejścia (lub wyjścia) strumieniem pipe, przedwykonaniem funkcji exec():

int fd[2];

pipe(fd);if ((f=fork()) == 0) /* dziecko -- będzie czytać */close(fd[1]);close(0);dup(fd[0]);execlp("cat", "cat", "-n", NULL);fprintf(stderr, "exec się nie udał!\n");exit(1);

else /* rodzic lub błąd fork() */...wait();

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 3-7

Page 37: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

3. Strumienie pipe i FIFO Funkcja popen()

Funkcja popen()

Podobny efekt można osiągnąć za pomocą funkcji popen():

#include <stdio.h>FILE *popen(const char *command, const char *mode);int pclose(FILE *stream);

• popen() tworzy strumień pipe oraz proces potomny, w którym wykonuje /bin/sh, przekazując mu jakoparamentr nazwę programu do wykonania

• jeśli *type==’r’, to standardowe wyjście uruchomionego podprocesu jest połączone ze strumieniem, aproces główny może czytać ze zwróconego deskryptora

• jeśli *type==’w’, zwrócony koniec jest otwarty do zapisu i połączony ze standardowym wejściem urucho-mionego podprocesu

• zakończenie komunikacji może wymagać użycia pclose(), konieczna też jest synchronizacja za pomocąwait().

Wady stosowania popen():

• za każdym razem niepotrzebnie uruchamiany jest /bin/sh;

• brak pełnej kontroli nad wejściem i wyjściem z podprocesu;

• nie jest możliwe jednoczesne przechwycenie wejścia i wyjścia ani rozdzielenie std. wyjścia od wyjściabłędów;

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 3-8

Page 38: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

3. Strumienie pipe i FIFO Funkcja popen()

• funkcja popen() NIGDY i pod żadnym pozorem nie powinna być stosowana w programach typu set-user-id(zbyt łatwo przeoczyć złe dane przekazywane do interpretera sh).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 3-9

Page 39: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

3. Strumienie pipe i FIFO Strumienie FIFO

Strumienie FIFO

Zasadnicze różnice w stosunku do strumieni pipe:

• Posiadają dowiązanie w systemie plików – tworzone funkcją mkfifo()/mknod() lub komendą mknod.

• Mogą być używane przez procesy nie spokrewnione ze sobą, a nawet procesy różnych użytkowników.

• Funkcja open() używana do otwierania kolejki FIFO do zapisu blokuje proces, aż do momentu otwarciakolejki do odczytu, i odwrotnie. Dopiero gdy kolejka otwarta jest jednocześnie do zapisu i odczytu obiefunkcje open() powracają ze stanu uśpienia;

• „Sprzątanie” tymczasowych kolejek może wymagać usunięcia ich z systemu plików funkcją unlink().

• Kolejki FIFO mają z reguły większy rozmiar bufora (4–16 kB)

Podobieństwa:

• Zamknięcie końca używanego do pisania (dokładniej: wszystkich końców) generuje u czytelników EOF;

• Zamknięcie końca używanego do czytania generuje sygnał SIGPIPE wysyłany do wszystkich piszących dostrumienia;

• Zapis i odczyt przez standardowe funkcje I/O, takie jak write() czy read();

• Niepodzielność zapisów mniejszych niż rozmiar strumienia;

• Blokowanie procesów w przypadku przepełnienia lub pustego strumienia (i możliwość zastosowaniaO NDELAY).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 3-10

Page 40: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

3. Strumienie pipe i FIFO Korzystanie ze strumieni FIFO

Korzystanie ze strumieni FIFO

#include <stdio.h>#include <errno.h>

main() int fd;int err;

err=mknod("/tmp/fifo1", S_IFIFO | 0660, 0)if (err<0 && errno!=EEXIST) fprintf(stderr, "Nie mogę utworzyć FIFO\n");exit (1);

fd=open("/tmp/fifo1, O_RDONLY); /* blokada? */if (fd<0) fprintf(stderr, "Nie mogę otworzyć FIFO do czytania\n");exit(2);

read(fd, ... ...);...close(fd);unlink("/tmp/fifo1");

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 3-1

Page 41: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

4. Kolejki komunikatów

Kolejki komunikatów

• lista (jednokierunkowa) zawierająca komunikaty o określonym maksymalnym rozmiarze;

• nowe komunikaty dodawane są na końcu listy, zachowując kolejność ich wysyłania

• każdy komunikat ma dodatkowy parametr zwany typem, co pozwala na obsługę kilku „strumieni” komu-nikatów w ramach jednej kolejki (poprzez selektywne odbieranie komunikatów wybranego typu).

msgsnd()

msgrcv()

kolejka

komunikatów(w przestrzeni

jądra systemu)

5

5

3

2

2

2

15

3

7

2

3

3

2

7

2

2

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 4-2

Page 42: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

4. Kolejki komunikatów Struktura kolejki w jądrze systemu

Struktura kolejki w jądrze systemu

• cuid i cgid – proces, który utworzyłkolejkę (creator uid, creator gid);

• uid i gid – aktualny właścicieli właściciel grupowy kolejki;

• mode – prawa dostępu do kolejki;

• key – klucz identyfikujący kolejkę;

• first, last – wskaźniki na pierwszyi ostatni komunikat w kolejce;

• wielkość całej kolejki nie możeprzekraczać msg qbytes, a aktualnawielkość to msg cbytes;

• aktualna liczba komunikatóww kolejce to msg qnum.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 4-3

Page 43: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

4. Kolejki komunikatów Tworzenie kolejek

Tworzenie kolejek

int msgget(key t key, int msgflg);

Funkcja msgget() tworzy nową kolejkę lub znajduje już istniejącą

• Jeśli klucz ma wartość IPC PRIVATE, zawsze jest tworzona nowa kolejka.

• Jeśli kolejka o podanym kluczu już istnieje, zostaje zwrócony jej identyfikator, o ile użytkownik ma odpo-wiednie prawa dostępu, w przeciwnym razie zwracany jest (poprzez zmienną errno) błąd ENOENT;

• Jeśli kolejka nie istnieje a wśród opcji msgflg ustawiona była IPC CREAT, zostaje utworzona nowa kolejkai zwrócony jej identyfikator;• Użycie opcji IPC EXCL wymusza

utworzenie nowej kolejki – jeżeli byłyustawione obie opcje: IPC CREATi IPC EXCL, a kolejka już istniała,zostaje zwrócony błąd EEXIST.

Jeśli tworzona jest nowa kolejka,najmłodsze 9 bitów w opcjach oznaczaprawa dostępu do tworzonej kolejki, np.0644 albo 0666.

#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>

#define KEY ((key_t) 12345L)#define PERM 0600

main()int msqid;

if ( (msqid=msgget(KEY, PERM | IPC_CREAT)) < 0) fprintf(stderr, "Nie można utworzyć kolejki\n");exit (1);

...

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 4-4

Page 44: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

4. Kolejki komunikatów Usuwanie kolejek

Usuwanie kolejek

int msgctl(int msqid, int cmd, struct msqid ds *buf);

Funkcja msgctl() pozwala usunąć kolejkę, ale także sprawdzić jej stan lub zmienić pewne wartości związanez kolejką. Sposób działania zależy od parametru cmd:

• IPC STAT – umieszcza dane o kolejce w strukturze wskazywanej przez buf;

• IPC SET – zmienia parametry kolejki na parametry przekazane w strukturze wskazywanej przez buf.Zmienione mogą zostać: właściciel i grupa (o ile wołający proces ma uid=0 lub taki sam, jak proces, któryutworzył kolejkę), prawa dostępu do kolejki i maksymalny rozmiar kolejki;

• IPC RMID – usuwa kolejkę z systemu.

Polecenia systemowe związane z kolejkami komunikatów:

• ipcrm – usuwa kolejkę

• ipcs -q – sprawdza status kolejki

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 4-5

Page 45: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

4. Kolejki komunikatów Wysyłanie komunikatów

Wysyłanie komunikatów

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

struct mymsg /* przykładowa struktura komunikatu */long mtype; /* typ komunikatu */char mtext[1]; /* zawartość komunikatu */

• Wysyłając komunikat należy określić jego długość i adres początku;

• msgflg może mieć ustawiony bit IPC NOWAIT, oznaczający, że funkcja nie będzie blokowana, jeśli komuni-katu nie można wysłać natychmiast;

• Wysyłany komunikat musi mieć określony typ – liczba dodatnia na samym początku struktury przecho-wującej komunikat;

• Struktura zawierająca komunikat może być dowolna, ale pierwsze pole musi być liczbą typu long, zawie-rającą typ komunikatu.

struct komunikat long type;int x;int y;char opis[30];

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 4-6

Page 46: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

4. Kolejki komunikatów Wysyłanie komunikatów

Wysyłanie komunikatów – przykład

#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>

#define KEY ((key_t) 12345L)#define PERM 0600

struct komunikat long type;int x;int y;char opis[30];

main()int mq;int res;

struct komunikat msg=12, 1, 2, "abc");

mq=msgget(KEY, IPC_CREAT | 0644);if (mq==-1) .... /* błąd utworzenia kolejki */

res=msgsnd(mq, &msg, sizeof(msg)-sizeof(long int), 0);

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 4-7

Page 47: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

4. Kolejki komunikatów Odbieranie komunikatów

Odbieranie komunikatów

int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

Wartość msgtyp określa jakie komunikaty mogą zostać odebrane:

• 0 – pierwszy komunikat z kolejki, dowolnego typu;

• > 0 – pierwszy komunikat o podanym typie;

• < 0 – spośród komunikatów, których typ jest mniejszy lub równy wartości bezwzględnej msgtyp, wybieranyjest komunikat o najniższym typie (a jeśli jest ich kilka – pierwszy z nich).

Wartość msgflg określa sposób zachowania funkcji:

• jeśli ustawiony jest znacznik IPC NOWAIT, a w kolejce nie ma żądanego komunikatu, funkcja wróci natych-miast, zwracając wartość -1 i ustawiając zmienną errno na ENOMSG;

• jeśli IPC NOWAIT nie jest ustawiony, a w kolejce brak żądanego komunikatu, funkcja usypia proces, doczasu gdy:

– zostanie wysłany odpowiedni komunikat;– kolejka zostanie usunięta z systemu (błąd EIDRM);– zostanie odebrany sygnał, który nie jest ignorowany. Komunikat nie jest pobierany z kolejki a funkcja

msgrcv() zwraca błąd EINTR lub jest automatycznie restartowana (sigaction(), parametr SA RESTART).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 4-8

Page 48: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

4. Kolejki komunikatów Odbieranie komunikatów

• jeśli ustawiony jest znacznik MSG NOERROR, funkcja nie będzie sygnalizować błędu, jeśli odbierany komuni-kat jest większy niż długość przekazanego bufora, przycinając go do żądanego rozmiaru. W przeciwnymrazie komunikat nie zostanie odebrany a zmienna errno zostanie ustawiona na E2BIG.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 4-9

Page 49: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

4. Kolejki komunikatów Selektywne przesyłanie komunikatów

Selektywne przesyłanie komunikatów

kolejkakomunikatów

2

3

2

2

2

15

3

7

2

3

3

2

7

klient 1 klient 2 klient 3

serwer

2 7 2 3 2 15

2

3

7

15

• klienci przesyłają komunikaty do serwera oznaczając je typem 2 (lub np. 1 dla danych o wyższym priory-tecie, 2 – normalnym);

• serwer odbiera wyłącznie komunikaty o typie 2 (lub 1–2), a wysyła komunikaty innych typów;

• każdy klient ma osobny numer dla komunikatów, które odbiera (np. swój numer procesu).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 4-10

Page 50: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Sekcja krytyczna

Semafory

Sekcja krytyczna

Dwa procesy niezależnie modyfikująwspólną zmienną „a”, jeden po drugim

a == 500

int a,b;

b=a;

b+=100;

a=b;

500

600 int a,c;

c=a;

c+=300;

a=c;

900

600a == 600

a == 900

a == 500

int a,c;

c=a;

c+=300;

a=b;

500

600

int a,b;

b=a;

800

500

a == 800

a == 600

b+=100;

a=b;

Dwa procesy niezależnie modyfikująwspólną zmienną „a”, lecz system ope-racyjny powoduje chwilowe wstrzyma-nie pierwszego procesu w trakcie wy-konywania tej operacji.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-1

Page 51: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Sekcja krytyczna

• Od momentu pobrania wartości zmiennej „a” do momentu jej odesłania żaden inny proces nie powinienmieć do niej dostępu

• Fragment programu potrzebujący wyłączności działania nazwiemy sekcją krytyczną.

int a,b;

b=a;

b+=100;

a=b;

int a,c;

c=a;

c+=300;

a=c;

Rozwiązanie?

static int wolny=1; /* semafor */

Zajmij(int *wolny) Zwolnij(int *wolny) main() while (*wolny<=0) *wolny++; int a, b;sleep(1); Zajmij(&sem); // Dlaczego*wolny--; b=a; // to nie b+=100; // działa ?

a=b;Zwolnij(&sem);

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-2

Page 52: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Sekcja krytyczna

To będzie działać, jeśli operacje Zajmij() i Zwolnij() będą niepodzielne.

int a,b;

Zajmij(s);

int a,c;

Zajmij(s);

Zwolnij(s);

Zwolnij(s);

c=a;c+=300;a=c;

b=a;

b+=100;a=b;

• Operacja Zajmij() jest wejściem do sekcji krytycznej – usypia proces, jeśli zasóbjuż jest zajęty, aż do momentu, gdy inny proces go zwolni. Proces zostajeumieszczony w kolejce procesów oczekujących na zwolnienie zasobu (semafora);

• Operacja Zwolnij() stanowi wyjście z sekcji krytycznej – nigdy nie usypia procesu,za to może spowodować obudzenie innego (przeniesienie go z kolejkioczekujących).

• Obie operacje są niepodzielne (atomowe) i działają na poziomie jądra systemu.

tryb użytk.

tryb jądra.

uśpiony gotowy

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-3

Page 53: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Sekcja krytyczna

Semafor możemy traktować jak abstrakcyjny typ danych składający się ze zmiennej i kolejki procesów:

• Zajmij(S)Jeśli S > 0, to S Î S − 1 i idź dalej.Jeśli S = 0, to umieść proces w kolejce oczekujących na zwolnienie semafora i zaśnij.

• Zwolnij(S)Jeśli kolejka oczekujących jest pusta, to S Î S + 1:Jeśli ktoś czeka, to usuń go z kolejki oczekujących i obudź go, nie zmieniając wartości S.

Semafor binarny – przyjmujący jedynie wartości 0 i 1.

Semafor ogólny – przymujące dowolne (lub wybrane) wartości nieujemne

• Bieżąca wartość semafora odpowiada liczbie „wolnych” zasobów;

• Osiągnięcie wartości 0 oznacza, że kolejny proces żądający zasobu zostanie uśpiony;

• Możliwe jest zmniejszenie lub zwiększenie wartości semafora o wartość inną niż 1 (o ile zmniejszenie niedoprowadziłoby do osiągnięcia wartości ujemnej).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-4

Page 54: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Sekcja krytyczna

Inne przykłady wymagające ochrony dostępu do sekcji krytycznej:

• modyfikacja wspólnej zmiennej w pamięci lub pliku (konto bankowe?);

• zapis pliku przez kilka procesów;

• modyfikacja rekordu w bazie danych;

• dostęp do urządzeń zewnętrznych (terminale, modemy, itp.);

Inne przykłady synchronizacji za pomocą semaforów:

• Producent-konsument

– jeden proces „produkuje” dane i sygnalizuje to zwalniając semafor:– drugi „konsumuje” je, oczekując na nie przez zajęcie semafora.

• Synchronizacja kilku procesów w oczekiwaniu na jedno wspólne wydarzenie

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-5

Page 55: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Problem pięciu filozofów

Problem pięciu filozofów

• Życie filozofa to medytacje, ale to wyczerpującezajęcie, więc filozof czasami robi się głodny;

• Głodny filozof udaje się do jadalni i zajmujemiejsce przy stole;

• Filozof je tylko wtedy, gdy ma dwa widelce;

• Dwóch filozofów nie może jednocześnie trzymaćtego samego widelca;

• Najedzony filozof wychodzi z jadalni i wracamedytować.

Problemy:

• Żaden filozof nie powinien zostać zagłodzony.

• Nie można dopuścić do blokady.

• Problem higieny pomijamy, jako nie wnoszącynic do rozwiązania.

1

2

3

4

5

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-6

Page 56: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Tworzenie semaforów

Tworzenie semaforów

int semget(key t key, int n sems, int semflg);

Funkcja semget() tworzy nowy zbiór semaforów lub znajduje już istniejący:

• Jeśli klucz ma wartość IPC PRIVATE, zawsze jest tworzony nowy zbiór semaforów;

• Jeśli semafor o podanym kluczu już istnieje, zostaje zwrócony jego identyfikator, o ile użytkownik maodpowiednie prawa dostępu do niego, w przeciwnym razie zwracany jest (poprzez zmienną errno) błądENOENT;

• Jeśli semafor nie istnieje, a wśród opcji semflg ustawiona była IPC CREAT, zostaje utworzony nowy semafori zwrócony jego identyfikator;

• Użycie opcji IPC EXCL wymuszautworzenie nowego semafora – jeżelibyły ustawione obie opcje: IPC CREATi IPC EXCL, a semafor już istniał,zostaje zwrócony błąd EEXIST.

Jeśli tworzony jest nowy semafor,najmłodsze 9 bitów w opcjach oznaczaprawa dostępu do tworzonego semafora,np. 0644 albo 0666.

#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>

#define KEY ((key_t) 12345L)#define PERM 0600

main()int semid;if ( (semid=semget(KEY, 1, PERM | IPC_CREAT)) < 0) fprintf(stderr, "Nie można utworzyć semafora\n");exit (1);

...

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-7

Page 57: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Usuwanie semaforów

Usuwanie semaforów

int semctl(int semid, int semnum, int cmd, union semun arg);

union semun int val;struct semid_ds *buf;ushort_t *array; arg ;

Funkcja semctl() pozwala usunąć semafor, ale także wykonać na nim różne operacje. Sposób działania zależyod parametru cmd, a parametr semnum określa numer semafora w grupie, którego dotyczy operacja (przypierwszych 3 operacjach, dotyczących całej grupy, ten parametr jest nieistotny):

• IPC STAT – umieszcza dane o semaforze (właściciel, prawa dostępu, itp.) w strukturze wskazywanej przezbuf;

• IPC SET – zmienia parametry grupy semaforów na parametry przekazane w strukturze wskazywanej przezbuf. Zmienione mogą zostać: właściciel i grupa (o ile wołający proces ma uid=0 lub taki sam, jak proces,który utworzył semafor) i prawa dostępu do semafora.

• IPC RMID – usuwa grupę semaforów z systemu.

• GETVAL – pobiera i zwraca wartość semafora semnum;

• SETVAL – ustawia wartość semafora semnum na wartość val unii semun przekazanej jako argument arg;

Polecenia systemowe związane z semaforami:

• ipcrm – usuwa semafor (grupę semaforów) z systemu; ipcs -s – sprawdza status semafora.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-8

Page 58: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Zajmowanie i zwalnianie semaforów

Zajmowanie i zwalnianie semaforów

int semop(int semid, struct sembuf *sops, size_t nsops);

struct sembuf short sem_num; /* numer semafora */short sem_op; /* operacja na semaforze */short sem_flg; /* opcje */

Ogólnie:

• sem op < 0 – zajęcie semafora

• sem op > 0 – zwolnienie semafora

• sem op == 0 – synchronizacja z semaforem (oczekiwanie, aż jego wartość osiągnie 0)

Opcje sem flg:

• IPC NOWAITJeżeli nie można wykonać żądanej operacji, proces nie zostaje uśpiony, lecz funkcja wraca z błędem EAGAIN

• SEM UNDOJeżeli semafor zostaje przydzielony, liczba, o jaką została zmniejszona jego wartość, zostaje dodana dozmiennej semadj procesu (a przy zwalnianiu semafora – odjęta od tej zmiennej).Jeśli proces zostaje zakończony z niezerową wartością semadj (np. po otrzymaniu sygnału itp.), funkcjaexit() spowoduje dodanie tej zmiennej do wartości semafora (czyli zwolnienie zajętych zasobów).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-9

Page 59: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Zajęcie semafora

Zajęcie semafora

struct sembuf op_zajm=0, /* semafor nr 0 */-1, /* zajmij == odejmij wartość |N| (tutaj: 1) */0 /* opcje */

;int semid;

semid=semget(IPC_PRIVATE, 1, IPC_CREAT);if (semid==-1)... (błąd) ...

semop(semid, &op_zajm, 1);/* sekcja krytyczna */

Algorytm zajmowania semafora (N < 0):

• jeśli wartość semafora jest większa lub równa wartości bezwzględnej N , to zmniejsz ją o tyle (a jeśli użytoopcji SEM UNDO, to dodatkowo zwiększ o |N| zmienną semadj).

• jeśli nie, i nie została użyta opcja IPC NOWAIT, zwiększ licznik procesów oczekujących na semafor i zawieśproces, aż do czasu, gdy nastąpi jedno ze zdarzeń:

– zostanie spełniony ten warunek. Wówczas wartość semafora jest pomniejszana o |N| (i ew. zwiększanao |N| wartość semadj), zmniejszany jest licznik procesów oczekujących, a proces zostaje obudzony.

– semafor zostanie usunięty z systemu;– proces otrzyma sygnał (funkcja zwróci błąd EINTR lub zostanie automatycznie wznowiona).

• jeśli nie było możliwe zajęcie semafora, ale użyto opcji IPC NOWAIT, wróć natychmiast z błędem EAGAIN.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-10

Page 60: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Zwolnienie semafora

Zwolnienie semafora

struct sembuf op_tab[2]=0, /* semafor nr 0 */-1, /* zajmij == odejmij wartość |N| (tutaj: 1) */0 /* opcje */

, 0, /* semafor nr 0 */1, /* zwolnij == dodaj wartość |N| (tutaj: 1) */0 /* opcje */

;int semid;

semid=semget(IPC_PRIVATE, 1, IPC_CREAT);if (semid==-1)... (błąd) ...

semop(semid, op_tab, 1);/* sekcja krytyczna *//* ... */

semop(semid, &(op_tab[1]), 1);

Algorytm zwalniania semafora przez system operacyjny (N > 0):

• wartość semafora zostaje zwiększona o N ,

• jeśli ustawiona jest opcja SEM UNDO, wartość ta jest również odejmowana od zmiennej semadj procesuzwiązanej z tym semaforem,

• jeśli licznik procesów oczekujących na semafor ma wartość większą od zera, zostaje obudzony pierwszyproces z kolejki.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-11

Page 61: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

5. Semafory Oczekiwanie na zajęcie semafora przez inny proces

Oczekiwanie na zajęcie semafora przez inny proces

Jeśli wartość N jest równa 0, proces oczekuje aż semafor zostanie zajęty przez inny proces:

• jeśli wartość semafora wynosi 0, funkcja semop() wraca natychmiast;

• jeśli wartość semafora jest większa od 0, ale użyto opcji IPC NOWAIT, funkcja natychmiast wraca z błędemEAGAIN;

• jeśli wartość semafora jest większa od 0 i nie użyto opcji IPC NOWAIT, zostaje zwiększona wartość semzcntsemafora, a proces zostaje uśpiony, do czasu, gdy:

– wartość semafora (semval) osiągnie zero;– semafor zostanie usunięty z systemu;– proces otrzyma sygnał, który ma zostać przechwycony. Wówczas wartość semzcnt jest zmniejszana

i wołana procedura obsługi sygnału zarejestrowana wcześniej wywołaniem funkcji signal().

Zastosowania dla tego typu postępowania:

• Rozwiązanie problemu wyścigu podczas inicjowania wartości semafora.

• Synchronizacja z procesem żądającym dostępu do zasobu (jednoczesna operacja typu „czekaj, aż osiągnie0, a gdy się to stanie, zwolnij”).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 5-12

Page 62: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna Stronicowanie pamięci

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-1

Page 63: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna Stronicowanie pamięci

Pamięć wspólna

Stronicowanie pamięci

• Adresy wkompilowane w programy niemogą być adresami pamięci fizycznej, bo niebyłoby możliwe współbieżne wykonywaniekilku procesów.

• Kompilatory generują kod operujący wwirtualnej przestrzeni adresowej(ograniczonej z góry, np. do 4GB),a tłumaczenia adresów wirtualnych narzeczywiste dokonuje jednostka MMUprocesora.

• System może wykonywać kilka kopii tegosamego programu, operującego tymisamymi adresami pamięci wirtualnej, więctłumaczenie adresów wirtualnych nafizyczne jest ściśle związane z kontekstemprocesu.

• Pamięć wirtualna uzyskiwana jest przezsegmentację i stronicowanie. Jednostkowymobszarem pamięci jest strona, zwyklewielkości od 8 do 32 kB (stały rozmiarzależny od systemu).

20 bit 12 bit

0 0 1 A 7 3 F 0

8F345000 RWX

nr strony offset

tablica stron

8CF04000 R--

81212000 R--

8DD22000 R-X

... RWX

8CF1A000 RW-

8CF1B000 RW-

1A7

8CF1A000

8CF1B000

8CF19000

3F0

8C000000

pamięć fizyczna

obszar

procesu

stronapam

ięci

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-2

Page 64: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna Segmentacja pamięci

Segmentacja pamięci

W rzeczywistości dostęp do pamięci jest trochę bardziej skomplikowany. Dostęp do pamięci fizycznej odbywasię w pierwszym rzędzie poprzez segmenty (danych, kodu, stosu), a dopiero potem – strony:

20 bit 12 bit

1 A 7 3 F 0

segment i nr strony offset

tablica stron

8CF04000 R--

... ...

8CF1A000 RW-

8CF1B000 RW-

8CF1A000

8CF1B000

8CF19000

3F0

8C000000

pamięć fizyczna

obszar

procesu

tablica segmentów

8F345000 RWX

81212000 R--

8DD22000 R-X

... ...

8CF1B000 R-X

8FAA5000 RW-

8FAA6000 RW-

... ...

8FAD1000 RW-

0 0

kod

dane

stos

kod

dane

stos

• Każdy segment posiada własną tablicę stron (adres tablicy i jej długość);

• segment reprezentuje ciągły obszar pamięci;

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-3

Page 65: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna Segmentacja pamięci

• przy każdym dostępie do pamięci starsza część adresu wyznacza używany segment, a jednocześnie jestporównywana z jego wielkością, w celu wykrycia dostępu poza przydzielony segment;

• starsza część adresu wyznacza indeks w tablicy stron segmentu i pozwala odczytać adres strony pamięcifizycznej;

• ostateczny adres powstaje przez zsumowanie adresu strony i offsetu.

20 bit 12 bit

1 A 7 3 F 0

segment i nr strony offset

tablica stron

8CF04000 R--

... ...

8CF1A000 RW-

8CF1B000 RW-

8CF1A000

8CF1B000

8CF19000

3F0

8C000000

pamięć fizyczna

obszar

procesu

tablica segmentów

8F345000 RWX

81212000 R--

8DD22000 R-X

... ...

8CF1B000 R-X

8FAA5000 RW-

8FAA6000 RW-

... ...

8FAD1000 RW-

0 0

kod

dane

stos

kod

dane

stos

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-4

Page 66: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna Tworzenie segmentu pamięci wspólnej

Tworzenie segmentu pamięci wspólnej

int shmget(key t key, int size, int shmflg);

Funkcja shmget() tworzy nowy segment pamięci wspólnej lub znajduje już istniejący:

• Jeśli klucz ma wartość IPC PRIVATE, tworzony jest nowy segment;

• Jeśli segment o podanym kluczu już istnieje, zostaje zwrócony jego identyfikator, o ile użytkownik maodpowiednie prawa dostępu do niego, w przeciwnym razie zwracany jest (poprzez zmienną errno) błądENOENT;

• Jeśli segment pamięci wspólnej nieistnieje, a wśród opcji shmflg ustawionabyła IPC CREAT, zostaje utworzony nowyblok pamięci i zwrócony jegoidentyfikator;

• Użycie opcji IPC EXCL wymuszautworzenie nowego segmentu pamięci –jeżeli były ustawione obie opcje:IPC CREAT i IPC EXCL, a segment jużistniał, zostaje zwrócony błąd EEXIST.

Jeśli tworzony jest nowy segment pamięci,najmłodsze 9 bitów w opcjach oznacza prawadostępu do tworzonego bloku pamięci, np.0644 albo 0666.

#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#define KEY ((key_t) 12345L)#define PERM 0600#define SIZE 4096

main()int shmid;

if ( (shmid=shmget(KEY, SIZE, PERM | IPC_CREAT)) < 0) fprintf(stderr, "Nie można utworzyć bloku pamięci wspólnej\n");exit (1);

...

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-5

Page 67: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna Usuwanie pamięci wspólnej

Usuwanie pamięci wspólnej

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

Funkcja shmctl() pozwala usunąć segment pamięci wspólnej, ale także wykonać na nim różne operacje. Sposóbdziałania zależy od parametru cmd:

• IPC STAT – umieszcza dane o bloku pamięci (takie jak właściciel, prawa dostępu, itp.) w strukturze wska-zywanej przez buf;

• IPC SET – zmienia parametry segmentu pamięci wspólnej na parametry przekazane w strukturze wska-zywanej przez buf. Zmienione mogą zostać: właściciel i grupa (o ile wołający proces ma uid==0 lub takisam, jak proces, który utworzył segment pamięci wspólnej) i prawa dostępu do segmentu.

• IPC RMID – usuwa segment pamięci wspólnej z systemu.

• SHM LOCK – zablokowanie w pamięci segmentu pamięci wspólnej (operacja może być wykonana wyłącznieprzez użytkownika posiadającego euid==0);

• SHM UNLOCK – odblokowanie segmentu.

Polecenia systemowe związane z pamięcią wspólną:

• ipcrm – usuwa segment pamięci wspólnej z systemu;

• ipcs -m – sprawdza status pamięci wspólnej w systemie.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-6

Page 68: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna Korzystanie z pamięci wspólnej

Korzystanie z pamięci wspólnej

Zanim proces będzie mógł odczytać coś z pamięci wspólnej lub do niej zapisać, musi zażądać od systemudołączenia segmentu pamięci wspólnej do własnej przestrzeni adresowej (widząc jakby przez „okienko” swojejpamięci segment pamięci wspólnej). Po zakończeniu korzystania z pamięci wspólnej, proces powinien odłączyćją od swojej przestrzeni adresowej. Służą do tego odpowiednio funkcje shmat() i shmdt().

void *shmat(int shmid, const void *shmaddr, int shmflg);int shmdt(const void *shmaddr);

Funkcja shmat() zwraca adres przyłączonego segmentu. Adres ten zależy od użytych parametrów shmaddr ishmflg:

• Jeśli shmaddr==NULL (czyli (void*)0), to przydzielany jest pierwszy wolny adres znaleziony przez system;

• Jeśli shmaddr jest niezerowy, wówczas system podłącza segment pamięci wspólnej pod podanym adresem,chyba że została użyta także opcja SHM RND, wówczas adres zostaje wyrównany w dół, do najbliższegoadresu podzielnego przez SHMLBA.

• Użycie opcji SHM RDONLY powoduje podłączenie pamięci w trybie wyłącznie do odczytu, w przeciwnymrazie dostęp jest do czytania i pisania.

Funkcja shmdt() odłącza od przestrzeni adresowej procesu segment pamięci wspólnej wskazywany przezshmaddr.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-7

Page 69: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna Pamięć wspólna widziana przez 2 procesy

Pamięć wspólna widziana przez 2 procesy

8CF1A000 RW-

20 bit 12 bit

0 0 1 A 7 3 F 0

8F345000 RWX

nr strony offset

tablica stron

8CF04000 R--

81212000 R--

8DD22000 R-X

... ...

8CF1A000 RW-

8CF1B000 RW-

1A7

8C000000

pamiξ fizyczna

20 bit 12 bit

0 0 1 0 E 3 F 0

8F355000 R-X

nr strony offset

tablica stron

... ...

8DC10000 RW-

8CFD4000 RW-

8CFBB000 R--

8CFA0000 R--

10E

proces 1

proces 2

8CF1A000

8CF1B000

8CF19000

3F0

8CF18000

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-8

Page 70: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna Pamięć wirtualna

Pamięć wirtualna

W rzeczywistości dostęp do pamięcijest trochę bardziej skomplikowany.(Deja Vu – to takie dziwne uczucie, ...)

• Tablica stron może zawieraćinformacje o stronach, którychnie ma w pamięci fizycznej;

• w chwili dostępu do takiej stronygenerowany jest wyjątekpowodujący zachowaniekontekstu procesu, ew.przeniesienie do kolejkiprocesów oczekujących nasprowadzenie strony z pamięciswap, oraz sprowadzenie strony,po czym wznowienie procesu tak,jakby nic się nie stało;

• Dodatkowo tablica zawieralicznik odwołań, automatyczniezmniejszany, a służący doszukania stron, które mogą byćwyrzucone do pamięci swap.

20 bit 12 bit

1 A 7 3 F 0

segment i nr strony offset

tablica stron8CF04000 R--V

... ...

8CF1A000 RW-V

8CF1B000 RW-V

8CF1A000

8CF1B000

8CF19000

3F0

8C000000

pamiξ fizyczna

obszarprocesu

tablica segmentów

8F345000 RWXV

41212000 R---

8DD22000 R-XV

... ...

8CF1B000 R-XV

8FAA5000 RW-V

8FAA6000 RW-V

... ...

8FAD1000 RW-V

0 0

kod

dane

stos

kod

dane

stos

1

2

1

3

1

1

2

0

3

1

swap

plik wymiany

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-9

Page 71: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna Pełny diagram stanów procesów

Pełny diagram stanów procesów

tryb użytk.

tryb jądra.

uśpiony gotowy

uśpiony/swap gotowy/swap

fork()

wywłaszcz.

utworzony

zombie

swap-outswap-in

exit()kill()

przerwanie

wywłaszcz.

powrót

f. bl

okuj

ąca

obudzenie

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-10

Page 72: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna fork() jeszcze raz

fork() jeszcze raz

• Tworzenie nowego procesu funkcją fork() wymaga skopiowania do nowego procesu segmentu danychi stosu.

• Tworzenie nowych segmentów, alokowanie na nie stron pamięci i skopiowanie zawartości procesu ma-cierzystego to kosztowne operacje.

• Jeśli fork() jest wykonywany tylko po to, by chwilę później wykonać exec(), jest to niepotrzebnie wykony-wana praca i strata czasu.

Do poprawy efektywności wykonywania fork()+exec() służy „uproszczona” funkcja vfork(), która:

• Tworzy nowy proces, podobnie jak fork()

• Nie rozdziela segmentów danych i stosu tych procesów

• Wstrzymuje proces rodzica do momentu gdy proces potomny wykona którąś z funkcji exec() lub sięzakończy.

• Proces potomny dziedziczy otwarte pliki podobnie jak w fork() – ich zamykanie jest niezależne od zamy-kania ich w rodzicu.

Proces potomny tworzony przez vfork() ma bardzo ograniczone pole działania:

• Może pozamykać niepotrzebne deskryptory plików

• Nie może modyfikować żadnych zmiennych

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-11

Page 73: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

6. Pamięć wspólna fork() jeszcze raz

• Nie może wołać żadnych własnych funkcji ani wykonać return

• Nie może wołać żadnych funkcji systemowych, z wyjątkiem funkcji z rodziny exec() i funkcji exit()

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 6-12

Page 74: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

7. Wątki

Wątki

Istnieje kilka bibliotek do tworzenia wątków, wzajemnie niekompatybilnych. Najpopularniejsze to:

• Solaris threads

• POSIX Threads (pthreads)

Wątki zdefiniowane standardem POSIX są przenośne, system zapewnia wymuszanie opcji schedulera. Wątkisystemu Solaris mogą być wstrzymywane i wznawiane, można w nich korzystać ze zoptymalizowanych ope-racji na semaforach i blokad czytania/pisania, a w systemach wieloprocesorowych mogą być uruchamianerównolegle.

Podstawowe cechy wątków:

• Tworzenie wątków jest szybsze i tańsze niż tworzenie nowego procesu

• Wszystkie wątki dzielą między sobą przestrzeń adresową procesu – dane i kod programu;

• Każdy wątek ma osobny stos i pewne atrybuty dotyczące wykonywania

• Wszystkie mają wspólny jeden numer procesu, rozróżniane są przez ID wątku uzyskiwany przy tworzeniunowego wątku

• Synchronizacja odbywa się przez specjalne funkcje związane z wątkami, operujące na semaforach, moni-torach lub zmiennych warunkowych.

• Nie wszystkich funkcji systemowych można używać w wątkach w bezpieczny sposób („MT-Safe”).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 7-1

Page 75: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

7. Wątki

Podstawowe funkcje

• pthread create() (POSIX), thr create() (Solaris)

• pthread exit(), thr exit()

• pthread join(), thr join()

• pthread detach(), –

• pthread mutex init(), mutex init()pthread mutex trylock(), mutex trylock()pthread mutex lock(), mutex lock()pthread mutex unlock(), mutex unlock()pthread mutex destroy(), mutex destroy() – operacje na monitorach

• sem init(), sem wait(), sem trywait() i inne – operacje na semaforach

• pthread cond init(), pthread cond wait(), pthread cond timedwait(), pthread cond signal() i inne

• sched yield(), thr yield()

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 7-2

Page 76: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

7. Wątki

Tworzenie wątków

#include <pthread.h>int pthread_create(pthread_t *new_thread_ID,

const pthread_attr_t *attr,void * (*start_func)(void *), void *arg);

#include <thread.h>int thr_create(void *stack_base, size_t stack_size,

void *(*start_func)(void *), void *arg, long flags,thread_t *new_thread_ID);

• Funkcja tworzy nowy wątek. Nowy wątek po utworzeniu zaczyna swoje życie na początku funkcjistart func.

• Wątek kończy się automatycznie po wyjściu z funkcji start func, po wywołaniu pthread exit() lubthr exit(), odwołaniu wątku (pthread cancel()) lub zakończeniu przez exit() głównego procesu.

• pthread join() jest odpowiednikiem funkcji wait() – czeka na zakończenie określonego lub dowolnegowątku.Tylko jeden z wątków może wykonać pthread join() podając ten sam wątek jako argument funkcji (pozo-stałe kończone są natychmiast z błędem ESRCH).

Dalsze rozważania – na przykładzie wątków POSIX.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 7-3

Page 77: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

7. Wątki

Synchronizacja wątków

• Specjalne mechanizmy semaforów dostosowane do specyfiki programów wielowątkowych (Standard PO-SIX 1003.1b)

#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);int sem_wait(sem_t * sem);int sem_trywait(sem_t * sem);int sem_post(sem_t * sem);int sem_getvalue(sem_t * sem, int * sval);int sem_destroy(sem_t * sem);

• Mechanizm monitorów i zmiennych warunkowych (pthread mutex lock(), pthread cond wait() i inne)

– Monitor w najprostszej formie (bez zmiennej warunkowej) można traktować jak semafor binarny– Z monitorem może być związana jedna lub kilka zmiennych warunkowych– Zmienne warunkowe, inne (zwykłe) zmienne oraz sam monitor można zagregować we wspólny obiekt

– np. w postaci klasy języka C++.– Monitor służy do zapewnienia atomiczności operacji mogących mieć wpływ na zmienne z nim zwią-

zane

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 7-4

Page 78: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

7. Wątki

Zmienne warunkowe

• Zmienna warunkowa jest zawsze związana z monitorem (w celu uniknięcia wyścigu pomiędzy czekaniemna zajście warunku a sygnalizowaniem jego zajścia)

• Wątek może zostać wstrzymany do momentu spełnienia żądanego warunku (np. oczekiwanego wynikuporównania dwóch zmiennych itp.)

• Wykonanie pthread cond wait(), zawiesza wątek w oczekiwaniu na spełnienie warunku i automatyczniezwalnia monitor związany ze zmienną warunkową

• Wątek ponownie otrzymuje sterowanie po tym, gdy inny wątek wykona pthread cond broadcast() lubpthread cond signal(): Wywołanie pthread cond signal() budzi dokładnie jeden wątek czekający na speł-nienie warunku, pthread cond signal() – wszystkie.

• W obudzonym wątku monitor jest ponownie zajęty, więc można kontynuować działanie w sekcji krytycznejdotyczącej zmiennej warunkowej, pamiętając także o konieczności wywołania pthread mutex unlock()

Przykład – ponownie problem pięciu filozofów:

• Za pomocą zmiennej warunkowej uzyskamy „bramkarza” nie wpuszczającego do jadalni więcej niż 3filozofów jednocześnie

• Widelce (pałeczki) również można zaimplementować za pomocą zmiennych warunkowych, prościej jednakbędzie użyć samych monitorów (bez zmiennych) lub semaforów (binarnych)

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 7-5

Page 79: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

7. Wątki

Monitory i zmienne warunkowe – przykład

/* ... zainicjowanie zmiennych warunkowych i monitorów ... */pthread_mutex_t bramka = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t miejsce = PTHREAD_COND_INITIALIZER;int ilu_je = 0;

void filozof(int nr) while(1) /* filozof medytuje */...

/* filozof się budzi i chce wejść do jadalni */pthread_mutex_lock(&bramka)while (ilu_je>=3) pthread_cond_wait(&miejsce, &bramka); /* oczekiwanie na wolne miejsce *//* ... wchodzi: */ilu_je++;pthread_mutex_unlock(&bramka);

... /* teraz można próbować wziąć widelce */

... /* oraz jeść */

/* koniec jedzenia i wyjście z jadalni */pthread_mutex_lock(&bramka);if (--ilu_je < 3)pthread_cond_broadcast(&miejsce); /* obudzenie filozofów czekających na wolne miejsce w jadalni */pthread_mutex_unlock(&bramka);

1

2

3

4

5

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 7-6

Page 80: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

7. Wątki

Monitory i zmienne warunkowe – przykład (c.d.)

Sam sposób brania widelców można rozwiązać w „tradycyjny” sposób, traktując monitory jak semafory binarne:

/* inicjowanie mechanizmów -- gdzieś na początku */

pthread_mutex_t widelec[5]; /* tablica pięciu monitorów/semaforów binarnych */for (i=0; i<5; i++) widelec[i]=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_init(widelec+i);

/* pobieranie widelców przez filozofa */

void filozof(int nr) while(1) ...... /* wejście do jadalni */

pthread_mutex_lock(widelec+nr); /* zajmowanie widelców */pthread_mutex_lock(widelec+((nr+1)%5));/* filozof je */pthread_mutex_unlock(widelec+nr);pthread_mutex_unlock(widelec+((nr+1)%5));

... /* wyjście z jadalni */

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 7-7

Page 81: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

7. Wątki

Monitory i zmienne warunkowe – przykład (c.d.)

Inny sposób pobierania widelców – z użyciem semaforów:

/* inicjowanie mechanizmów -- gdzieś na początku */

sem_t widelec[5]; /* tablica pięciu monitorów/semaforów binarnych */for (i=0; i<5; i++) sem_init(widelec+i, 0, 1); /* pshared=0, początkowa wartość semafora = 1 */

void filozof(int nr) while(1) ...... /* wejście do jadalni */

sem_wait(widelec+nr); /* zajmowanie widelców */sem_wait(widelec+((nr+1)%5));/* filozof je */sem_post(widelec+nr);sem_post(widelec+((nr+1)%5));

... /* wyjście z jadalni */

/* gdzieś na końcu ... */for (i=0; i<5; i++) sem_destroy(widelec+i);

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 7-8

Page 82: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

7. Wątki

Jeszcze jeden przykład problemu pięciu filozofów

• Monitory pozwalają w elegancki sposób rozwiązać problem wiążąc wszystkie wymagane mechanizmy wjednej strukturze

• Zamiast implementować widelce w postaci semaforów wystarczy 5-elementowa tablica oznaczająca do-stępność poszczególnych widelców

• Rolę semaforów mogą spełniać zmienne warunkowe – zmienna ok[i] oznacza, że filozof nr i możeaktualnie jeść (bo oba jego widelce leżą na stole i są wolne).

• Monitor służy do wzajemnego wykluczania operacji prowadzonych na tablicy widelców i zmiennych wa-runkowych.

Algorytm postępowania filozofa:

• Zajmuje monitor, sprawdza, czy oba jego widelce są wolne.

• Jeśli nie są, zasypia na zmiennej warunkowej, czekając aż zostanie zasygnalizowany fakt, że oba są wolne.Oczekiwanie na zmiennej warunkowej zwalnia monitor, dzięki czemu inni filozofowie są w stanie zwolnićwidelce i zasygnalizować ten fakt.

• Jeśli (wreszcie) oba widelce są wolne, filozof zajmuje je (odnotowując w tablicy widelców) i zaczyna jeść.(zwalniając monitor)

• Po zakończeniu, ponownie zajmuje monitor i zwalnia widelce oraz sygnalizuje swoim sąsiadom, że (byćmoże) mogą jeść (po czym zwalnia monitor i idzie medytować).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 7-9

Page 83: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

7. Wątki

Implementacja ostatniego rozwiązania

#define C_INIT PTHREAD_COND_INITIALIZERstruct pthread_mutex_t mut;pthread_cond_t ok[5];int widelec[5];

f=PTHREAD_MUTEX_INITIALIZER, C_INIT, C_INIT, C_INIT, C_INIT, C_INIT, 1,1,1,1,1 ;

void filozof(int nr) while(1) pthread_mutex_lock(&f.mut); /* zajmowanie widelców - najpierw zajmij monitor*/while (f.widelec[nr]+f.widelec[(nr+1)%5] < 2) /* czy oba są wolne? */pthread_cond_wait(&f.ok[nr], &f.mut); /* nie są ==> czekaj */

f.widelec[nr]=0; /* zajmij oba naraz */f.widelec[(nr+1)%5]=0;pthread_mutex_unlock(&f.mut); /* oraz zwolnij monitor */

... /* filozof je */

pthread_mutex_lock(&f.mut); /* zwalnianie widelców - najpierw zajmij monitor*/f.widelec[nr]=1;f.widelec[(nr+1)%5]=1;

pthread_cond_signal(&f.[(nr-1+5)%5]; /* "szturchnij" lewego sąsiada */pthread_cond_signal(&f.[(nr+1)%5]; /* i prawego */pthread_mutex_unlock(&f.mut); /* oraz zwolnij monitor */

... /* idź medytować */

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 7-10

Page 84: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

7. Wątki

Problemy z funkcjami systemowymi w wątkach

• Niektóre z funkcji systemowych operują na danych zapisywanych w statycznie przydzielanym obszarzepamięci

• Wywoływanie tych funkcji z różnych wątków powodowałoby nadpisywanie tego obszaru

Przykład: czytanie katalogu funkcją opendir() i readdir():

#include <stdio.h>#include <dirent.h>main()

DIR *dirp;struct dirent *direntp;

dirp = opendir(".");while ( (direntp=readdir(dirp)) != NULL )

printf( "%s\n", direntp->d_name );closedir(dirp);return (0);

Większość funkcji takich jak readdir() posiada swoje odpowiedniki pozwalające na korzystanie z wątków,nazywane zwykle przez dodanie sufiksu r (pochodzącego od słowa reentrant), np. readdir r().

Podobnie np. funkcje dotyczące tłumaczenia nazw DNS: gethostbyname() i gethostbyname r(), gethostbyna-me r(), gethostent r(), gethostbyaddr r() itp.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 7-11

Page 85: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa

Komunikacja sieciowa

Różne rodzaje sieci:

• sieci broadcastowe

• sieci token ring i FDDI

• połączenia punkt-punkt (point-to-point)

host1

host4

host2 host3

host5

host10

host9

host6host7

host8

host11

host14

host12

host13

host5

hub

host16PPP/SLIP

Token Ring

Ethernet10base5

Ethernet10BaseT

Ethernet 10base2

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-1

Page 86: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa

• nawet w obrębie sieci lokalnych stosowane są różne technologie, np. Ethernet 10baseT (skrętka), 10base5(kabel koncentryczny 50Ω), 10base2 („gruby” ethernet)

• pojedyncze sieci lokalne łączone są ze sobą albo przez komputery z dwoma interfejsami sieciowymi,pełniącymi zwykle rolę routerów, albo specjalne urządzenia – huby, switche, routery.

• sieć ethernet jest siecią typu broadcast, sieci komórkowe też;

• zaczęło się od „Aloha network” – pakietowej sieci radiowej na Hawajach w latach ’70:

N

S

EW

host1

host2

host3

_T__

(_. ‘-

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-2

Page 87: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa

Dostarczanie pakietów:

• wszyscy słuchają rozgłaszanych pakietów, więc każdy pakiet musi mieć adres docelowy i adres nadawcy,np. unikalny numer przypisany komputerowi;

• jeśli pakiet do kogo innego – wyrzuć (ethernet – dokonywane na poziomie sprzętu, bez generowanianiepotrzebnego przerwania);

• problem z poufnością – każdy może podsłuchiwać!

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-3

Page 88: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa

Dostęp do medium:

• wspólny zasób – co będzie, gdy 2 stacje zaczną nadawać jednocześnie? – trzeba wykrywać jakoś nałożeniesię pakietów, czyli kolizje

• nadawaj w ciemno, ale dodaj sumę kontrolną

• suma kontrolna i tak się przyda – na wypadek nisko przelatujących samolotów

• jeśli dostałeś nieuszkodzony pakiet – odeślij potwierdzenie

• co będzie, jeśli potwierdzenie nie dotrze?

• nadawca czeka jakiś czas i retransmituje to, co wysłał wcześniej

• jeśli nastąpi kolizja, każdy z nadawców spróbuje po chwiliponownie wysłać pakiet

Skalowalność:

• co będzie, gdy zwiększy się ruch lub liczba stacji?

• ograniczony zasięg – konieczność retransmisji przezniektóre stacje pakietów dla innych stacji

N

S

EW

host1

host2

host3

_T__

(_. ‘-

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-4

Page 89: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Model OSI/ISO

Model OSI/ISO

5

76

4321

sieciowałącza

fizyczna

transportowasesji

zastosowańprezentacji

• Zaprojektowany jako „standard otwarty”, tzn.:

– Publikowany w sposób otwarty, za darmo, bez jakichkolwiek restrykcji patentowych czy ograniczeńdotyczących rozpowszechniania.

– Może istnieć (i ze sobą współpracować) wiele różnych implementacji.

• Enkapsulacja wyższych warstw w niższych stanowi o elastyczności rozwiązania i sukcesie, jaki zostałosiągnięty.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-5

Page 90: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Model OSI/ISO

Stos protokołów OSI

Fizyczna

Łącza

Sieciowa

Transportowa

Sesji

Prezentacji

Aplikacji

ISODE

ISONetBIOS

LLC

SMB

ISO Session

Ethernet -- Token Ring -- FDDI -- PSTN

SNAP

CLNSIS-ISRouting

<IP>

TP Class 0, 2, and 4

ISO Presentation

X.400 P1 ACSE

X.400 P1 FTAM VTP

(c)TS

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-6

Page 91: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Model OSI/ISO

Stos protokołów TCP/IP

Fizyczna

Łącza

Sieciowa

Transportowa

Sesji

Prezentacji

Aplikacji

TCP UDP

IP

ARPRARP

SNAP

LLC

SMB DNS DHCP SNMP BOOTPTFTP

NetBIOS

FTPTelnetSMTP

RIP OSPF ICMP

Ethernet, Token Ring, PtP, ATM, ...(c)2001 TS

(c)TS

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-7

Page 92: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Sieć ethernet – warstwa 2

Sieć ethernet – warstwa 2

• Metoda dostępu – CSMA/CD (Carrier Sense Multiple Access with Collision Detection)

• Adresowanie – każda karta sieciowa ma swój adres – 6-bajtową liczbę (pierwsze 3 bajty przypisane doproducenta, np. 08:00:20 – Sun, 00:e0:63 – Cabletron, itd.)

• Adres FF:FF:FF:FF:FF:FF jest adresem specjalnym – broadcast

• Adres 01:AA:05:xx:xx:xx – mapowanie 1:1 adresów multicast 224.xx.xx.xx

• Karta sieciowa odbiera pakiety tylko wtedy, gdy zawierają jej adres lub adres broadcast (pozostałe ignoruje),a jeśli komputer odbiera pakiety multicast, także te, które są adresowane do właściwej grupy multicastingu.

odbiorca nadawca typ CRC

nagłówek ethernet suma kontrolnatreść pakietu

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-8

Page 93: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Protokoły sieciowe IP – warstwa 3

Protokoły sieciowe IP – warstwa 3

• wewnątrz ramek ethernet zawarte są pakiety IP:

odbiorca nadawca typ CRC

nagłówek ethernet suma kontrolnatreść pakietu

nad odb

nagłówek IP treść pakietu

TCP

• nagłówek IP zawiera: adres IP nadawcy i odbiorcy, typ pakietu, TTL, numer protokołu, identyfikatorpakietu, opcje, długość, itp. – łącznie 20 bajtów.

• adresy: 32-bitowe (4 bajty)

• typ protokołu: wersja 4 (IPv4)

• numer protokołu: TCP, UDP, ICMP

• TTL – Time To Live – maksymalny czas życia pakietu

• identyfikator pakietu – pozwala wykryć duplikaty lub zgubienie pakietu

• fragmentacja – czy występuje, czy ostatni fragment, offset od początku

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-9

Page 94: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa TCP/UDP – warstwa 4

TCP/UDP – warstwa 4

• Numer portu nadawcy i odbiorcy

• Długość pakietu

• Suma kontrolna TCP/UDP

• Opcje TCP

• Numer pakietu TCP i potwierdzenie pakietu drugiej strony

Cechy charakterystyczne:

• gniazdka

• porty

• mechanizm „sliding window” (przesuwane okno)

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-10

Page 95: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa TCP/UDP – warstwa 4

Warstwa 4 – przykład pakietu

0: ffff ffff ffff 00e0 6304 40c0 0800 4500 [email protected].

32: 285f 0208 0208 0098 1099 0201 0000 0002 (_..............

48: 0000 9c11 2aa0 0000 0000 0000 0000 0000 ....*...........

80: 0001 0002 0000 9c11 28c0 0000 0000 0000 ........(.......

96: 0000 0000 0001 0002 0000 9c11 1e40 0000 [email protected].

112: 0000 0000 0000 0000 0001 ..........

16: 004c 8b2d 0000 0111 a551 9c11 2841 9c11 ...-.....Q..(A..

Pakiet UDP:

• Port docelowy – RIP(520) (0208)

• Port źródłowy – RIP(520) (0208)

• Suma kontrolna – 1099

Warstwa 7

• „payload” – tablica routingu protokołu RIP

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-11

Page 96: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa TCP/UDP – warstwa 4

UDP

• Dostarczanie pakietów bez gwarancji dotarcia na miejsce

• Dostarczanie pakietów w nieokreślonej kolejności

• „best effort” – najszczersze chęci dostarczenia, ale:

– pakiety mogą się zgubić– mogą powstać duplikaty– brak kontroli przepływu

• sieć gwarantuje, że pakiet dotrze bez przekłamań lub nie dotrze w ogóle

• aplikacje korzystające z UDP muszą same zadbać o niezawodność, retransmisje, itd.

• nie ma fazy nawiązywania połączenia – jest szybciej przy krótkich transmisjach

• w przypadku słabej jakości łącza nie tracimy czasu na przesyłanie za wszelką cenę danych, które byćmoże są nieistotne lub potrafimy je odtworzyć innymi metodami (np. transmisja dźwięku)

• punkty końcowe transmisji identyfikowane przez numery portów

– serwery mają „dobrze znane” porty– odpowiedzi są wysyłane na numer portu, z którego nadeszło zapytanie

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-12

Page 97: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa TCP/UDP – warstwa 4

TCP

• Połączenie typu „virtual circuit” – obwód wirtualny (jak w połączeniach telefonicznych)

• Nawiązywanie połączenia zabiera czas

• Warstwa sieciowa zapewnia dostarczanie pakietów bez strat, we właściwej kolejności, a jeśli to jest nie-możliwe – informuje wyższe warstwy (np. o utracie połączenia).

• Granice pakietów są niewidoczne – ciągły strumień danych

– Aplikacja pisze do strumienia (deskryptora pliku/połączenia)– Warstwa sieciowa wysyła pakiety– Aplikacja czyta strumień bajtów

• Jednoczesna transmisja w obu kierunkach (full duplex)

• Kontrola przepływu – aplikacja odbierająca dane może wstrzymać ich nadawanie

• Kontrola zatkania sieci – ochrona sieci przed wypełnieniem jeej całkowicie pakietami jednego nadawcy

• Po nawiązaniu połączenia TCP musi ono zostać także poprawnie zamknięte.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-13

Page 98: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa TCP/UDP – warstwa 4

TCP/IP

• Piątka parametrów, zwana też asocjacją identyfikuje połączenie:

TCP 156.17.1.33, 23

156.17.42.30, 5341

– Adres IP nadawcy– Port nadawcy– Adres IP odbiorcy– Numer portu odbiorcy– Identyfikator protokołu (TCP lub UDP)

• Według tych parametrów warstwa sieciowa jest w stanie zidentyfikować aplikację (proces), która powinnaotrzymać pakiet nadchodzący z sieci.

• W przypadku UDP do identyfikacji aplikacji wystarcza półasocjacja (adres i port decelowy wraz z identy-fikatorem protokołu UDP).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-14

Page 99: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Przykładowy pakiet

Przykładowy pakiet

ETHER: ----- Ether Header -----ETHER: Packet 16 arrived at 0:58:9.26ETHER: Packet size = 186 bytesETHER: Destination = ff:ff:ff:ff:ff:ff, (broadcast)ETHER: Source = 0:e0:63:4:40:c0, CabletronETHER: Ethertype = 0800 (IP)ETHER:IP: ----- IP Header -----IP: Version = 4IP: Header length = 20 bytesIP: Type of service = 0x00IP: xxx. .... = 0 (precedence)IP: ...0 .... = normal delayIP: .... 0... = normal throughputIP: .... .0.. = normal reliabilityIP: Total length = 92 bytesIP: Identification = 35629IP: Flags = 0x0IP: .0.. .... = may fragmentIP: ..0. .... = last fragmentIP: Fragment offset = 0 bytesIP: Time to live = 1 seconds/hopsIP: Protocol = 17 (UDP)IP: Header checksum = a551IP: Source address = 156.17.40.65, hop.ict.pwr.wroc.plIP: Destination address = 156.17.40.95, 156.17.40.95IP: No options

IP:UDP: ----- UDP Header -----UDP: Source port = 520UDP: Destination port = 520 (RIP)UDP: Length = 72UDP: Checksum = 1099UDP:RIP: ----- Routing Information Protocol -----RIP: Opcode = 2 (route response)RIP: Version = 1RIP:RIP: Address Port MetricRIP: 156.17.42.160 NET-42-160.ict.pwr.wroc.pl 0 1RIP: 156.17.40.192 156.17.40.192 0 1RIP: 156.17.30.64 156.17.30.64 0 1

0: ffff ffff ffff 00e0 6304 40c0 0800 4500 [email protected]: 004c 8b2d 0000 0111 a551 9c11 2841 9c11 ...-.....Q..(A..32: 285f 0208 0208 0098 1099 0201 0000 0002 (_..............48: 0000 9c11 2aa0 0000 0000 0000 0000 0000 ....*...........80: 0001 0002 0000 9c11 28c0 0000 0000 0000 ........(.......96: 0000 0000 0001 0002 0000 9c11 1e40 0000 [email protected]: 0000 0000 0000 0000 0001 ..........

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-15

Page 100: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Internet Control Message Protocol (ICMP)

Internet Control Message Protocol (ICMP)

• Komunikaty kontrolne wspomagające zarządzanie siecią i połączeniami

• Niektóre z najpopularniejszych komunikatów:

– Echo (ping), Echo reply– Redirect (przekierowanie z routera wysyłane do hosta)– Destination unreachable (niedostępny protokół, port lub host)– TTL exceeded (aby pakiety nie krążyły w sieci wiecznie)– Source quench (spowolnienie źródła wysyłającego zbyt szybko dane)– Checksum failed (niepoprawna suma kontrolna/uszkodzony pakiet)– Reassembly failed (błąd przy składaniu pakietu po fragmentacji)– Cannot fragment (fragmentacja niemożliwa)– Fragmentation needed, but Don’t fragment bit set

(konieczna była fragmentacja, ale nie pozwala na to odpowiedni bit w opcjach IP pakietu)

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-16

Page 101: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Internet Control Message Protocol (ICMP)

Nawiązywanie połączeń TCP

• Z punktu widzenia warstwy transportowej nawiązanie połączenia TCP wymaga przesłania trzech pakietów:

serwerklientczas

connect (klient, 12345, serwer, 23)

SYN

accept (serwer, 5001; klient, 12345)

SYN+ACK

ACK: serwer, 5001; klient, 12345ACK

• Klient wysyła żądanie połączenia na dobrze znany numer portu serwera.

• Serwer akceptuje połączenia tworząc nowe gniazdko potencjalnie zmieniając także numer portu po swojejstronie, tak że odpowiedź do klienta trafia z nowego gniazdka (i nowego numeru portu).

• Klient potwierdza nawiązanie połączenia akceptując numer portu serwera, który mógł ulec zmianie.

W analogiczny sposób połączenie jest kończone – są to kolejno pakiety z ustawionymi opcjami FIN, FIN+ACK,ACK.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-17

Page 102: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Adresy sieciowe

Adresy sieciowe

Adres internetowy to 32-bitowa liczba, podzielona zwykle na oktety i zapisywana w notacji xxx.xxx.xxx.xxx.Każdy adres należy do jakiejś klasy – A, B, C, D lub E:

1

0

1

0

0

1

net host

net host

net host

0

0

0

2

3

1

81 7 31

31

312 23

15

24

16

Klasa A:

Klasa B:

Klasa C:

• Klasa A – Adresy 0.x.x.x–127.x.x.x, maska 255.0.0.0

• Klasa B – Adresy 128.0.x.x–191.255.x.x, maska 255.255.0.0

• Klasa C – Adresy 192.0.0.x–223.255.255.x, maska 255.255.255.0

• Klasa D – Adresy 224.0.0.x–239.255.255.x – multicasting

• Klasa E – Adresy 240.0.0.x–255.255.255.x – eksperymentalne

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-18

Page 103: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Adresy sieciowe

Adresy specjalne

• Same zera (0.0.0.0)

– 0.0.0.0/32 – Alias wskazujący na pierwszy interfejs sieciowy systemu– 0.0.0.0/8 – sieć „lokalna” (RFC 1122)– 0.0.0.0/0 – ”Default”, czyli domyślny adres oznaczający wszystkich

• Same jedynki (255.255.255.255) – lokalny broadcast

• Same zera w części opisującej hosta – adres sieci (np. 156.17.0.0)

• Same jedynki w części opisującej hosta – kierowany broadcast (do kilku sieci lokalnych, np. 156.17.255.255)

• 127.0.0.1 – adres „loopback” – interfejs zwrotny, zwany localhost i istniejący nawet jeśli w komputerzenie ma fizycznie żadnej karty sieciowej.

• Adresy do prywatnego wykorzystania – opisane w RFC 1918

– 10.0.0.0 - 10.255.255.255 (10/8)– 172.16.0.0 - 172.31.255.255 (172.16/12)– 192.168.0.0 - 192.168.255.255 (192.168/16)

• 192.88.99.0/24 (RFC 3068, RFC 5735) – adresy tunelowania/tłumaczenia IPv4/IPv6 („6to4 relay anycast”)

• 169.254.0.0/16 (RFC 5735) – „link local”: do komunikacji w obrębie pojedynczej sieci, w szczególności – doautokonfiguracji z użyciem DHCP

• 224.0.0.0/4 (RFC 3171) – multikasty IPv4

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-19

Page 104: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Adresy do prywatnego wykorzystania: (RFC 1918)

Adresy do prywatnego wykorzystania: (RFC 1918)

• 10.0.0.0 – 10.255.255.255 (10/8)

• 172.16.0.0 – 172.31.255.255 (172.16/12)

• 192.168.0.0 – 192.168.255.255 (192.168/16)

Adresy te nazywane są czasem „nieroutowalnymi”.

W rzeczywistości – są jak najbardziej „routowalne”, ale za to „nielegalne” w szkielecie Internetu.

Mogą być natomiast wykorzystywane w sieciach wewnętrznych – nawet bardzo rozbudowanych (łączonychwewnętrznymi routerami).

Jeśli sieć wewnętrzną zbudowaną na takich adresach łączymy z Internetem, to konieczna jest „maskarada”(NAT – Network Address Translation)

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-20

Page 105: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Odwzorowanie adresów warstw 2 i 3

Odwzorowanie adresów warstw 2 i 3

• Chcąc wysłać pakiet IP do komputera znajdującego się w sieci lokalnej, stacja wysyłająca musi w nagłówkuramki ethernet umieścić 6-bajtowy adres karty sieciowej odbiorcy.

• Skąd dowiedzieć się jaki to adres, jeśli znamy tylko adres IP?

• Tłumaczeniem adresów warstwy 3 (IP) na adresy warstwy 2 (ethernet) i odwrotnie zajmują się specjalneprotokoły sieciowe – ARP (Address Resolution Protocol) i RARP (Reverse ARP);

• stacja wysyła zapytanie ARP-Request będące pakietem broadcast z zapytaniem ARP o adres karty ethernet:

****** nadawca typ CRC

nagłówek ethernet suma kontrolnanagłówek ARP

nad ***

nagłówek IP

treść pakietu

danetyp opcjeARP

• pakiet odbierają wszystkie komputery w segmencie lokalnym, a właściwy odpowiada na niego, ze swoimadresem karty ethernet w polu nadawcy (typ pakietu: ARP-response);

• odpowiedzieć mogą także inne urządzenia (np. switch), „podszywając się” z adresem właściwego nadawcy– proxy ARP;

• inicjator zapytania zapamiętuje poznane tłumaczenie IP-ethernet na jakiś czas (15-30 minut), by nie wysyłaćciągle zapytań ARP;

• RARP – inicjowany w celu dowiedzenia się z serwera własnego adresu IP (np. podczas bootowania stacjibezdyskowych).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-21

Page 106: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Abstrakcyjny model komunikacji sieciowej

Abstrakcyjny model komunikacji sieciowej

UDP

• Bezpołączeniowa transmisja datagramów

• Pakiety mogą zaginąć

• Mogą pojawiać się duplikaty

• Warstwa sieciowa gwarantuje, że pakiet dotrze w postaci nieuszkodzonej lub nie dotrze w ogóle

• Program sam musi dbać o poprawne dostarczanie pakietów przez odpowiednie potwierdzenia i ew. re-transmisje

• Brak fazy nawiązywania połączenia, a więc krótszy niż w TCP czas przesłania pierwszych pakietów

TCP

• Transmisja połączeniowa

• Nawiązanie połączenia zajmuje trochę czasu (trzyetapowa konwersacja: wysłanie żądania, potwierdzeniegotowości, ustanowienie kanału komunikacyjnego)

• Warstwa sieciowa gwarantuje, że wszystkie pakiety dotrą na miejsce i we właściwej kolejności (a jeśli nie– zostanie zwrócony odpowiedni błąd)

• Brak wyraźnego podziału na pakiety – po nawiązaniu połączenia dane widzimy jako strumień, w którymmożna wyróżnić jedynie początek i koniec

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-22

Page 107: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Abstrakcyjny model komunikacji sieciowej

• Raz nawiązane połączenie musi zostać poprawnie zamknięte (znów trzyetapowa konwersacja), chyba żezostanie zerwane (skomplikowane protokoły wykrywania zerwanych połączeń)

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-23

Page 108: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Identyfikacja połączeń

Identyfikacja połączeń

• Aby rozpocząć komunikację między dwoma komputerami (a następnie odpowiednio kierować nadcho-dzące pakiety do właściwego procesu) potrzebne są ich adresy sieciowe, ale nie tylko, bo takich sesjikomunikacyjnych może być wiele.

• Na tej samej maszynie może być wiele procesów odpowiedzialnych za różne połączenia2, więc sam adresnie wystarczy – potrzebne jeszcze coś: numer portu – 16-bitowa liczba typu int;

• Numer portu przypisany jest do usługi. Ale co będzie, jeśli mamy nawiązanych kilka połączeń z tą samąusługą? Po czym je rozróżnić?

Każde połączenie IP jest identyfikowane przez PIĘĆ parametrów:

• Adres IP jednej strony

• Numer portu pierwszej strony

• Adres IP drugiej strony

• Numer portu drugiej strony

• Typ protokołu: TCP lub UDP

TCP 156.17.1.33, 23

156.17.42.30, 5341

Jeśli nawiązujemy połączenie z usługą TELNET (port TCP/23), odbywa się to z losowo wybranego portu postronie nadawcy. Po zaakceptowaniu połączenia (w chwili jego nawiązywania) może także ulec zmianie numerportu u strony odbierającej połączenie.

2w przypadku UDP jest to tylko bezpołączeniowa komunikacja między 2 procesami, ale dla uproszczenia nazwijmy to połączeniem

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-24

Page 109: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Problem kolejności bajtów

Problem kolejności bajtów

• Procesory takie jak Zilog Z-80, Intel 80x86, Pentium itp., przechowują dane w formacie little-endian:najpierw najmniej znaczący bajt, potem bardziej znaczące;

• Procesory Motorola 680x0, SPARC, RISC, MIPS – kolejność big-endian: najpierw najbardziej znaczącybajt, potem coraz mniej znaczące.

Przesyłając dane pomiędzy różnymi typami procesorów (w szczególności – przy konstruowaniu nagłówkówzawierających adresy, numery portów, długości, itp.) musimy zdecydować się na jeden rodzaj – wybrany zostałporządek big-endian.

W celu konwersji z porządku hosta do porządku sieciowego należy użyć jednej z funkcji (makr):

• htons() – dla danych typu short int (np. numery portów)

• htonl() – dla danych typu int (np. adresy IP)

i analogicznie, z porządku sieciowego do porządku hosta:

• ntohs()

• ntohl()

W systemach z procesorem typu little-endian makra te dokonują odpowiedniej konwersji, a w systemach typubig-endian – są to puste definicje.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-25

Page 110: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Model komunikacji klient–serwer

Model komunikacji klient–serwer

• Z reguły komunikacja sieciowa odbywa się z użyciem serwerów oczekujących non-stop na przyjęciezgłoszenia od klientów, czyli programów nawiązujących połączenie.

• W przypadku transmisji UDP także klient musi zarejestrować chęć odbierania pakietów adresowanychna konkretny numer portu, więc z sieciowego punktu widzenia – po części staje się także serwerem.

• Serwer oczekuje na zgłoszenia pod znanym numerem portu, a po przyjęciu zgłoszenia uruchamia swojąkopię (fork()), która będzie obsługiwać tego klienta lub robi to równolegle z obsługą innych klientów wgłównym wątku, możliwe jest więc wielokrotne jednoczesne korzystanie z tej samej usługi.

• Trzymanie „w pogotowiu” serwerów wszystkich usług, także tych bardzo rzadko używanych, to marnowaniepamięci – dlatego większość może być uruchamiana przez program inetd – Internet Superdaemon.

• „Znane” lub „zarezerwowane” numery portów to numery wymienione w pliku /etc/services, np.:

– 23/tcp – TELNET– 21/tcp – FTP– 520/udp – RIP– 6667/tcp – IRC– itp.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-26

Page 111: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

8. Komunikacja sieciowa Uproszczony model OSI

Uproszczony model OSI:• 5-7 warstwa procesów (procesy/daemony)

• 3-4 warstwa transportowa (UDP, TCP)

• 2-3 warstwa sieciowa (IP)

• 1-2 warstwa łącza (interfejs sprzętowy)

5

76

4321

sieciowałącza

fizyczna

transportowasesji

zastosowańprezentacji

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 8-27

Page 112: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe

Protokoły sieciowe

Standardowe usługi, takie jak zdalny dostęp, transfer plików, poczta elektroniczna itp. są przypisane do stałychnumerów portów.

• Usługi zdalnego dostępu

– TELNET, RLOGIN– RSH, REXEC– SSH, STELNET

• Usługi tłumaczenia nazw i katalogowe

– DNS (Domain Name System)– NIS (Network Information System)– NIS+ (NISPLUS – zaawansowana wersja

NIS)– LDAP (Lightweight Direcrory Access

Protocol)

• Usługi zdalnej autoryzacji

– RADIUS– TACACS, TACACS+– LDAP

• Usługi poczty elektronicznej i Usenet news

– SMTP (Simple Mail Transfer Protocol),ESMTP

– POP2, POP3– IMAP– NNTP, NNRP

• Synchronizacja czasu

– NTP (Network Time Protocol)– RDATE

• Zdalny dostęp do plików

– NFS, RFS– LOCK, STAT– AFS– SAMBA

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-1

Page 113: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe

• Zarządzanie siecią i usługi wspomagające

– ECHO, CHARGEN, DISCARD – testowanie sieci– SNMP (Simple Network Management Protocol)– DHCP, BOOTP– TFTP (Trivial File Transfer Protocol)– RIP, OSPF, IGRP, IS-IS, BGP – routing

• Usługi systemów UNIX w sieciach lokalnych

– FINGER, RWHO– LPR– TALK– SYSLOG

• Usługi informacyjne i transfer plików

– HTTP (WWW)– WHOIS– FTP– ARCHIE

i wiele innych... – w tym prokokoły zamknięte, np. gadu-gadu, skype

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-2

Page 114: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Standardy opisujące protokoły

Standardy opisujące protokoły

• Standardy otwarte

• Ustalane przez ISOC (Internet Society)

• ISOC jest zarządzany przez Internet Architecture Board (IAB)

• IAB polega w swojej pracy na:

– Internet Engineering Task Force (IETF) - wprowadzanie nowych standardów– Internet Assigned Numbers Authority (IANA)– koordynacja przydzielania numerów pomiędzy proto-

koły

• Nowe standardy są najpierw publikowane jako ”drafty” – petencjalni kandydaci do zostania dokumentemRFC (Request For Comments)

• Po obowiązkowej dyskusji, testach i ocenie – IETF otrzymuje rekomendację publikacji dokumentu i nadajemu numer RFC

• Nawet po publikacji i zaakceptowaniu jako standard, dokument pozostaje otwarty na komentarze, możebyć poprawiany lub zmieniony przez inny („updated by”, „obsoleted by”)

• Cały ten proces jest opisany... oczywiście w dokumencie RFC. (RFC 2223 :-))

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-3

Page 115: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Standardy opisujące protokoły

Dokumenty RFC

• Dostępne w wielu miejscach, np. ftp.rtfm.mit.edu

• Uwaga na notki: ”Obsoletes”, ”Obsoleted by”, ”Updates” i ”Updated by”

• Przykłady najbardziej znanych dokumentów RFC:

– RFC 821 – Simple Mail Transfer Protocol (obsoleted by RFC 2821).– RFC 822 – Standard for the format of ARPA Internet text messages. (SMTP headers, obsoleted by

RFC 2822)– RFC 1652 – SMTP Service Extension for 8bit-MIME transport. (ESMTP protocol)– RFC 826 – Ethernet Address Resolution Protocol. (ARP)– RFC 1144 – Compressing TCP/IP headers for low-speed serial links. (V. Jacobson. PPP header com-

pression)– RFC 2508 – Compressing IP/UDP/RTP Headers for Low-Speed Serial Links. S. Casner, V. Jacobson.– RFC 1131 – OSPF specification.– RFC 1142 – OSI IS-IS Intra-domain Routing Protocol.– RFC 2460 – Internet Protocol, Version 6 (IPv6) Specification.

• W okolicach 1 kwietnia każdego roku tradycyjnie pojawiają się trochę mniej poważne dokuemnty:

– RFC 1149 – Standard for the transmission of IP datagrams on avian carriers.– RFC 1925 – The Twelve Networking Truths.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-4

Page 116: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Powiązania między usługami a numerami portów

Powiązania między usługami a numerami portów

Każdy protokół związany jest także z konkretnym typem komunikacji, np. SMTP zawsze używa TCP, RIPzawsze używa komunikacji UDP, jednak niektóre usługi mogą być oferowane w obu typach komunikacji, naprzykład:

• RDATE – zamiennie, pełna funkcjonalność w TCP i UDP;

• DNS – UDP używany do zapytań o pojedyncze adresy, TCP do transferów pełnych stref pomiędzy serwe-rami.

Przypisanie usług do konkretnych numerów portu można znaleźć w pliku /etc/services lub za pomocą funkcjisystemowych getservbyname(), getservbyport(), getservent() i innych.

# Network services, Internet style#echo 7/tcpecho 7/udpdaytime 13/tcpdaytime 13/udpftp-data 20/tcpftp 21/tcpssh 22/tcptelnet 23/tcpsmtp 25/tcp maildomain 53/udpdomain 53/tcphttp 80/tcp wwwpop2 109/tcp pop-2 # Post Office Protocol - V2pop3 110/tcp # Post Office Protocol - Version 3...irc 6667/tcp

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-5

Page 117: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Tłumaczenie nazw usług w systemie UNIX

Tłumaczenie nazw usług w systemie UNIX

#include <netdb.h>

struct servent *getservbyname(const char *name, const char *proto);struct servent *getservbyport(int port, const char *proto);

int setservent(int stayopen);struct servent *getservent(void);int endservent(void);

• getservbyname() i getservbyport() pozwalają przetłumaczyć pojedyncze nazwy usług na numery portówlub odwrotnie;

• Dane zwracane są w strukturze struct servent:

struct servent char *s_name; /* oficjalna nazwa usługi */char **s_aliases; /* lista aliasów, zakończona NULL */int s_port; /* numer portu */char *s_proto; /* nazwa protokołu */;

• getservent() pozwala sekwencyjnie przeglądać listę usług, korzystając z lokalnego pliku /etc/services lubserwerów NIS/NIS+;

• getservent(), getservbyname() i getservbyport() zwracają wskaźnik na statyczną strukturę danych w pa-mięci systemowej, dlatego nie można tych funkcji wykorzystywać w programach wielowątkowych. Zamiastnich należy korzystać z getservent r(), getservbyname r(), getservbyport r().

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-6

Page 118: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Przykład protokołu – SMTP

Przykład protokołu – SMTP

Przykładowa konwersacja z demonem poczty elektronicznej wykonana przy pomocy programu telnet:

% telnet cyber 25Trying 156.17.41.30...Connected to cyber.Escape character is ’^]’.220 cyber.ict.pwr.wroc.pl ESMTP Sendmail 8.9.3 Mon, 17 Apr 2000 21:00:00 +0200 (MET DST)ehlo okapi.ict.pwr.wroc.pl250-cyber.ict.pwr.wroc.pl Hello ts@okapi [156.17.42.30], pleased to meet you250-8BITMIME250-SIZE 1500000250-ETRN250 HELPhelp214-This is Sendmail version 8.9.3214-Commands:214- HELO EHLO MAIL RCPT DATA EXPN214- RSET NOOP QUIT HELP VRFY VERB214-For more info use "HELP <topic>".214-To report bugs in the implementation send email to214- [email protected] local information send email to Postmaster at your site.214 End of HELP infomail from: <[email protected]>250 <[email protected]>... Sender okrcpt to: <[email protected]>250 <[email protected]>... Recipient okrcpt to: <[email protected]>250 <[email protected]>... Recipient okrcpt to: <zxcvbnm@cyber>550 <zxcvbnm@cyber>... User unknowndata354 Enter mail, end with "." on a line by itselfFrom: Swiety Mikolaj <[email protected]>

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-7

Page 119: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Przykład protokołu – SMTP

To: Wszystkie grzeczne dzieci (undisclosed recipients at cyber)Subject: Swieta...

Wprawdzie to nie te swieta, ale i tak -- Wesołych Świąt!.250 VAA08247 Message accepted for deliveryquit221 cyber.ict.pwr.wroc.pl closing connectionConnection closed by foreign host.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-8

Page 120: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Przykład protokołu – SMTP

Protokoły sieciowe większości usług z reguły stosują się do następujących zasad:

• komunikacja odbywa się w sposób całkowicie tekstowy (z wyjątkiem fragmentów wymagających przesła-nia plików/danych binarnych), polecenia kończone są znakiem przejścia do nowej linii;

• serwer odpowiada w sposób tekstowy, rozpoczynając linię 3-cyfrowym kodem, po którym następuje do-datkowa informacja dla użytkownika;

– Trzy cyfry i minus oznaczają, że kod odpowiedzi będzie kontynuowany w następnej linii;– Trzy cyfry i spacja oznaczają, że jest to ostatnia linia.

• Pierwsza cyfra określa, czy wykonanie operacji się udało:

– Kody 2xx oznaczają poprawne zakończenie operacji;– 3xx – poprawne zakończenie wydanej komendy, ale wymagane jest kontynuowanie rozpoczętej opera-

cji zgodnie z przyjętym protokołem (np. po podaniu komendy „user abc” może się pojawić odpowiedź„331 Password required for user abc”;

– 4xx – tymczasowy błąd, np. brak wolnej pamięci, zajęte zasoby, itp. Próba może być ponowiona zajakiś czas;

– 5xx – błąd, np. zła nazwa użytkownika, złe parametry, itp. Nie ma sensu ponawiać prób, bo w tej postacizawsze będzie generowany błąd.

• dzięki tekstowemu charakterowi transmisji (i komentarzom po kodach numerycznych) możliwe jest „ręcz-ne” testowanie połączeń nawet bez specjalnego programu klienta;

• programy klienta z reguły interpretują wyłącznie numeryczne kody zakończenia operacji. Ścisła interpre-tacja pierwszej (i drugiej) cyfry pozwala na poprawną reakcję nawet w przypadku rozbieżności w imple-mentacji protokołu po obu stronach połączenia.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-9

Page 121: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Tworzenie gniazdek

Tworzenie gniazdek

Komunikacja sieciowa w systemie UNIX odbywa się za pomocą gniazd sieciowych (zwanych też gniazdkamilub gniazdkami BSD).

• Gniazdko jest przez system UNIX traktowane tak, jak deskryptor otwartego pliku – można z niego czytaćfunkcją read(), można do niego pisać przez write(), zamknąć je za pomocą close(), a także wykonaćoperacje możliwe tylko na deskryptorach będących gniazdkami;

• Gniazdko istnieje w określonej domenie adresowej, co implikuje w jaki sposób zapisywany będzie adresgniazdka – stosowane obecnie domeny to:

– AF UNIX – gniazdka systemu UNIX, związane z systemem plików;– AF INET – gniazdka sieciowe, IPv4;– AF INET6 – nowe gniazdka sieciowe, IPv6;– Mniej popularne lub wypierane przez powyższe: AF ISO, AF NS (Xerox), AF APPLETALK, AF IPX (Novell)

i inne.

• Oprócz domeny adresowej na sposób komunikacji ma wpływ typ gniazdka:

– SOCK STREAM – gniazdka strumieniowe (TCP);– SOCK DGRAM – gniazdka datagramowe (UDP);– SOCK RAW – gniazdka operujące w warstwie 2 modelu OSI/ISO (np. ARP, pakiety ICMP i inne);– inne.

• Nowe gniazdko można utworzyć za pomocą socket() lub socketpair() (ta druga wyłącznie w domenieAF UNIX);

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-10

Page 122: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Tworzenie gniazdek

• Zanim gniazdko będzie nadawało się do użycia, należy mu nadać adres za pomocą funkcji bind().

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-11

Page 123: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Tworzenie gniazdek

Funkcja socket()

#include <sys/types.h>#include <sys/socket.h>

int socket(int domain, int type, int protocol);

• Domena – AF UNIX lub AF INET

• Typ – SOCK STREAM, SOCK DGRAM, SOCK RAW, SOCK SEQPACKET

• Protokół – ściśle związany z typem gniazdka, np. gniazdka AF INET SOCK STREAM korzystają zawsze zprotokołu IPPROTO TCP, a internetowe gniazdka typu SOCK DGRAM – protokołu IPPROTO UDP.Rozróżnienie może być istotne w przypadku gniazdek SOCK RAW, gdzie możemy wybrać IPPROTO ICMP lubIPPROTO RAW.Podanie wartości 0 spowoduje wybranie protokołu właściwego dla podanej kombinacji domeny i typugniazdka.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-12

Page 124: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Tworzenie gniazdek

Funkcja socketpair()

#include <sys/types.h>#include <sys/socket.h>

int socketpair(int domain, int type, int protocol, int sv[2]);

Tworzy dwa połączone, ale nienazwane deskryptory gniazd, z których każdy może służyć do dwukierunkowejkomunikacji (inaczej niż w strumieniach FIFO czy deskryptorach zwracanych przez pipe()).

• Domena AF UNIX

• Typ SOCK STREAM lub SOCK DGRAM

• Protokół – wartość 0 wybiera właściwy.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-13

Page 125: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Tworzenie gniazdek

Nadanie nazwy – funkcja bind()

#include <sys/types.h>#include <sys/socket.h>

int bind(int s, const struct sockaddr *name, socklen_t *namelen);

• s – deskryptor utworzonego wcześniej gniazda;

• name – odpowiednia do domeny adresowej struktura zawierająca adres nadawany gniazdku;

• namelen – długość struktury adresowej.

W przypadku gniazdek sieciowych IPv4 adres określa struktura sockaddr in zdefiniowana w pliku/usr/include/netinet/in.h:

struct sockaddr_in sa_family_t sin_family;in_port_t sin_port;struct in_addr sin_addr;unsigned char sin_zero[8];

;

Struktura in addr oraz typ in port t są okrężnym sposobem zdefiniowania adresu/portu w sposób przenośny,by nadawały się do zastosowania w wielu architekturach procesorów i różnych systemach. W rzeczywistościsą to odpowiednio 32- i 16-bitowe liczby typu unsigned int – ZAWSZE zapisane w porządku sieciowym.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-14

Page 126: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Tworzenie gniazdek

Nadanie nazwy jest konieczne:

• w przypadku serwerów – zarówno połączeniowych, jak i bezpołączeniowych – pozwala odnotować w sys-temie ogólnie znany adres serwera i powiązać nadchodzące pakiety z procesem, który ma je otrzymywać;

• w przypadku transmisji bezpołączeniowej – zarówno po stronie serwera, jak i klienta. Pakiety wysyłanez systemu będą miały ustawiony określony adres nadawcy, co umożliwia odesłanie mu odpowiedzi;

Nadanie nazwy jest opcjonalne:

• jeśli w systemie znajduje się kilka interfejsów sieciowych (np. eth, lo...) i chcemy wymusić skorzystaniez wybranego. Możemy też użyć pseudo-adresu INADDR ANY, który zezwala na użycie dowolnego adre-su/interfejsu.

• jeśli klient chce uzyskać przed uzyskaniem połączenia wybrany numer portu. Domyślnie stosowany port0 pozwala na wybranie dowolnego numeru portu przez system, w chwili łączenia z serwerem.

Porty poniżej 1024 (IPPORT RESERVED) są portami zarezerwowanymi lub uprzywilejowanymi – taki numermoże przypisać gniazdku funkcja bind() wywołana wyłącznie przez użytkownika z euid==0 (root).

Pierwszy wolny (od góry) numer portu z zakresu zarezerwowanego (512-1023) można przydzielić funkcjąrresvport(int* port), która przydziela gniazdko i nadaje mu nazwę (zwracając jego deskryptor).

Porty powyżej 5000 (IPPORT USERRESERVED) są zarezerwowane na usługi serwerów uruchamianych przez użyt-kowników (bez uprawnień użytkownika root).

Jeśli numer portu pozostanie ustawiony na 0, w chwili uzyskania połączenia zostanie przydzielony piwrwszywolny (unikalny) numer z zakresu 1024-5000.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-15

Page 127: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Tworzenie gniazdek

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-16

Page 128: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Usługi tłumaczenia nazw – DNS/NIS/NIS+

Usługi tłumaczenia nazw – DNS/NIS/NIS+

#include <netdb.h>

struct hostent *gethostbyname(const char *name);struct hostent *gethostbyaddr(const char *addr, int len, int type);

To, w jaki sposób system UNIX tłumaczy nazwy na adresy i odwrotnie, zależy od konfiguracji systemu:

• Plik /etc/nsswitch.conf określa z jakich usług sieciowych należy korzystać – lokalnych plików, NIS, NIS+czy DNS (i w jakiej kolejności);

• Plik /etc/hosts zawiera nazwy hostów i adresy konieczne podczas uruchamiania systemu (np. do skonfi-gurowania kart sieciowych, gdy jeszcze nie można skorzystać z DNS);

• Plik /etc/resolv.conf określa adresy serwerów DNS oraz domyślne domeny doklejane do zapytań.

Korzystanie z funkcji systemowych pozwala uniezależnić się od różnorodności stosowanych systemów tłuma-czenia nazw (pliki lokalne, DNS, NIS, NIS+). Korzystając z tych funkcji należy pamiętać, że:

• Jednej nazwie hosta może być przyporządkowanych wiele adresów (np. w przypadku routerów lub hostówmających kilka interfejsów sieciowych) – należy przejrzeć je wszystkie;

• Każdy host może oprócz nazwy kanonicznej (głównej) posiadać i inne nazwy, zwyczajowe, zwane aliasami,np. ftp.pwr.wroc.pl jest aliasem nazwy kanonicznej panorama.wcss.wroc.pl;

• Wszystkie adresy zwracane są w porządku sieciowym i może być konieczne użycie odpowiednich makrhtonl() lub ntohl().

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-17

Page 129: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Usługi tłumaczenia nazw – DNS/NIS/NIS+

Usługi tłumaczenia nazw – DNS/NIS/NIS+

Adresy i nazwy zwracane są w strukturze hostent

struct hostent char *h_name; /* canonical name of host */char **h_aliases; /* alias list */int h_addrtype; /* host address type */int h_length; /* length of address */char **h_addr_list; /* list of addresses */

;

Struktura ta zawiera pola pozwalające przekazać adres niezależnie od stosowanej domeny adresowej.

Oprócz funkcji szukających adresu/nazwy wybranego hosta istnieją funkcje pozwalające sekwencyjnie prze-glądać zawartość pliku /etc/hosts lub map NIS/NIS+:

int sethostent(int stayopen);struct hostent *gethostent(void);int endhostent(void);

Wszystkie z funkcji: gethostbyname(), gethostbyaddr(), gethostent() zwracają wskaźnik na statyczną strukturędanych w pamięci systemowej, dlatego nie można tych funkcji wykorzystywać w programach wielowątkowych.Zamiast nich należy korzystać z gethostbyname r(), gethostbyaddr r() i gethostent r(), które dodatkowo wyma-gają podania wskaźnika na bufor, gdzie zostaną zwrócone szukane dane, jego długości, oraz adresu zmiennejpełniącej funkcję zmiennej errno (w której zostanie umieszczony kod ewentualnego błędu).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-18

Page 130: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Usługi tłumaczenia nazw – DNS/NIS/NIS+

Usługi tłumaczenia nazw – przykład

#include <netdb.h>#include <sys/types.h>

int translate(const char *hostname)int res;struct hostent *hp;unsigned long int **pp;

hp = gethostbyname(hostname);if (hp!=NULL)

printf("Adres(y) IP:");for (pp = hp->h_addr_list; *pp; pp++)

printf(" %s", inet_ntoa(**pp));printf("\n");

fprintf(stderr, "błąd: %d\n", h_errno);return(h_errno);

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-19

Page 131: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Usługi tłumaczenia nazw – DNS/NIS/NIS+

Usługi tłumaczenia nazw – DNS/NIS/NIS+

Inne przydatne funkcje:

#include <netinet/in.h>#include <arpa/inet.h>

• char *inet ntoa(const struct in addr in);const char *inet ntop(int af, const void *src, char *dst, socklen t cnt);

Zwraca w statycznie zaalokowanym buforze reprezentację adresu w postaci ciągu znaków. inet ntoa:wyłącznie adresy klasy IPv4, inet ntop – niezależnie od wersji protokołu IP, także dla IPv6.

• unsigned long inet addr(const char *cp);int inet pton(int af, const char *src, void *dst);

W przeciwną stronę – przetwarza adres w postaci ciągu znakowego złożonego z 4 oktetów na reprezentacjęw postaci liczby 32-bitowej. Podobnie: inet addr wyłącznie IPv4, inet pton – różne wersje.

• unsigned long inet network(const char *cp);in addr t inet netof(struct in addr in);struct in addr inet makeaddr(const int net, const int lna;)Manipulownaie maskami sieciowymi i adresami hostów – przetwarzają odpowiednio adres IP na adressieci, albo z adresu sieci i numeru hosta tworzą kompletny adres IP.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-20

Page 132: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

9. Protokoły sieciowe Usługi tłumaczenia nazw – DNS/NIS/NIS+

Obsługa błędów funkcji serwera nazw

• Standardowo funkcje systemowe w przypadku błędów zwracają wartość -1, a informacja o przyczyniebłędu zostaje umieszczona w zmiennej errno.

• Uzyskany kod błędu można porównać z predefiniowanymi w plikach nagłówkowych wartościami (opisa-nymi na odpowiedniej stronie dokumentacji systemowej), albo na jego podstawie odszukać odpowiednikomunikat o błędzie (funkcje strerror(), strerror r() i perror()).

• W funkcjach sieciowych tłumaczenia nazw, definiowanych za pomocą #include <netdb.h>, analogicznąrolę pełni zmienna h errno.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 9-21

Page 133: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

10. Komunikacja TCP Nawiązywanie połączeń TCP

Komunikacja TCP

Nawiązywanie połączeń TCP

• Serwer rejestruje swoją usługęw systemie za pomocą funkcji listen(),a następnie oczekuje na połączenia zapomocą accept();

• Klient wywołuje funkcję connect(),podając adres serwera, z którym chcesię połączyć;

• Funkcje connect() i accept() sąfunkcjami blokującymi, tzn. powodująuśpienie procesu do momentuuzyskania połączenia z drugą stroną.

• Zaakceptowanie połączenia powodujeutworzenie przez proces serweranowego gniazdka, które jestgniazdkiem połączonym, podczas gdygłówne gniazdko (s1) może nadalsłużyć do przyjmowania kolejnychpołączeń.

socket()

bind()

connect()

read()

write()

s1=socket()

bind()

listen()

read(s2)

write(s2)

s2=accept(s1)

synchronizacja

wymiana danych

klient serwer

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 10-1

Page 134: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

10. Komunikacja TCP Nawiązywanie połączeń TCP

Nawiązywanie połączeń TCP

• Z punktu widzenia warstwy transportowej nawiązanie połączenia TCP wymaga przesłania trzech pakietów:

serwerklientczas

connect (klient, 12345, serwer, 23)

SYN

accept (serwer, 5001; klient, 12345)

SYN+ACK

ACK: serwer, 5001; klient, 12345ACK

• Klient wysyła żądanie połączenia na dobrze znany numer portu serwera.

• Serwer akceptuje połączenia tworząc nowe gniazdko potencjalnie zmieniając także numer portu po swojejstronie, tak że odpowiedź do klienta trafia z nowego gniazdka (i nowego numeru portu).

• Klient potwierdza nawiązanie połączenia akceptując numer portu serwera, który mógł ulec zmianie.

W analogiczny sposób połączenie jest kończone– są to kolejno pakiety z ustawionymi opcjami FIN, FIN+ACK,ACK.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 10-2

Page 135: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

10. Komunikacja TCP Serwery współbieżne

Serwery współbieżne

Po zaakceptowaniu połączenia funkcją accept() serwer może niezależnie obsługiwać klienta, który się z nimpołączył, oraz nawiązywać nowe połączenia.

Wykorzystując funkcje nieblokujące lub inne mechanizmy, można to robić w jednym procesie, z reguły jednakwygodniej jest do obsługi połączonego klienta utworzyć nowy proces:

• Po wykonaniu accept() proces wykonujefork(), rozdzielając się na 2 procesy;

• Rodzic zamyka gniazdko s2 (połączonez klientem) i wraca w pętli do funkcjiaccept(), oczekując na nowe połączenia,a także od czasu do czasu „sprzątając” poprocesach potomnych za pomocą wait();

• Dziecko zamyka gniazdko s1, służące doakceptowania nowych połączeń, oraz inneniepotrzebne deskryptory przekazane muprzez rodzica, do komunikacji z klientemużywając jedynie gniazdka s2.

wymiana danych

synchronizacja

dziecko

rodzic

fork()

connect()

read()

write()

fork()

listen()

read(s2)

write(s2)

s2=accept()

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 10-3

Page 136: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

10. Komunikacja TCP Funkcja listen()

Funkcja connect()

#include <sys/types.h>#include <sys/socket.h>int connect(int s, const struct sockaddr *name, struct_t namelen);

• Funkcję można zastosować zarówno w przypadku gniazd strumieniowych (TCP) jak i datagramowych(UDP).

• TCP – nawiązuje połączenie z serwerem

• UDP – tworzy asocjację (przypisanie adresów do gniazdka)

• name określa adres drugiego gniazdka, z którym ma nastąpić połączenie (lub w przypadku UDP – asocjacja)

• jeśli do gniazdka s nie jest przypisany funkcją bind() żaden adres, to zostaje on nadany automatycznieprzez warstwę transportową w chwili nawiązania połączenia.

Funkcja listen()

int listen(int s, int backlog);

• Parametr backlog określa maksymalną wielkość kolejki połączeń oczekujących na zaakceptowanie funk-cją accept().

• Jeśli kolejka zostanie przepełniona, klienci zaczną otrzymywać błąd ECONNREFUSED w gniazdkach typuAF UNIX, a w gniazdkach AF INET – połączenia będą ignorowane po stronie serwera, a retransmitowanepo stronie klienta (aż do ETIMEDOUT).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 10-4

Page 137: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

10. Komunikacja TCP Funkcja shutdown()

Funkcja accept()

int accept(int s, struct sockaddr *addr, int *addrlen);

• Funkcja powoduje zablokowanie programu do czasu, gdy jest przynajmniej jedno zgłoszenie w kolejceoczekujących połączeń.

• Pierwsze zgłoszenie z kolejki zostaje zaakceptowane, tworząc nowe gniazdko, a w zmiennej addr zostająumieszczone dane na temat drugiej strony połączenia, o ile są znane.

• Wykonalność funkcji accept() można sprawdzić także za pomocą select() lub poll().

Funkcja shutdown()

int shutdown(int s, int how);

• Zamyka dwukierunkowe połączenie związane z gniazdkiem s całkowicie, lub tylko jednostronnie.

• 0: z gniazdka nic już nie będzie czytane;

• 1: do gniazdka już nic nie będzie pisane;

• 2: gniazdko zostaje zamknięte zarówno do pisania jak i do czytania.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 10-5

Page 138: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

10. Komunikacja TCP Przykład serwera protokołu TCP

Przykład serwera protokołu TCP

1 #define SERVPORT 800023 main (int argc,char ** argv) 4 int sock, newsock, pid, clen, port;5 struct sockaddr_in cl_addr, serv_addr;67 /* odczytanie numeru portu z linii komend */8 if (argc>1)9 port = atoi(argv[1]);10 else11 port = SERVPORT;1213 /* nadanie adresu gniazdku */14 if ((sock=socket(AF_INET, SOCK_STREAM, 0)) < 0)15 perror("serwer: nie można utworzyć gniazdka");16 memset(&serv_addr, 0, sizeof(serv_addr));17 serv_addr.sin_family = AF_INET;18 serv_addr.sin_addr.s_addr = INADDR_ANY;19 serv_addr.sin_port = htons(port);2021 if (bind(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0)22 perror("serwer: nie można nadać gniazdku adresu");2324 listen(sock, 5);25 /* od tej chwili wszystkie próby połączenia od klientów nie będą w programach26 * klientów zwracały błędu "Connection refused", lecz * programy te będą blokowane27 * do czasu, aż serwer zaakceptuje poszczególne * połączenia funkcją accept()28 */2930 while(1) /* oczekiwanie na połączenia z klientami */31 clen = sizeof(cl_addr);32 newsock = accept(sock, (struct sockaddr*) &cl_addr, &clen);33 if (newsock < 0)34 perror("serwer: błąd w funkcji accept()");

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 10-6

Page 139: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

10. Komunikacja TCP Przykład serwera protokołu TCP

35 else 36 switch (pid=fork()) 37 case 0: /* dziecko -- obsługuje dopiero co nawiązane połączenie */38 close (sock);39 ...40 read(newsock, ... ); write(newsock, ... );41 ...42 shutdown(newsock, ...);43 close(newsock);44 exit(0):45 case (-1):46 perror("błąd podczas fork()"); break;47 /* switch */48 /* else -- rodzic */49 close (newsock); /* rodzic wraca do oczekiwania na nowe połączenia */50 /* while */51 /* main */

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 10-7

Page 140: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

10. Komunikacja TCP Przykład klienta protokołu TCP

Przykład klienta protokołu TCP

1 #define SERVPORT 80002 #define SERVADDR "127.0.0.1"34 main (int argc,char ** argv)5 6 int sock, n, nw;7 struct sockaddr_in serv_addr;8 char *serv_ip;9 int serv_port10 char buf[1024];1112 if (argc>=3) 13 serv_ip = argv[1]; serv_port = atoi(argv[2]);14 else 15 serv_ip = SERVADDR; serv_port = SERVPORT;16 1718 /* ustalenie adresu serwera */19 memset(&serv_addr, 0, sizeof(serv_addr));20 serv_addr.sin_family = AF_INET;21 serv_addr.sin_addr.s_addr = inet_addr(serv_ip);22 serv_addr.sin_port = htons(serv_port);2324 if ((sock=socket(AF_INET, SOCK_STREAM, 0)) < 0)25 perror("klient: nie można utworzyć gniazdka");2627 if (connect(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0)28 perror("klient: nie można połączyć się z serwerem);2930 /* od tego momentu gniazdko sock jest połączone i możemy je traktować31 * tak, jak każdy inny deskryptor pliku czy strumienia pipe/fifo32 */3334 /* czytanie/pisanie danych do serwera */

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 10-8

Page 141: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

10. Komunikacja TCP Przykład klienta protokołu TCP

35 while ( (n=read(sock, buf, sizeof(buf))) >0) 36 ...37 nw = write(sock, ..., ... );38 ...39 if ( /* koniec połączenia inicjowany przez klienta: */ ) 40 write(sock, "koniec\n", 8);41 shutdown(sock, 1); /* nie będziemy już pisać, oczekujemy nadal na EOF */42 43 4445 if (n==0) /* EOF */46 shutdown(sock, 2);47 close(sock);48 else 49 perror("błąd funkcji read()");50 51

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 10-9

Page 142: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

10. Komunikacja TCP Przykład klienta protokołu TCP

Procesy uruchamiane przez inetd nie martwią sięo nawiązywanie połączenia, lecz komunikują się z klientemprzez swoje standardowe wejście i wyjście:

• inetd dla każdej usługi znalezionej w /etc/inetd.confprzydziela osobne gniazdko, przypisuje mu za pomocąbind() właściwy numer portu, wykonuje listen(), byzacząć nasłuchiwać na połączenia, po czym za pomocąselect() czeka, aż na którymś z nich można będziewykonać accept();

• Po przyjęciu zgłoszenia i wykonaniu fork(), procesmacierzysty:

– zamyka połączone gniazdko (s2);– jeśli w konfiguracji wystąpiła opcja wait, odłącza

się od głównego gniazdka, aż do chwili, gdy procespotomny się zakończy;

– dalej nasłuchuje na gniazdku głównym, wprzypadku nowait;

• Proces potomny kopiuje połączone gniazdko s2 dodeskryptorów 0, 1 i 2, zamyka wszystkie pozostałeotwarte deskryptory, jeśli trzeba – wykonuje setuid() isetgid(), po czym uruchamia odpowieni program zapomocą exec().

wymiana danych

synchronizacja

dziecko

rodzicfork()

connect()

read()

write()

fork()

listen(s1)

read(0);

write(1);

select(...);

s2=accept();

dup2(s2,0);

dup2(s2,1);

setuid();

exec("rshd");

wait?: - zwalnia s1 - wait3(pid)

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 10-10

Page 143: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

10. Komunikacja TCP Przykład klienta protokołu TCP

Przykład serwera korzystającego z inetd

// Rodzic (inetd) nawiązuje połączenie i uruchamia dziecko w stanie po wykonaniu:// newsock = accept(sock, (struct sockaddr*) &cl_addr, &clen);// dup2(newsock,0)// dup2(newsock,1)

int res;

while ((res=read(0, ..., ...) > 0 ) // ... odczytanie komendy od klienta ...// ... reakcja na komendę ...

// wysłanie odpowiedzi do klientawrite(1, ..., ...);printf(...):

;// tak długo, jak długo połączenie pozostaje otwarte.

shutdown(0, 0); // nie będziemy już czytaćprintf("221 bye bye"shutdown(1, 1); // nie będziemy już pisać

exit(0); // wychodzimy, zamykając też wszystkie deskryptory, w tym we/wy.

W razie potrzeby adres IP/nazwę komputera klienta, który się połączył, można uzyskać za pomocą funkcjigetpeername() wywołanej na używanym gniazdku (czyli w tym przypadku – deskryptorze nr 0 lub 1). Własnyadres – getsockname().

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 10-11

Page 144: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

11. Komunikacja UDP

Komunikacja UDP

• Gniazdka SOCK DGRAM, używane w komunikacji UDP, są bezpołączeniowe, więc nie trzeba nawiązywaćpołączenia funkcjami takimi, jak connect() i accept().

• Konieczne jest zarejestrowanie w systemie chęci otrzymywania pakietów wysyłanych na żądany numerportu, co wymaga nadania nazwy gniazdku funkcją bind().

Typowa kolejność wołania funkcji systemowych w komunikacji UDP:

• Funkcja bind() nadaje nazwę gniazdku(lokalny adres i lokalny numer portu),tworząc półasocjację.

• sendto() wymaga każdorazowegopodania adresu drugiej strony, doktórej jest wysyłany pakiet.

• recvfrom() wymaga każdorazowodostarczenia zmiennej, w którejzostanie zwrócony adres strony, któraprzysłała pakiet. wymiana danych UDP

socket()

bind()

sendto()

recvfrom()

socket()

bind()

recvfrom()

sendto()

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 11-1

Page 145: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

11. Komunikacja UDP

socket()

bind()

sendto()

socket()

bind()

recvfrom()

sendto()

pakiet UDP

sendto()

recvfrom()

pakiet UDP

• Nie ma żadnej synchronizacji po-między procesami.

• Po zarejestrowaniu chęci otrzy-mywania pakietów (funkcjąbind()) tworzona jest kolejka, doktórej są zapisywane przychodzą-ce pakiety.

• Warstwa transportowa nie zapew-nia niezawodności przesyłanychdanych nawet po zarejestrowaniugniazdka – pakiety mogą ginąćlub przychodzić w kilku kopiach.

• Pakiety przychodzące przed wy-konaniem funkcji bind() są odrzu-cane (bez potwierdzenia).

• Pakiety przychodzące po wykona-niu funkcji bind() są kolejkowa-ne i dostarczane do aplikacji, powywołaniu przez nią funkcji re-cvfrom().

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 11-2

Page 146: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

11. Komunikacja UDP Funkcje recvfrom() i sendto()

Funkcje recvfrom() i sendto()

#include <sys/types.h>#include <sys/socket.h>#include <sys/uio.h>

ssize_t recvfrom(int s, void *buf, size_t len, int flags,struct sockaddr *from, socklen_t *fromlen);

ssize_t sendto(int s, const void *msg, size_t len, int flags,const struct sockaddr *to, socklen_t tolen);

ssize_t recv(int s, void *buf, size_t len, int flags);ssize_t send(int s, const void *msg, size_t len, int flags);

• sendto() wysyła dostarczony pakiet na adres przekazany w zmiennej wskazywanej przez from;

• recvfrom() w zmiennej wskazywanej przez from umieszcza adres nadawcy pakietu, a długość tego adresuw zmiennej wskazywanej przez fromlen, chyba że from==NULL.

• send() i recv() wymagają wcześniejszego utworzenia pełnej asocjacji (za pomocą funkcji connect()), wktórej zawarty jest adres drugiej strony.

• Podanie w opcjach recvfrom() i recv() stałej MSG PEEK powoduje podglądnięcie dostępnych danych, bezich „konsumowania”.

• recvfrom() i recv() są funkcjami blokującymi.Jeśli pożądane jest, by funkcja nie blokowała aplikacji przy braku komunikatu, można skorzystać z funkcjiselect() lub przestawić gniazdko w tryb nieblokujący, za pomocą fcntl(). W takim przypadku recvfrom()i recv() mogą zwrócić wartość −1 i ustawić zmienną errno na EWOULDBLOCK.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 11-3

Page 147: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

11. Komunikacja UDP Korzystanie z connect()

Korzystanie z connect()

• Działanie funkcji connect()w przypadku gniazdek typuSOCK DGRAM ogranicza się dozarejestrowania w systemiepełnej asocjacji związanej zkominikacją, a więc także adresudrugiej strony.

• Po wykonaniu connect()z podanym adresem drugiejstrony, w dalszej komunikacjimożna używać także funkcjirecv() i send().

• W trakcie komunikacji możnawielokrotnie wołać connect()z różnymi adresami, zmieniającistniejącą asocjację.

• Po wywołaniu connect() z pustymadresem, ustanowiona wcześniejasocjacja zostaje usunięta i dalszakomunikacja możliwa jestwyłącznie za pomocą funkcjirecvfrom() i sendto().

pakietyUDP

socket()

bind()

send()

recv()

socket()

bind()

send()

recv()

recvfrom()

sendto()

connect() connect()

recvfrom()

sendto()

close()

nadanie adresu

przypisanie adresudrugiej strony

utworzenie gniazdka

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 11-4

Page 148: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

11. Komunikacja UDP Przykład serwera protokołu UDP

Przykład serwera protokołu UDP1 #define PORT 70002 main (int argc,char ** argv)3 4 int sock, cl_len, n;5 struct sockaddr_in serv_addr, cl_addr;67 if ((sock=socket(AF_INET, SOCK_DGRAM, 0)) < 0)8 perror("server: nie można utworzyć gniazdka");910 memset(&serv_addr, 0, sizeof(serv_addr));11 serv_addr.sin_family = AF_INET;12 serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);13 serv_addr.sin_port = htons(PORT);1415 if (bind(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0)16 perror("serwer: nie można nadać gniazdku lokalnego adresu");17 cl_len=sizeof(cl_addr):18 n = recvfrom(sock, buf, sizeof(buf), 0, &cl_addr, &cl_len);1920 if (n<0)21 perror("serwer: błąd w funkcji recvfrom());2223 strcpy(buf, "dane wysyłane do klienta");24 n=sendto(sock, buf, strlen(buf)+1, &cl_addr, cl_len);2526 if (n != strlen(buf)+1) 27 perror("serwer: błąd wysylania danych - sendto()");28 29 close(sock);30

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 11-5

Page 149: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

11. Komunikacja UDP Przykład klienta protokołu UDP

Przykład klienta protokołu UDP

1 #define PORT 70002 #define SERWER "localhost"3 #define SERWER_IP "127.0.0.1"45 main (int argc,char ** argv)6 7 int sock;8 struct sockaddr_in serv_addr, cl_addr;9 struct hostent *hname;1011 if ((sock=socket(AF_INET, SOCK_DGRAM, 0)) < 0)12 perror("klient: nie można utworzyć gniazdka");1314 memset(&serv_addr, 0, sizeof(serv_addr));15 serv_addr.sin_family = AF_INET;16 serv_addr.sin_addr.s_addr = inet_addr(SERWER_IP);17 serv_addr.sin_port = htons(PORT);1819 if (argc>1) 20 hname=(gethostbyname(argv[1]));21 if (hname != NULL) 22 memcpy(&serv_addr.sin_addr, hname->h_addr_list[0], hname->h_length);23 /* kopiujemy tylko pierwszy znaleziony adres, w bardziej rozbudowanej24 wersji powinniśmy próbować wszystkich po kolei, do skutku */25 26 2728 memset(&cl_addr, 0, sizeof(cl_addr));29 cl_addr.sin_family = AF_INET;30 cl_addr.sin_addr.s_addr = htonl(INADDR_ANY);31 cl_addr.sin_port = htons(0);3233 if (bind(sock, (struct sockaddr*) &cl_addr, sizeof(cl_addr)) < 0)34 perror("klient: nie można nadać gniazdku lokalnego adresu");

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 11-6

Page 150: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

11. Komunikacja UDP Przykład klienta protokołu UDP

35 ...36 n=sendto(sock, "test", strlen("test"), &serv_addr, sizeof(serv_addr));37 if (n != strlen("test")) 38 /* błąd wysyłania */39 ...40 41 ...42 close(sock);43 exit(0);44

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 11-7

Page 151: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

12. Zaawansowane zagadnienia dotyczące gniazd Funkcje wysyłania i odbierania danych

Zaawansowane zagadnienia dotyczące gniazd

Funkcje wysyłania i odbierania danych

#include <unistd.h>#include <sys/uio.h>

ssize_t readv(int fildes, const struct iovec *iov, int iovcnt);ssize_t writev(int fildes, const struct iovec *iov, int iovcnt);

#include <sys/types.h>#include <sys/socket.h>

ssize_t recvmsg(int s, struct msghdr *msg, int flags);ssize_t sendmsg(int s, const struct msghdr *msg, int flags);

struct msghdr caddr_t msg_name; /* opcjonalny addres */int msg_namelen; /* wielkość addresu */struct iovec *msg_iov; /* tablica fragmentów danych */int msg_iovlen; /* liczba elementów msg_iov */caddr_t msg_accrights;int msg_accrightslen;

• readv() i writev() pozwalają zminimalizować konieczność kopiowania fragmentów danych z pamięci dobufora pamięci, który byłby użyty w standardowych funkcjach read() i write().

• readmsg() i sendmsg() pozwalają na minimalizację kopiowania danych w przypadku komunikacji UDP(można ich użyć zamiast recvfrom() i sendto()).

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 12-1

Page 152: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

12. Zaawansowane zagadnienia dotyczące gniazd Zwielokrotnione wejście/wyjście

Zwielokrotnione wejście/wyjście

• Pisanie serwerów współbieżnych wymaga obsługi wielu klientów jednocześnie.

• Najprościej, choć wcale nie najefektywniej – dla każdego klienta uruchamiać osobny proces serwera.

• Obsługa wszystkich klientów przez jeden serwer – nie można sobie pozwolić na blokowanie serweraw oczekiwaniu na dane od jednego z klientów, podczas gdy gotowe są już dane od innego.

Możliwe wyjścia z sytuacji:

• korzystanie z gniazd nieblokujących (użycie fcntl(FNDELAY) lub ioctl(FIONBIO)).

– aktywne odpytywanie, które gniazdo jest gotowe,– sprawdzanie wartości EWOULDBLOCK przy każdej operacji wejścia/wyjścia (read(), accept(), itp.)

• korzystanie z asynchronicznego wejścia/wyjścia

– przechwytywanie sygnałów jest kosztowne,– otrzymanie sygnału nie informuje o tym który deskryptor jest gotowy – trzeba przebadać wszystkie.

• korzystanie z funkcji select() lub poll()

– pozwala określić listę deskryptorów, które nas interesują,– powoduje oczekiwanie na gotowość dowolnego z tych deskryptorów w sposób bierny (umieszczając

proces w kolejce oczekujących na spełnienie warunku),– każda z tych funkcji może zostać zakończona po upływie zadanego czasu, nawet jeśli żaden z deskryp-

torów nie jest gotowy do zapisu/odczytu.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 12-2

Page 153: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

12. Zaawansowane zagadnienia dotyczące gniazd Zwielokrotnione wejście/wyjście

Funkcja select()

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *errorfds, struct timeval *timeout);

void FD_ZERO(fd_set *fdset);void FD_SET(int fd, fd_set *fdset);void FD_CLR(int fd, fd_set *fdset);

int FD_ISSET(int fd, fd_set *fdset);

• Listy deskryptorów są upakowane w zmiennych readfds, writefds i errorfds, po 1 bit na deskryptor;

• Do manipulowania tymi listami służą makra takie, jak FD ZERO, zerujące listę, czy FD SET, ustawiające bitodpowiedający podanemu deskryptorowi pliku, gniazda, strumienia FIFO itp.

• Jeśli lista jest pusta, można zamiast niej podać wskaźnik NULL;

• Struktura timeout określa maksymalny czas oczekiwania na dostępność określonych deskryptorów.

struct timeval long tv_sec; /* sekundy */long tv_usec; /* mikrosekundy */;

Sposób interpretowania tego czasu:

– Powróć natychmiast, jeśli żaden deskryptor nie jest gotowy: struktura *timeout wypełniona zerami;– Czekaj zadany czas: jeśli wartości w *timeout nie są obie równe zero;– Czekaj w nieskończoność (aż któryś z deskryptorów będzie gotów): timeout == NULL.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 12-3

Page 154: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

13. Zaawansowane zagadnienia dotyczące gniazd Programowanie w systemie UNIX – podsumowanie

Programowanie w systemie UNIX – podsumowanie

• Funkcje systemowe w przypadku błędów zwracają wartość −1, a informacja o przyczynie błędu zostajeumieszczona w zmiennej errno

• Standardowo funkcje we/wy są blokujące – jeśli żądanej czynności nie można wykonać od razu, procesjest usypiany, nie zajmując przez to czasu procesora w aktywnej pętli oczekiwania.

• Nieblokujące wejście/wyjście można uzyskać na różne sposoby:

– Ustawiając odpowiednie opcje deskryptora pliku (fcntl() – od tego momentu wszystkie operacje nadeskryptorze są nieblokujące).

– Poprzez użycie odpowiednich opcji w funkcji (np. IPC NOWAIT w funkcjach IPC).– Pozwalając na ewentualne blokowanie funkcji, ale przerwanie jej za pomocą sygnału (np. SIGALARM).

• Problem jednoczesnej obsługi wielu deskryptorów plików lepiej powierzyć funkcjom takim jak select()lub poll() blokując proces w oczekiwaniu na jeden z wielu warunków, niż stosować nieblokujące we/wy.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 13-1

Page 155: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

Literatura

[1] Maurice J. Bach. Budowa systemu operacyjnego UNIX. Wydawnictwa Naukowo-Techniczne, 2 edition, 1995.oryginał: “The Design of the UNIX Operating System”, Prentice Hall, Inc., 1986.

[2] M. Ben-Ari. Podstawy programowania współbieżnego. Wydawnictwa Naukowo-Techniczne, 1 edition, 1989.oryginał: “Principles of Concurrent Programming”, Prentice-Hall International (UK) Ltd., 1983.

[3] Abraham Silberschats, James L. Peterson, and Peter B. Galvin. Podstawy systemów operacyjnych. Wy-dawnictwa Naukowo-Techniczne, 2 edition, 1993. oryginał: “Operating System Concepts”, Addison-WesleyPublishing Company, Inc., 1991.

[4] W. Richard Stevens. Programowanie zastosowań sieciowych w systemie Unix. Wydawnictwa Naukowo-Techniczne, 1 edition, 1995. oryginał: “UNIX Network Programming”, Prentice Hall, Inc., 1990.

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 14-1

Page 156: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

Skorowidz., 1-17/, 1-6/etc/exports, 1-6/etc/fstab, 1-6/etc/hosts, 9-17, 9-18/etc/inetd.conf , 10-10/etc/mntab, 1-6/etc/nsswitch.conf , 9-17/etc/passwd, 1-10/etc/resolv.conf , 9-17/etc/services, 8-26, 9-5, 9-6/etc/shadow , 1-10/usr/include, 1-17/usr/include/netinet/in.h, 9-14/usr/include/signum.h, 2-9/usr/include/sys/signal.h, 2-9/usr/lib, 1-17/usr/lib/libc.a, 1-8/usr/lib/libsocket.so.2, 1-8/usr/local/include, 1-17/usr/local/lib, 1-17exit(), 6-12

accept(), 10-1, 10-3–10-5, 10-10, 11-1, 12-2

bg, 2-3bind(), 9-11, 9-14, 9-15, 10-4, 10-10, 11-1, 11-2

close(), 3-1, 9-10connect(), 10-1, 10-4, 11-1, 11-3, 11-4

dup(), 3-6dup2(), 3-6

exec(), 2-5, 2-7, 2-8, 3-7, 6-11, 6-12, 10-10execl(), 2-7execle(), 2-7execlp(), 2-7execv(), 2-7execve(), 2-7execvp(), 2-7exit(), 2-8, 2-10, 5-9, 7-3

fcntl(), 2-7, 3-2, 3-3, 11-3, 12-2, 13-1fg, 2-3fork(), 2-1, 2-4–2-6, 6-11, 8-26, 10-3, 10-10fprintf (), 3-1

14-2

Page 157: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

gethostbyaddr(), 9-18gethostbyaddr r(), 7-11, 9-18gethostbyname(), 7-11, 9-18gethostbyname r(), 7-11, 9-18gethostent(), 9-18gethostent r(), 7-11, 9-18getpeername(), 10-11getpid(), 2-5getppid(), 2-5getservbyname(), 9-5, 9-6getservbyname r(), 9-6getservbyport(), 9-5, 9-6getservbyport r(), 9-6getservent(), 9-5, 9-6getservent r(), 9-6getsockname(), 10-11

htonl(), 8-25, 9-17htons(), 8-25

ioctl(), 3-2, 12-2ipcrm, 4-5ipcs, 4-5

jobs, 2-3

kill, 2-3

kill(), 2-5

ld.so, 1-9libc.so, 1-8, 1-9, 2-4libm.so, 1-9libnsl.so, 1-9libsocket.so, 1-9libX11.so, 1-9listen(), 10-1, 10-4, 10-10

main(), 2-7mkfifo(), 3-10mknod, 3-10mknod(), 3-10msgctl(), 4-5msgget(), 4-4msgrcv(), 4-8mutex destroy(), 7-2mutex init(), 7-2mutex lock(), 7-2mutex trylock(), 7-2mutex unlock(), 7-2

nice, 2-1, 2-7ntohl(), 8-25, 9-17ntohs(), 8-25

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 14-3

Page 158: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

open(), 3-10opendir(), 7-11

pclose(), 3-8perror(), 9-21pipe(), 3-1, 9-13poll(), 10-5, 12-2, 13-1popen(), 3-8, 3-9printf (), 1-8ps, 2-3pthread cancel(), 7-3pthread cond broadcast(), 7-5pthread cond init(), 7-2pthread cond signal(), 7-2, 7-5pthread cond timedwait(), 7-2pthread cond wait(), 7-2, 7-4, 7-5pthread create(), 7-2pthread detach(), 7-2pthread exit(), 7-2, 7-3pthread join(), 7-2, 7-3pthread mutex destroy(), 7-2pthread mutex init(), 7-2pthread mutex lock(), 7-2, 7-4pthread mutex trylock(), 7-2pthread mutex unlock(), 7-2, 7-5

read(), 3-1–3-3, 3-10, 9-10, 12-1, 12-2readdir(), 7-11readdir r(), 7-11readmsg(), 12-1readv(), 12-1recv(), 11-3, 11-4recvfrom(), 11-1–11-4, 12-1rresvport(), 9-15

sched yield(), 7-2select(), 3-3, 10-5, 10-10, 11-3, 12-2, 12-3, 13-1sem init(), 7-2sem trywait(), 7-2sem wait(), 7-2semctl(), 5-8semget(), 5-7semop(), 5-12send(), 11-3, 11-4sendmsg(), 12-1sendto(), 11-1, 11-3, 11-4, 12-1setgid(), 10-10setpgrp(), 2-10setuid(), 10-10sh, 3-9shmat(), 6-7shmctl(), 6-6

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 14-4

Page 159: Sieciowe Systemy Operacyjne - dream.ict.pwr.wroc.pl · •Silberschatz, Abraham – Podstawy systemów operacyjnych • Ben-Ari, M. – Podstawy programowania współbieżnego Tomasz

shmdt(), 6-7shmget(), 6-5shutdown(), 10-5sigaction(), 4-8sighold(), 2-9sigignore(), 2-9signal(), 2-9, 5-12sigpause(), 2-9sigrelse(), 2-9sigset(), 2-9socket(), 9-10, 9-12socketpair(), 9-10, 9-13strerror(), 9-21strerror r(), 9-21

thr create(), 7-2thr exit(), 7-2, 7-3thr join(), 7-2thr yield(), 7-2

umask, 2-7unlink(), 3-10

vfork(), 6-11

wait(), 2-5, 2-10, 3-8, 7-3, 10-3write(), 3-1, 3-2, 3-10, 9-10, 12-1

writev(), 12-1

Zajmij(), 5-3, 5-4Zwolnij(), 5-3, 5-4

Tomasz Surmacz, Sieciowe Systemy Operacyjne, INEU 006, 2015/2016 14-5