© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Wykład z Programowania Sieciowego
Programowanie wielowątkowe
i komunikacja międzyprocesowa
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Tematyka wykładu
Wielowątkowość i
serwery sieciowe
Procesy
Wątki
Komunikacja międzyprocesowa
Synchronizacja
•
Wielowątkowość w systemie UNIX
•
R Stevens
„
Programowanie usług sieciowych w systemie Unix tom 2 WNT
2001
Programowanie wielowątkowe w systemie UNIX
1.
Pojęcie wielowątkowości
2.
Typy wielowątkowości w systemie UNIX
Program wieloprocesowy
1.
Program wielowątkowy
3.
Systemy operacyjne i wielowątkowość
1.
Tworzenie wątków
1.
fork, exec , exit
2.
pthreads
4.
Komunikacja między-procesowa
1.
Pipes and fifos
2.
Message Queues
3.
Mutexes Condition Variables
4.
Read-Write Lock
5.
Rekord Locking
6.
Semaphores
1.
Posix
2.
System V
7.
Shared Memory
WIELOWĄTKOWOŚĆ
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Typologia serwerów
Typy serwerów
Serwer
jednowątkowy
Serwer
wielowątkowy
Serwer pozornie
wielowątkowy
Obsługa klienta
Oczekiwanie
Zalety
• Prostota implementacji
• Nadaje się do systemów
operacyjnych/środowisk jednowątkowych
• Małe wymagania pamięciowe
Wady
• Nadaje się tylko do usług krótkotrwałych
• Klient blokując swoją sesje blokuje cały
serwer
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Utworzenie nowego
procesu
Oczekiwanie
Wątek
główny
Typologia serwerów
Typy serwerów
Serwer
jednowątkowy
Serwer
wielowątkowy
Serwer pozornie
wielowątkowy
Stop
Start
Obsługa
klienta
Stop
Start
Obsługa
klienta
Zalety
•
Implementacja umiarkowanie trudna
•
Obsługuje wielu klientów jednocześnie
•
Nadaje się do usług krótko i długotrwałych
•
Odporny na błędy. Klient blokując swoją sesję
nie ma wpływu na pozostałych klientów
Wady
•
Stosunkowo powolny
•
Możliwy do
zaimplementowania w
systemach operacyjnych
wspierających
wielowątkowość
•
Wymaga sporych zasobów
pamięciowych
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Typologia serwerów
Typy serwerów
Serwer
jednowątkowy
Serwer
wielowątkowy
Serwer pozornie
wielowątkowy
E.O. klient 1
Sprawdzenie
E.O. klient 2
....
E.O. klient n
Dołączenie
nowego klienta
Zalety
•
Szybki w działaniu
•
Obsługuje wielu klientów jednocześnie
•
Nadaje się do usług krótko i długotrwałych
•
Możliwy do zaimplementowania w systemach
nie wspierających wielowątkowości
Wady
•
Trudny do implementacji
•
Łatwy do zawieszenia przez
klientów
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Typologia serwerów
serwery przechowujące stan interakcji ( stanowe )
serwer nie przechowujący stanu interakcji (bez-stanowy)
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Procesy
Stos
Stan Procesora
Stos
Stan Procesora
Zmienne
globalne
Sterta
zmiennych
dynamicznych
Zmienne
globalne
Sterta
zmiennych
dynamicznych
Program 1
Program 2
System
operacyjny
System
operacyjny
Sprzęt
Sprzęt
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Wątki w ramach procesu
Stos
Stan Procesora
Stos
Stan Procesora
Zmienne globalne
Sterta zmiennych dynamicznych
System
operacyjny
System
operacyjny
Sprzęt
Sprzęt
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Procesy programy i wątki
• Program to zbiór rozkazów procesora zorganizowany w
postaci pliku dyskowego czytelnego dla systemu
operacyjnego.
• Proces to reprezentacja programu w pamięci systemu
operacyjnego połączona ze strukturami systemu takimi
jak kontekst procesu.
• Wątki są składnikami procesu
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Procesy i programy
Diagram przejść międzystanowych procesu
TW Wykonywany w trybie użytkownika
TJ Wykonywany w trybie jądra
RD Gotowy do wykonania
Z Stan zombie
ŚP Śpi w pamięci
ŚD
Śpi w pamięci SWAP
RDD Gotowy do wykonania w pamięci SWAP
U Utworzony
W
Wywłaszczony
TU
TJ
RD
ŚP
ŚD
RDD
U
W
Z
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Funkcja select
Definicja
int select ( int nfds, fd_set FAR* readfds,
fd_set FAR* writefds, fd_set FAR* exceptfds,
const struct timeval FAR * timeout );
\nfds
- ilość deskryptorów testowanych funkcją select. W Windows parametr
ignorowany
readfds/writefds/except - wskaźnik do struktury fd_set zawierającej deskryptory
testowane na
możliwość odczytu/zapisu/obecność danych
pilnych
timeout - ilość czasu w [ms], którą funkcja select czeka na wystąpienie zdarzenia
na testowanych deskryptorach
Parametry
Funkcja czeka na wystąpienie zdarzenia na jednym z wyspecyfikowanych
deskryptorów. Zdarzeniem jest gotowość urządzenia do odczytu , zapisu lub
wystąpienie błędu
Opis
Ilość deskryptorów dla których zaszło zdarzenie wyzwalające w przypadku
sukcesu lub wartość SOCKET_ERROR w przypadku błędu
Wartość zwrotna
Windows NT: Tak
Windows: Tak
Windows CE: W wersji 1.0 i późniejszych.
Nagłówek: Zadklarowana w winsock2.h.
Biblioteka importowa: ws2_32.lib.
accept, connect, recv, recvfrom, send,
WSAAsyncSelect, WSAEventSelect
Patrz także
Informacja skrótowa
struct fd_set {
u_int fd_count;
SOCKET fd_array[ FD_SETSIZE ];
} fd_set;
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Funkcja fork
Definicja
pid_t fork(void);
brak
Parametry
Tworzy nowy proces , który jest dokładną kopią istniejącego programu.
Proces tworzący nowy wątek jest procesem rodzicielskim , proces utworzony
jest procesem potomnym.
Opis
Proces rodzicielski identyfikator procesu potomnego
Proces potomny 0
Wartość zwrotna
Windows NT: Nie
Windows: Nie\
Windows CE: Nie
Linux : Tak
Solaris: Tak
fork1, alarm(2),exec(2),exit(2),fcntl(2),getitimer(2),
getrlimit(2),memcntl(2), mmap(2), nice(2), priocntl(2),
ptrace(2), semop(2), shmop(2), times(2), umask(2), wait(2),
exit(3C), plock(3C), pthread_atfork(3T), signal(3C),
system(3S), thr_create(3T) timer_create(3R),
attributes(5),standards(5)
Patrz także
Informacja skrótowa
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Funkcja fork
Definicja
pid_t fork(void);
brak
Parametry
Tworzy nowy proces , który jest dokładną kopią istniejącego programu.
Proces tworzący nowy wątek jest procesem rodzicielskim , proces utworzony
jest procesem potomnym.
Opis
Proces rodzicielski identyfikator procesu potomnego
Proces potomny 0
Wartość zwrotna
Windows NT: Nie
Windows: Nie\
Windows CE: Nie
Linux : Tak
Solaris: Tak
fork1, alarm(2),exec(2),exit(2),fcntl(2),getitimer(2),
getrlimit(2),memcntl(2), mmap(2), nice(2), priocntl(2),
ptrace(2), semop(2), shmop(2), times(2), umask(2), wait(2),
exit(3C), plock(3C), pthread_atfork(3T), signal(3C),
system(3S), thr_create(3T) timer_create(3R),
attributes(5),standards(5)
Patrz także
Informacja skrótowa
....
if ( pid = fork() )
{
...
} else
{
}
....
if ( pid = fork() )
{
// PROCES RODZICIELSKI
} else
{
....
if ( pid = fork() )
{
...
}else
{
// PROCES POTOMNY
}
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Współpraca procesów i wątków
Proces 1
Proces 2
Jądro systemu
System Plików
Proces 1
Proces 2
Jądro systemuStr. Jądra
Proces 1
Proces 2
Pamięć
współdzielona
Wymiana danych za
pośrednictwem systemu plików
Wymiana danych za
pośrednictwem struktur jądra
Wymiana danych za
pośrednictwem pamięci dzielonej
IPC
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Mechanizmy IPC
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Trwałość obiektów IPC
Proces 1
Jądro systemu
System Plików
•
Trwałość w ramach Procesu
•
Trwałość w ramach Jądra
•
Trwałość w ramach systemu plików
Obiekt IPC jest usuwany
najpóźniej wtedy gdy
proces który go utworzył
kończy działanie
Obiekty trwają najpóźniej do momentu
jawnego usunięcia lub zakończenia
działania systemu
Obiekty trwają do momentu
jawnego usunięcia
Obiekt IPC
Trwałość
Łącze komunikacyjne
FIFO
Proces
Mutex ( posix )
Zmienna warunkowa (
posix)
Rygiel RW( posix )
Rygiel rekordów
( posix )
Semafor w pamięci
Proces
Kolejka komunikatów
Nazwany semafor
Pamięć współdzielona
Jądro
Kolejka komunikatów
Semafor
Pamięć współdzielona
Jądro
Gniazdo TCP/UDP
Gniazdo UNIX
Proces
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
POSIX IPC
Kolejki
komunikató
w
Semafory
Pamięć
współdzielo
na
Tworzen
ie/
usunięci
e
mq_open
mq_close
mq_unlink
sem_open
sem_clos
e
sem_unlin
k
sem_init
sem_destr
oy
shm_open
shm_unlink
Zmiana
paramet
rów
mq_getattr
mq_setattr
ftruncate
fstat
Wymian
a
danych/
operowa
nie na
mq_send
mq_receive
mq_notify
sem_wait
sem_tryw
ait
sem_post
sem_getv
alue
mmap
munmap
S_TYPEISMQ
S_TYPEISSEM
S_TYPEISSHM
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
POSIX IPC
Kolejki
komunikató
w
Semafory
Pamięć
współdzielo
na
Tworzen
ie/
usunięci
e
mq_open
mq_close
mq_unlink
sem_open
sem_clos
e
sem_unlin
k
sem_init
sem_destr
oy
shm_open
shm_unlink
Zmiana
paramet
rów
mq_getattr
mq_setattr
ftruncate
fstat
Wymian
a
danych/
operowa
nie na
mq_send
mq_receive
mq_notify
sem_wait
sem_tryw
ait
sem_post
sem_getv
alue
mmap
munmap
S_TYPEISMQ
S_TYPEISSEM
S_TYPEISSHM
Pobranie statusu pliku
lstat, fstat, stat
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
POSIX IPC
Kolejki
komunikatów
Semafory
Pamięć
współdzielo
na
Tworzenie/
usunięcie
mq_open
sem_open
shm_open
Odczyt/zapis
O_RDONLY
O_WRONLY
O_RDWR
O_RDONLY
O_RDWR
Utworzenie/
wyłączność/inne
O_CREAT
O_EXCL
O_NONBLOCK
O_CREAT
O_EXCL
O_TRUNC
Int xxx_open( const char *name, u_int oflag )
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Funkcja _beginthread
Definicja
unsigned long _beginthread( void ( __cdecl
*start_address )( void * ), unsigned stack_size, void
*arglist );
start_addres
- wskaźnik do funkcji wątku
addr
- rozmiar stosu
arglist
- wskaźnik do danych przekazywanych do funkcji wątku
Parametry
Funkcja tworzy nowy wątek wykonania aplikacji. Wątek ten tworzony jest na
podstawie funkcji podanej pierwszym argumentem. Dla utworzonego wątku
przydzielany jest stos o rozmiarze podanym drugim argumentem
Opis
-1 w przypadku błędu , 0 w przypadku powodzenia
Wartość zwrotna
Windows NT: Tak
Windows: Tak
Windows CE: W wersji 1.0 i późniejszych.
Nagłówek: process.h
Biblioteka importowa: libcmt.lib lub
msvcrt.lib
_beginthreadex
, CreateThread,
_endthread, _endthreadex
ExitThread, CloseHandle, select
Patrz także
Informacja skrótowa
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Łącza i kolejki FIFO
#include <unistd.h>
int pipe( int fd[2] );
fd[0] - ODCZYT
fd[1] - ZAPIS
ls –la | grep „ala*” | rm
pipe_main.cpp
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Łącza i kolejki FIFO
#include <unistd.h>
int pipe( int fd[2] );
ls –la | grep „ala*” | rm
pipe_main.cpp
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Łącza i kolejki FIFO
#include <unistd.h>
FILE *popen(const char *cmd, const char *type );
int pclose( FILE *stream );
Proces
potomny
Proces
rodzicielski
fifo.c
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Łącza i kolejki FIFO
FIFO umożliwiają jednokierunkowy przepływ danych)
Proces
potomny
Proces
rodzicielski
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Kolejki komunikatów
Standard POSIX
#include <mqueue.h>
mqd_t mq_send ( mqd_t dscr, const char *ptr, size_t len, unsigned int prio ) ;
mqd_t mq_receive ( mqd_t dscr, char *ptr, size_t len, unsigned int *prio ) ;
© 2008 dr inż.. Sławomir Jeżewski
Katedra Informatyki Stosowanej PŁ
Programowanie Sieciowe
Muteksy
Standard POSIX
Mutex (mutual exclusion) – jedna z form synchronizacji procesów koncepcyjnie
polegająca na wykluczających się alternatywach
CreateMutex
. . .
lock_the_mutex
. . .
unlock_mutex
#include <pthread.h>
int pthread_mutex_lock ( pthread_mutex_t *p ) ;
int pthread_mutex_trylock ( pthread_mutex_t *p ) ;
int pthread_mutex_unlock ( pthread_mutex_t *p ) ;
#include <pthread.h>
int pthread_mutex_init ( pthread_mutex_t *p, const pthread_mutexattr_t *attr ) ;
int pthread_mutex_destroy ( pthread_mutex_t *p ) ;