I/O Multiplexing select() e poll()



Documenti analoghi
I/O Multiplexing select() e poll()

Funzioni bloccanti e soluzioni

I/O su Socket TCP: read()

Protocolli applicativi

Timeout. Socket Avanzati. Funzione alarm() Client echo UDP con alarm

Problema. I/O Multiplexing. Struttura delle Operazioni di Lettura. Modelli di I/O. Prof. Vincenzo Auletta

Conversione di nomi e indirizzi. Corso di laurea in Informatica Laboratorio di Reti di Calcolatori A.A Simone Bassis bassis@dsi.unimi.

E.C.M. Educazione Continua in Medicina. Servizi web. Manuale utente

Pthread Posix Thread

Laboratorio Reti di Calcolatori (A.A ) Delfina Malandrino.

Funzioni bloccanti e soluzioni. Funzioni bloccanti e soluzioni (2) Parametri della funzione select() Funzione select()

Unix Socket. Corso di laurea in Comunicazione Digitale Laboratorio di Reti di calcolatori A.A Simone Bassis

ROBOMAIL 1.5 Configurazione

Opzioni del Socket. Socket Options. Opzioni di Livello Socket. Livello delle Opzioni

Laboratorio di. Reti Informatiche. Corso di Laurea Triennale in Ingegneria Informatica A.A. 2016/2017. Ing. Niccolò Iardella

Centro di competenza per la progettazione di sistemi dedicati

Aggiornamento remoto della chiave hardware

LABORATORIO di Reti di Calcolatori

Microsoft SQL Server 2005, 2008 R2 e 2012 Raccomandazioni Marzo 2013

e/fiscali - Rel

Novità relative all assessment tool

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

IToolS AT commands server. Version /11/2012

e/fiscali - Rel

DatagramSocket. Corso di laurea in Informatica Laboratorio di Reti di Calcolatori A.A Simone Bassis

E/Fiscali - Rel

Esempi di Client e Server

HR-COMUNICAZIONI rel

Acronis Backup & Recovery 10

Cenni di programmazione distribuita in C++ Mauro Piccolo

Pannello di controllo

CONTROLLO SCADENZA FIRMA DIGITALE. Come visualizzare la scadenza del certificato [data inizio e fine validità] relativo al Gestore certificati utente

ALTA VELOCITA SIMMETRICA

ATLAS Installazione : INSTALLAZIONE DI ATLAS SUL SERVER DI TEST CENTER

Installazione e creazione sito

Novità: Correzione di errori: Altro

GESTIRE E MANTENERE UN AMBIENTE WINDOWS SERVER 2003 PER MCSA WINDOWS 2000

Gestione Agenti. Software per il Calcolo provvigioni per Agenti e Venditori Software GESAGE - Specifiche del prodotto

SPEDIZIONE CONFIGURAZIONE ED INSTALLAZIONE AMBIENTE SYSINT/W

SIP. Bibliografia. o IETF, SIP: Session Initiation Protocol, rfc

Laboratorio di. Reti Informatiche. Corso di Laurea Triennale in Ingegneria Informatica A.A. 2016/2017. Ing. Niccolò Iardella

Sistemi operativi Modulo II I semafori 2 Select

Regione Calabria Dipartimento n.9 Lavori Pubblici ed Infrastrutture

Kleos per ipad. Guida rapida. Ver Help Desk: hd.avvocati@wki.it

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

Introduzione alle applicazioni di rete

Le Socket in C Invio e Ricezione Dati

Sincronizzazione e comunicazione tra processi in Unix. usati per trasferire ad un processo l indicazione che un determinato evento si è verificato.

INPS. Area Aziende. Procedura Internet per la trasmissione delle domande relative agli sgravi contrattazione di II livello per l anno 2009

HTTP adaptation layer per generico protocollo di scambio dati

MANUALE UTENTE (per il Modello di rilevazione in MS Excel)

LABORATORI DI INFORMATICA 1 MANUALE STUDENTE

Modalità di trasferimento dati tra. Amministrazioni Aeroportuali ed INPS

Via F. Lana, FLERO (BS) Tel Fax gruppo axelera.

Messaggio del servizio di assistenza clienti

Esercitazione [5] Input/Output su Socket

Manuale Utente. Data : 06/06/2012 Versione : 1.9

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Guida descrittiva del programma Gestione Magazzino

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Conversione di nomi e indirizzi. Corso di laurea in Informatica Laboratorio di Reti di Calcolatori A.A Simone Bassis

Guida per la compilazione on-line delle domande di partecipazione al concorso

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

ASP RAGUSA - Test verifica Recupero Dati - Patrimonio - Cespiti v1.0.docx. 29/07/2013 Antonio Derna

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

Laboratorio di Sistemi Operativi

L API socket ed i daemon

Programmazione dei socket con TCP #2

Laboratorio di Sistemi Operativi

Inizializzazione degli Host. BOOTP e DHCP

QUANDO WINDOWS XP NON SI AVVIA

1 INTRODUZIONE SCOPO DEL DOCUMENTO PANORAMICA DI IMAGICLE APPLICATIONSUITE 4 2 IMAGICLE STONEFAX UNA SOLUZIONE DI SERVER FAX IP

I Socket. Laboratorio Software M. Grotto R. Farina

La gestione informatizzata del farmaco

TRASMISSIONE DATI CON PROTOCOLLO XON-XOFF (1)

A. Ferrari. File. in C

J+... J+3 J+2 J+1 K+1 K+2 K+3 K+...

Informazioni di base e sviluppo di applicazioni web

Regole per ottenere il riconoscimento IATF, 2 edizione, Sanctioned Interpretations

Ingegneria del Software: JDBC.

SERVIZIO FIPH - FULL IP PBX HOSTED. Servizio GoCall

e/fiscali - Rel

Al termine dell operazione verrà visualizzato il modulo aggiunto

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

SenTaClAus Sentiment Tagging & Clustering Analysis on web & social contents

Nota di rilascio protocollo client / server. Vers

CAPITOLO 7 - SCAMBIO DI MESSAGGI

Laboratorio di Sistemi Operativi

Laboratorio di Reti di Calcolatori

FYF per Point Manuale Operativo

UDP. Livello di Trasporto. Demultiplexing dei Messaggi. Esempio di Demultiplexing

Laboratorio di. Reti Informatiche. Corso di Laurea Triennale in Ingegneria Informatica A.A. 2017/2018. Ing. Carlo Vallati

Record locking con la system call fcntl

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

SPEDIZIONE CONFIGURAZIONE ED INSTALLAZIONE AMBIENTE SYSINT/W

Obiettivo. Dal problema al risultato Algoritmo. Imparare a PROGRAMMARE

Introduzione al Linguaggio C

Timeout. Socket Avanzati. Client echo UDP con alarm. Funzione alarm()

Transcript:

I/O Multiplexing select() e pll() Crs di laurea in Infrmatica Labratri di Reti di Calclatri A.A. 2013-2014 Simne Bassis bassis@di.unimi.it Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. Mdelli di I/O Mdelli di I/O Blcking I/O Nnblcking I/O Quand un perazine di I/O nn può essere cmpletata senza mettere il prcess in pausa, nn l si mette in pausa, ma si ritrna un errre I/O multiplexing (select() e pll()) Il prgramma si blcca in una call a select(), ma è in grad di gestire più canali Signal driven I/O (SIGIO) Il prgramma nn si blcca mai, ma deve gestire pprtunamente i segnali in arriv dal kernel Asynchrnus I/O (psix.1 ai_ functins) Cme spra, ma il kernel nn ci avvisa quand una perazine di I/O può essere iniziata, bensì quand è terminata È l unica mdalità effettivamente asincrna (il prcess nn viene mai blccat) Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 489 1

Mdelli di I/O I/O multiplexing serve quand un hst deve gestire all stess temp descrittri multipli (scket e input) Scket multiple Listening scket e cnnected scket TCP e UDP scket Servizi e prtclli multipli Due fasi distinte per le perazini di input 1. Attesa che i dati sian dispnibili 2. Cpia dei dati dal kernel al prcess Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 490 Blcking I/O applicazine kernel recvfrm() System call Nessun dispnibile Attendi i dati Il prcess si blcca ad una call a recvfrm() dispnibile cpia in crs ricezine Return OK cpia cmpleta Cpia i dati dal kernel all utente Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 491 2

NnBlcking I/O applicazine kernel recvfrm() System call EWOULDBLOCK Nessun dispnibile Il prcess chiama ripetutamente recvfrm() attendend di ricevere i dati (plling) recvfrm() recvfrm() System call EWOULDBLOCK System call Nessun dispnibile dispnibile cpia in crs Attendi i dati Cpia i dati dal kernel all utente ricezine Return OK applicazine Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 492 I/O Multiplexing select() e pll() applicazine kernel Il prcess si blcca ad una call a select() attendend che una delle pssibili scket diventi dispnibile in lettura select() recvfrm() System call return readable System call Nessun dispnibile dispnibile cpia in crs Attendi i dati Il prcess si blcca mentre i dati vengn cpiati nell applicatin buffer ricezine Return OK cpia cmpleta Cpia i dati dal kernel all utente Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 493 3

Signal driver I/O SIGIO applicazine kernel Il prcess cntinua l esecuzine Attivazine SIGIO Signal Handler Sigactin System call return Nessun dispnibile Attendi i dati Il prcess si blcca mentre i dati sn cpiati nell applicatin buffer Signal Handler recvfrm() ricezine invi SIGIO System call Return OK dispnibile cpia in crs cpia cmpleta Cpia i dati dal kernel all utente Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 494 Asynchrnus I/O applicazine kernel ai_read() System call Nessun dispnibile return Attendi i dati Il prcess cntinua l esecuzine dispnibile cpia in crs Signal handler ricezine Invia segnale specificat in ai_read() cpia cmpleta Cpia i dati dal kernel all utente Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 495 4

Cnfrnt tra i mdelli di I/O blcking nnblcking I/O multiplexing signal-driven I/O asynchrnus I/O initiate check check initiate check check check blcked Attesa dati check check ready initiate ntificatin initiate cmplete blcked cmplete blcked cmplete blcked cmplete ntificatin Cpia dati dal kernel all utente 1 fase trattata differentemente, 2 fase trattata all stess md Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. Gestisce entrambe le fasi 496 Blcking vs Nnblcking Di default le scket sn blccanti Quand una syscall nn può essere cmpletata immediatamente, il prcess viene sspes attendend che sia cmpletata Quattr categrie di system call blccanti Operazini di input: read, readv, recv, recvfrm, e recvmsg Blcking: sleep finchè i dati nn sn dispnibili (almen 1 byte per TCP e un per UDP) Nnblcking: ritrn immediat cn errre EWOULDBLOCK Operazini di utput: write, writev, send, sendt, e sendmsg Blcking: sleep per TCP scket se l spazi nel buffer di invi nn è sufficiente Nnblcking: se nn c è spazi nel buffer di invi, ritrn immediat cn errre EWOULDBLOCK. Se l spazi è parziale, ritrna il numer di byte cpiati (shrt cunt) Nta: UDP nn ha send buffer. Un perazine di utput nn è mai blccante La funzine accept Blcking: sleep finchè si rende dispnibile una cnnessine Nnblcking: ritrn immediat cn errre EWOULDBLOCK La funzine cnnect (sl per TCP) Blcking: sleep finchè la cnnessine è instaurata Nnblcking: ritrn immediat cn errre EINPROGRESS se la cnnessine è in crs Nta: la cnnect per UDP nn è un reale three-way handshake Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 497 5

Nnblcking I/O È pssibile creare scket nn blccanti attravers fcntl() Che sta per file cntrl #include <unistd.h> #include <fcntl.h> sckfd = scket(pf_inet, SOCK_STREAM, 0); fcntl(sckfd, F_SETFL, O_NONBLOCK); impsta il file status flag al valre specificat da arg ritrna un valre null in cas di success -1 in cas di errre Si tratta di perazini ausiliarie che è pssibile eseguire su un file descriptr che nn riguardan la nrmale lettura e scrittura di dati ma la maniplazine e ilcntrll sia delle lr prprietà, che di tutta una serie di ulteriri funzinalità che il kernel può mettere a dispsizine Il prttip di fcntl() dipende dal cmand impartit #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd) int fcntl(int fd, int cmd, lng arg) int fcntl(int fd, int cmd, struct flck * lck) Valri di ritrn: diversi a secnda dell'perazine -1 in cas di errre: errn settata cn il relativ cdice errre Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 498 Nnblcking vs I/O Multiplexing In cas di scket nn blccanti Si può interrgare (pll) la scket per ttenere infrmazini Se nn ci sn dati ritrna -1 cn errn settat a EWOULDBLOCK In gni cas busy-waiting nn è una buna strategia Oppure usare la select (Synchrnus I/O Multiplexing) Permette di mnitrare diverse scket all stess temp Avvisand quand alcune sn prnte In lettura In scrittura Hann sllevat eccezini - Da nn cnfndersi cn le Java Exceptin Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 499 6

Megli la select(), ma La select() è un dei metdi più lenti per mnitrare scket Esistn diverse alternative, tra cui libevent (http://libevent.rg/) I meccanismi interni sn cmpletamente indipendenti dalle API espste Supprta kqueue, event prts, POSIX select(), Windws select(), pll e epll Permette l svilupp di applicazini prtabili E dispnibile per piattafrme Linux, *BSD, Mac OS X, Slaris, Windws, Frnisce il meccanism di ntifica di eventi tutt ra più scalabile Può essere usat per applicazini multi-thread Island i singli eventi csì che un singl thread ne abbia access Cntrlland gli accessi a eventi cndivisi Frnisce un meccanism sfisticat per I/O di rete bufferizzat Cn supprt per scket, filtri, limitazini sul rate, SSL, Include il supprt di diversi utili prtclli ( DNS, HTTP, RPC, ) Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 500 #include <sys/time.h> #include <sys/types.h> #include <unistd.h> select() e fd_set int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeut); La select() mnitra insiemi (set) di descrittri di file readfds: per vedere se si può leggere da un fd es. per leggere da stdin e da sckfd, basta aggiungere 0 e sckfd al set readfds writefds: idem per scritture exceptfds: per verificare l esistenza di eccezini un eccezine nn è un errre (ad es., l arriv di dati urgenti ut-f-band) numfds deve essere pst pari a fd max + 1 fd max è il fd più grande cntrllat Al ritrn viene restituit il numer di descrittri prnti readfds, writefds e exceptfds sarann mdificati per riflettere quali tra gli fd selezinati risultan prnti Macr Descrizine Per frtuna esistn macr per perare sugli insiemi di tip fd_set Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. FD_SET(int fd, fd_set *set); FD_CLR(int fd, fd_set *set) FD_ISSET(int fd, fd_set *set) FD_ZERO(fd_set *set) FD_COPY(fd_set *fdset_rig, fd_set *fdset_cpy); Aggiunge fd a set Rimuve fd dal set Ritrna ver se fd è in set Pulisce tutte le entry da set Cpia un fd set 501 7

select() e struct timeval struct timeval permette di specificare un timeut All scadere, se nessun fd è prnt, la select() ritrna struct timeval { int tv_sec; int tv_usec; ; // secndi // micrsecndi Al ritrn timeut ptrebbe essere aggirnata per mstrare quant temp manca fin all scadere del timeut Dipende dalla versine di Unix Settand struct timeval a 0, frza la select() a trnare immediatamente (timeut immediat) Serve per fare plling su tutti i fd nel set Settand struct timeval a NULL, frza la select() a nn andare mai in timeut Serve per attendere finchè un fd nel set è prnt E pssibile evitare di avere un cert set, mettendl a NULL Fate attenzine: nn fate affidament sul cmput del temp (sprattutt in micrsecndi) Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 502 Descrittri prnti In lettura Il numer di byte di dati nel buffer di ricezine è più grande di lw-water mark Settabile cn l pzine SO_RCVLOWAT Di slit pari a 1 byte la cnnessine è chiusa in lettura In una listening scket il numer di cnnessini cmpletate è maggire di 0 C è un errre pendente In scrittura Il numer di byte dispnibili nel buffer di invi è più grande di lw-water mark Settabile cn l pzine SO_SNDLOWAT Di slit pari a 2048 byte La cnnessine è chiusa in scrittura C è un errre pendente Eccezini pendenti Quand esistn dati ut-f-band per la scket Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 503 8

Un semplice esempi #include <stdi.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #define STDIN 0 int main(vid) { struct timeval tv; fd_set readfds; tv.tv_sec = 2; tv.tv_usec = 500000; FD_ZERO(&readfds); FD_SET(STDIN, &readfds); // dn't care su writefds e exceptfds: select(stdin+1, &readfds, NULL, NULL, &tv); if (FD_ISSET(STDIN, &readfds)) printf( E stat premut un tast!\n"); else printf("timeut!\n"); return 0; Questini di prtabilità: dipende dalla piattafrma in us: L us della select() cn datagram scket L update del temp rimanente prima del timeut in struct timeval Megli nn affidarsi a tal valre se si vule che la prpria applicazine sia prtabile Ptete usare gettimefday() Una scket in asclt cn listen() va aggiunta al set readfds Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 504 select() vs. pll() Stria select() intrdtta nel 1983 in 4.2BSD Unix (BSD) pll() intrdtta nel 1986 in SVR3 Unix (System V) In linux nel 1997 Funzinalità: le stesse, cambian i dettagli select() svrascrive gli fd_set indicand quali fd sn prnti; pll() nn mdifica i dati in input pll() gestisce mlti fd (anche più di 1024) senza grssi prblemi; select() usa bitmask di taglia fissata ed è men cnveniente su alcuni sistemi per supprtare più di 1024 fd è necessari mdificare FD_SETSIZE pll() gestisce più tiplgie di eventi ma ai fini pratici nn sn rilevanti diversi valri di timeut: pll() cnsidera millisecndi, select() un struct timeval Entrambe incraggian un apprcci lp-style e nn event-based Velcità: la stessa, incredibilmente lenta (megli librerie eventbased) select() frza una scansine dei primi fd max file descriptr; la pll() n (una piccla vittria per la pll()) select() usa 4 bit di dati per fd, mentre la pll() ne usa 64 bits per fd (una piccla vittria per la select() se pensate alla cpia dei dati in kernel space) Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 511 9

select() vs. pll() Prtabilità select () Esiste da parecchi ed è presente dappertutt. Un prblema cn gli fd_set: nn si sa quand si verifica verflw sulla bitmask (nn si può verificare l FD_SETSIZE in md prtabile) Mlte versini di Unix permettn di ridefinire FD_SETSIZE a cmpile time, ma nn Linux L include header richiest per l fd_set varia da sistema a sistema Alcuni sistemi mdifican l struct timeval. In tali casi se si ripete la select() si ha bisgn di inizializzare ad gni cicl il timeut pll() Nn esiste su vecchie versini di Unix su Windws pre-vista. Su alcune versini di Mac OS X la versine è buggata. La maggir parte delle prime implementazini wrappan la select() Il md di settare bit è specificat nell standard, ma varia tra implementazini diverse Cmplessità Tutte le funzini event-driven rendn il cdice mlt più cmpless e difficile da seguire rispett all us di select() e pll() Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 512 pll() # include <sys/pll.h> int pll(struct pllfd fds[ ], nfds_t nfds, int timeut); struct pllfd fds[ ]: gni entry cntiene tipicamente int fd: indica quale fd mnitrare shrt events: una bitmap che rappresenta gli eventi da mnitrare È pssibile usare tramite OR ( ) le seguenti macr POLLIN: dati prnti per recv() POLLOUT: dati prnti per send() POLLRDNORM: recv() di dati nrmali POLLWRNORM: dati nrmali prnti per send() POLLRDBAND: recv() di dati pririty band POLLPRI: recv() di dati high pririty POLLWRBAND: send() di dati pririty band shrt revents: una bitmap che rappresenta quali eventi si sn verificati Oltre ai precedenti, è pssibile usare POLLERR: errre POLLHUP: scket chiusa dalla cntrparte POLLNVAL: prblemi cn il scket descriptr nfds_t nfds: numer di fd settati in fds[ ] int timeut: espress in millisecndi se negativ si attende all infinit se 0 ritrna immediatamente Il valre di ritrn indica su quanti fd si è verificat un event 0 in cas di timeut -1 in cas di errre Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 513 10

Cndizini per revents POSIX lascia mlti buchi nelle sue definizini Tutti i dati TCP reglari e UDP sn cnsiderati nrmali Dati TCP ut-f-band sn pririty band Cnnessini chiuse in lettura sn cnsiderate dati nrmali La read() seguente ritrnerà 0 La presenza di errri può essere cnsiderata un dat nrmale un errre La read() seguente ritrnerà -1 La dispnibilità di una nuva cnnessine su una listening scket può essere cnsiderata un dat nrmale pririty data Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 514 pll() int s1, s2; int rv; char buf1[256], buf2[256]; struct pllfd ufds[2]; s1 = scket(pf_inet, SOCK_STREAM, 0); s2 = scket(pf_inet, SOCK_STREAM, 0); // suppniam di essere cnnessi ad un server // cnnect(s1,...)... // cnnect(s2,...)... // si setta l array dei file descriptrs // // in quest esempi, ci accntentiam di distinguere se // ci sn dati dati ut-f-band prnti per una recv() // check per dati nrmali ut-f-band ufds[0].fd = s1; ufds[0].events = POLLIN POLLPRI; // check sl per dati nrmali ufds[1].fd = s2; ufds[1].events = POLLIN; Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 1 // attendi il verificarsi di eventi sulla scket // cn 3.5 secndi di timeut rv = pll(ufds, 2, 3500); if (rv == -1) { perrr("pll"); else if (rv == 0) { printf("timeut!\n"); else { // cntrlla se ci sn eventi su s1: if (ufds[0].revents & POLLIN) { recv(s1, buf1, sizef buf1, 0); // dati nrmali if (ufds[0].revents & POLLPRI) { // dati ut-f-band recv(s1, buf1, sizef buf1, MSG_OOB); // cntrlla se ci sn eventi su s2: if (ufds[1].revents & POLLIN) { recv(s1, buf2, sizef buf2, 0); 515 2 11

Oltre pll() e select() Alternative event-driven più mderne, nn standardizzate epll: Linux kqueue: FreeBSD, NetBSD, OpenBSD, Darwin /dev/pll: Slaris, HPUX, pllset: AIX, event Cmpletin: Slaris 10 I/O Cmpletin Prts: Windws O librerie che permettn di scrivere prgrammi event-based in md prtabile libev libevent Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 516 pselect() #include <sys/select.h> int pselect(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timespec *timeut, sigset_t *sigmask) A differenza della select() usa un struct timespec per indicare cn maggire precisine (in nansecndi) il timeut e nn ne aggirna il valre in cas di interruzine prende un argment aggiuntiv sigmask che è il puntatre ad una maschera di segnali La maschera crrente viene sstituita da questa immediatamente prima di eseguire l'attesa, e ripristinata al ritrn della funzine. L'us di sigmask è stat intrdtt all scp di prevenire pssibili race cnditin quand ci si deve prre in attesa che un fd diventi dispnibile un segnale (es. SIGINT) venga intercettat In sstanza una pselect() esegua in maniera atmica sigset_t sigsaved; sigprcmask(sig_setmask, &sigmask, &sigsaved); ready = select(nfds, &readfds, &writefds, &exceptfds, timeut); sigprcmask(sig_setmask, &sigsaved, NULL); Il vantaggi sta prpri nell atmicità dell implementazine Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 517 12

Pssibile sluzine: impstare un signal handler vut per il segnale, csì che l arriv del segnale interrmpa la select() pselect() un semplicissim esempi Sluzine crretta: usare la pselect() static vid handler(int sig) { /* d nthing */ int main(int argc, char *argv[]) { fd_set readfds; struct sigactin sa; int nfds, ready; /* Establish signal handler */ sa.sa_handler = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sigactin(sigint, &sa, NULL); /*... */ ready = select(nfds, &readfds, NULL, NULL, NULL); /*... */ Dp che la select() ritrna, se errn == EINTR, sappiam che la select() è stata interrtta da un segnale e pssiam agire di cnseguenza. Race Cnditin: se SIGINT viene ricevut dp la chiamata a sigactin(), ma prima della select(), nn interrmperà la select() e il segnale andrà pers. Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. sigset_t emptyset, blckset; sigemptyset(&blckset); /* Blck SIGINT */ sigaddset(&blckset, SIGINT); sigprcmask(sig_block, &blckset, NULL); /* Establish signal handler */ sa.sa_handler = handler; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sigactin(sigint, &sa, NULL); /* Inizializza nfds and readfds */ /* Sblcca il signale, e invca pselect */ sigemptyset(&emptyset); ready = pselect(nfds, &readfds, NULL, NULL, NULL, &emptyset); /* */ Il cdice funzina perchè SIGINT è sblccat sl quand il cntrll è passat al kernel. Il risultat è che nn c è alcun punt in cui il segnale può essere inviat prima che venga eseguita la pselect(). 518 I/O Multiplexing cn Nnblcking I/O Us cngiunt di nnblcking I/O e select() Per evitare busy waiting velcizzand l I/O multiplexing Parte semplice ricrdarsi di settare la scket cme nnblccante gestire crrettamente EWOULDBLOCK - Di slit è sufficiente ignrarl Parte cmplicata gestire crrettamente i buffer di invi e ricezine Ecc perché si preferisce usare server multiprcess multithread stdin tiptr &t[maxline] Già spediti Dati da inviare al server Buffer dispnibile per letture da stdin tptr scket friptr &fr[maxline] Già spediti Dati da inviare a stdut Buffer dispnibile per letture da scket Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. frptr stdut 519 13

I/O Multiplexing cn Nnblcking I/O Divers è per la nnblcking cnnect(), che ritrna EINPROGRESS se una cnnessine è in crs Il three-way handshake cntinua Tramite select() si può cntrllare l stat della cnnessine Tre usi per una nnblcking cnnect() Si esegue altr mentre il three-way handshake è in crs Si pssn stabilire più cnnessini cntempraneamente Attendend sulla select() che la cnnessine sia cmpleta, pssiam accrciare il timeut per la cnnect() tramite il timeut della select() Che di default varia tra i 75 secndi ad alcuni minuti Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 520 nnblcking cnnect() int cnnect_nnb(int sckfd, cnst SA *saptr, scklen_t salen, int nsec) { int flags, n, errr; scklen_t len; d_set rset, wset; struct timeval tval; flags = fcntl(sckfd, F_GETFL, 0); fcntl (sckfd, F_SETFL, flags O_NONBLOCK); errr = 0; if ( (n = cnnect(sckfd, (struct sckaddr *) saptr, salen)) < 0) if (errn!= EINPROGRESS) return (-1); /* errre di cnnessine */ if (n == 0) /* la cnnect è stata stabilita immediatamente */ fcntl(sckfd, F_SETFL, flags); /* ripristina la scket blccante */ return (0); FD_ZERO (&rset); FD_SET(sckfd, &rset); wset = rset; tval. tv_sec = nsec; tval.tv usec = 0; if ( (n = Select(sckfd + 1, &rset, &wset, NULL, nsec? &tval : NULL)) == 0) { clse(sckfd); /* timeut */ errn = ETIMEDOUT; return (-1); Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. Un esempi parziale che implementa una cnnect() nn blccante usand la select() La versine cmpleta necessita di ulteriri cntrlli 521 14

I/O Multiplexing cn Nnblcking I/O Prblema In teria l us della accept() all intern di una select() nn necessita di rendere la scket nnblccante In pratica c è una race cnditin dvuta alla nn atmicità delle perazini Quand il client chiude la cnnessine tra la select() e la accept() blcca il server indefinitivamente Sluzine Settare la scket cme nnblccante Ignrare gli errri EWOULDBLOCK e ECONNABORTED Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 522 Signal-Driven I/O SIGIO Sn richiesti tre passi Stabilire un signal handler per il segnale SIGIO ( SIGPOLL su certe piattafrme) Settare il scket wner cn F_SETOWN di fcntl() Abilitare signal-driven I/O cn F_SETFL di fcntl() per attivare il flag O_ASYNC SIGIO viene generat Per Scket UDP, quand Arriva un Si verifica un errre asincrn Per scket TCP, trpp spess da renderl inutile una richiesta di cnnessine su una listening scket è cmpletata Una richiesta di discnnessine è iniziata Una richiesta di discnnessine è cmpletata La metà di una cnnessine è stata chiusa cn shutdwn() I dati sn arrivati I dati sn stati inviati Un errre asincrn si è verificat pessima nmenclatura. In realtà serve per ricevere ntifiche sui segnali SIGIO e SIGURG Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 523 15

Esercizi C 6 Si implementi una versine semplificata di una chatrm, in cui i client invian messaggi all Ech Server in maniera asincrna e quest ultim li rispedisce a tutti i client a lui cnness ad eccezine del mittente. Si utilizzi I/O multiplexing per gestire crrettamente l alternanza stretta dei client e la presenza di più scket descriptr nel server. Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 524 Esercizi C 7 Si implementi un server che ffra due servizi su due prte cnsecutive: 1. sulla prima in input stringhe della frma nr 1 p nr 2 restituisce l esit dell perazine p {+, -, *, / applicata agli interi nr 1 e nr 2 ; 2. sulla secnda in input stringhe della frma p nr restituisce l esit dell perazine p {exp, lg, sqrt applicata al flat nr. L esit delle perazini (binarie e unarie risp.) sarà restituit a tutti i client cnnessi al rispettiv servizi. Il client iterativamente frnirà nuve espressini al server, lasciand il servizi secnd una delle due seguenti mdalità (a scelta dell studente): 1. il server chiuderà la cnnessine alla ricezine della perazine e ; 2. Il client si scllegherà senza avvisare il server, che dvrà in gni cas ripulire gli fd_set usati. Si implementi anche il rispettiv client. Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 525 16

Timeut Ci sn tre mdi per mettere un timeut su una perazine di I/O su una scket Chiamata a alarm(), che genera il segnale SIGALRM all scadere del cuntdwn POSIX cmpliant Può interferire cn altre chiamate a alarm() Usare la select(), che ha un timeut già implementat Usare le pzini SO_RCVTIMEO and SO_SNDTIMEO Nn sempre queste pzini sn implementate Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 526 Timeut cn alarm() static vid sig_alrm(int); vid dg_cli(file *fp, int sckfd, cnst SA *pservaddr, scklen_t servlen) { int n; char sendline[maxline], recvline[maxline + 1]; signal(sigalrm, sig_alrm); while (fgets(sendline, MAXLINE, fp)!= NULL) { sendt(sckfd, sendline, strlen(sendline), 0, pservaddr, servlen); alarm(5); if ( (n = recvfrm(sckfd, recvline, MAXLINE, 0, NULL, NULL)) < 0) { if (errn == EINTR) fprintf(stderr, "scket timeut\n"); else err_sys("recvfrm errr"); else { espress in secndi alarm(0); recvline[n] = \0 ; /* null terminate */ fputs(recvline, stdut); se 0 nessun allarme static vid sig_alrm(int sign) viene schedulat { return; /* sl per interrmpere la recvfrm() */ Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 527 17

Timeut cn select() Inglband tale funzinalità in una singla funzine #include <unistd.h> #include <sys/time.h> #include <sys/types.h> #include <sys/scket.h> int recvtimeut(int s, char *buf, int len, int timeut) { fd_set fds; int n; struct timeval tv; // si settan i file descriptr set FD_ZERO(&fds); FD_SET(s, &fds); // si setta l struct timeval per il timeut tv.tv_sec = timeut; tv.tv_usec = 0; Cas d us // timeut di 10 secndi n = recvtimeut(s, buf, sizef buf, 10); if (n == -1) { // errre perrr("recvtimeut"); else if (n == -2) { // timeut else { // usa i dati in buf // si attende il timeut i dati n = select(s+1, &fds, NULL, NULL, &tv); if (n == 0) return -2; // timeut! if (n == -1) return -1; // errre // dati in arriv, usare il classic recv() return recv(s, buf, len, 0); Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. Funzine recvtimeut() Valri di ritrn: - 0: cnnessine chiusa - 1: errre - 2: timeut 528 Esercizi C 8 Si implementi un server che riceva in input un giudizi (inter cmpres tra 1 e 10) e frnisca cme utput la media dei giudizi ttenuti da tutti i client e il numer di giudizi pervenuti. Ogni client può inviare un numer illimitat di giudizi. Sarà il server a dver gestire eventuali discnnessini. Ogni t secndi, il server dvrà inviare ad gni client cnness la cppia (media, numer) dei giudizi pervenuti. L studente è liber di scegliere se utilizzare la select() in md pprtun la funzine alarm(). Labratri di Reti di Calclatri (Infrmatica) - A.A. 2013-2014 Università di Milan D.I. 529 18