Il compito è costituito da domande chiuse, domande aperte ed es
Transcript
Il compito è costituito da domande chiuse, domande aperte ed es
“Laboratorio di Sistemi Operativi” 29-01-2009 Cognome Nome Mat. Il compito è costituito da domande chiuse, domande aperte ed esercizi. Non è consentito l’uso di libri, manuali, appunti., etc. Tempo massimo 2 ore. Domande chiuse: ogni domanda corrisponde ad un punteggio di 1 punto in caso di risposta esatta, 0 in caso di risposta errata o in assenza di risposta. Solo una risposta è corretta. 1) In un sistema UNIX la Process-Table Contiene la tabella dei file aperti Contiene la user area dei processi Contiene la parte sempre residente dei descrittori dei processi Contiene la symbol table 2) Quale delle seguenti informazioni è contenuta in un i-node La dimensione del file Il nome del file Il File Descriptor Il pid del processo che accede al file 3) Un link hardware in un File System UNIX E’ identificato dallo stesso i-number del file che referenzia Consente di realizzare collegamenti (link) tra file residenti su partizioni diverse Collega reti diverse Rappresenta un device 4) Il comando cat < pippo > pluto Copia il file pippo nel file pluto Scrive il contenuto del file pluto nel file pippo Concatena il contenuto del file pippo con quello del file pluto e lo stampa su schermo Nessuna delle precedenti 5) Quale comando aggiunge il diritto di esecuzione per tutti gli utenti a partire dalla seguente maschera ottale dei permessi rw-r--r-chmod 544 file chmod 655 file chmod a+x file Nessuna delle precedenti 6) Un processo che riceve un segnale può Eseguire solo un’azione di default Eseguire un’azione di default o un’azione definita dal programmatore Eseguire solo un’azione predefinita Nessuna delle risposte precedenti 7) Un server DNS gestisce I nomi Internet che appartengono a un dominio I numeri di port associati ai server Lo spazio degli indirizzi IP Il port 53 a livello IP 1 “Laboratorio di Sistemi Operativi” 29-01-2009 Cognome Nome Mat. 8) Il protocollo TCP Fornisce un servizio di scambio messaggi affidabile e orientato alla connessione Fornisce un meccanismo per individuare i servizi in rete Fornisce un servizio affidabile di scambio pacchetti tra host E’ un protocollo di trasporto affidabile e non orientato alla connessione 9) La system call bind() Effettua il binding di due processi Assegna un port ad un socket Attende richieste di connessione su un port dinamico Crea un socket 10) Qual è la corretta sequenza per accettare una connessione Socket(), listen(), accept() Socket(), bind(), listen(), connect() Socket(), bind(), listen(), accept() Socket(), bind(), accept(), listen() 11) La funzione gethostbyname() Riceve come parametro di input il nome del servizio e restituisce un puntatore a una struttura che contiene il port associato al servizio. Riceve come parametri di input il nome del servizio e il protocollo utilizzato e restituisce un puntatore a una struttura che contiene il port associato al servizio. Riceve come parametro di input il nome del protocollo e restituisce un puntatore a una struttura che contiene l’identificativo associato al protocollo. Riceve come parametro di input il nome della macchina e restituisce un puntatore a una struttura che contiene l’IP address della macchina. 12) La system call connect() Invia un segmento TCP avente il flag SYN attivo Invia un segmento TCP avente il flag FIN attivo Invia un segmento TCP avente dati di utente Invia un segmento TCP avente il flag RST attivo 2 “Laboratorio di Sistemi Operativi” 29-01-2009 Cognome Nome Mat. Domande aperte: ogni domanda corrisponde ad un punteggio variabile tra 0 e 3 punti a seconda della correttezza, completezza e sinteticità della risposta. A1 Si considerino due semafori sem1, sem2 e i seguenti frammenti di programma eseguiti da 2 processi: Processo 1 while (1) { p(sem1); printf(“processo uno \n”); v(sem2) } Processo 2 while(1) { p(sem2) printf(“processo due \n”); v(sem1) } Dire come procedono i due processi, facendo un esempio delle stampe prodotte a terminale, se i semafori sono inizializzati nel modo seguente: sem1=1, sem2=0 Individuare le situazioni di stallo modificando i valori iniziali dei semafori oppure il codice dei processi. A2 Spiegare come è possibile realizzare un server concorrente basato sul protocollo TCP. Se si ritiene opportuno fare delle fork(), spiegare come viene gestita la terminazione dei processi figli e se ci sono casi in cui è opportuno utilizzare la system call exec(). 3 “Laboratorio di Sistemi Operativi” 29-01-2009 Cognome Nome Mat. Esercizi: Viene attribuito un punteggio variabile tra 0 e 6 a seconda della correttezza, completezza e adeguatezza della soluzione proposta. Utilizzare un linguaggio C-like e le system call UNIX cercando di essere chiari e strutturati, indicare anche le variabili utilizzate e, nel passaggio dei parametri, specificare se per valore o indirizzo. E1 (0 - 6 punti) Scrivere un’applicazione che preveda un processo che legge stringhe da terminale (ciclo infinito, while(1)), per ogni stringa letta invia su una named pipe (“mailbox”) un messaggio organizzato secondo la seguente struttura: struct msg { int num_ord; (numero intero che viene incrementato per ogni stringa letta) char stringa[80]; }; Un secondo processo legge dalla named pipe (“mailbox”) i messaggi e li scrive su un file di testo (“messages) producendo una riga per ogni messaggio letto; anche il secondo processo esegue un loop infinito. La named pipe viene creata dal secondo processo che deve essere lanciato per primo. Note sintattiche int fd_r, fd_w; FILE *fp char nome_pipe[80], nome_file[80]; mknod(nome_pipe,S_IFIFO|0666,0); fd_r = open(nome_pipe,O_RDONLY); fd_w = open(nome_pipe,O_WRONLY); fp = fopen(nome_file, “w”); 4 “Laboratorio di Sistemi Operativi” 29-01-2009 Cognome Nome Mat. Esercizi: Viene attribuito un punteggio variabile tra 0 e 9 a seconda della correttezza, completezza e adeguatezza della soluzione proposta. Utilizzare un linguaggio C-like e le system call UNIX cercando di essere chiari e strutturati, indicare anche le variabili utilizzate e, nel passaggio dei parametri, specificare se per valore o indirizzo. E2 Scrivere un’applicazione che simuli un’architettura SOA. In un’architettura SOA si identificano tre processi: register (broker) server client E2.1 (0 - 6 punti, versione semplificata) Scrivere un’applicazione che implementi un “register” (broker) semplificato e un server per la funzionalità di registrazione. E’ richiesto l’utilizzo del protocollo UDP La registrazione viene effettuata nel register tramite la seguente struttura C: struct item { int id; int port; struct in_addr addr }; // identificativo programma server // port del processo // indirizzo IP macchina su cui gira il server su un array: struct item tab_reg[N]; Il register dopo aver creato il socket ed effettuata la bind su un port statico (2500), entra in un ciclo infinito dove: legge richiesta di registrazione scrive record di registrazione su array tab_reg[] (in ordine sequenziale, senza controlli se “id” già esiste) invia replica (stringa “OK”) Il server riceve come parametri hostname (argv[1]) e port (argv[2]) del register crea socket ed effettua la bind su port dinamico (port=0) costruisce record di registrazione con: id = 0x1000 port = 9999 addr = IP address della macchina server (locale) invia record di registrazione legge replica Utilizzare le macro di conversione per lo scambio dei numeri interi. E2.2 (0 – 9 punti, versione completa) Scrivere l’applicazione precedente prevedendo anche la fase di dialogo con il client. E’ richiesto l’utilizzo dei socket UDP per la registrazione e dei socket TCP per il servizio. Rispetto al caso precedente il register resta invariato mentre il server, oltre a creare il socket UDP per la registrazione, crea il socket TCP per la gestione del servizio. Il server per il socket TCP effettua la bind su un socket dinamico (port=0) e costruisce il record di registrazione utilizzando il port assegnato (utilizzare getsockname()). Superata la fase di registrazione il server si mette in attesa di ricevere richieste di connessione; per ogni richiesta di connessione genera un figlio che gestisce il dialogo con il client (scambio di un solo messaggio: richiesta e replica da parte del server). 5 “Laboratorio di Sistemi Operativi” 29-01-2009 Cognome Nome Mat. Note sintattiche struct sockaddr_in { short sin_family; /* AF_inet */ short sin_port; struct in_addr sin_addr; char sun_zero[8]; }; struct hostent { char * h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char *h_addr; /* host IP address */ }; struct hostent *server; struct in_addr server_addr; server = gethostbyname(hostname); bcopy(server->h_addr, (char *)&server_addr, server->h_length); struct sockaddr_in server_sock; server_sock.sin_family = AF_INET; server_sock.sin_addr = server_addr; server_sock.sin_port = htons(2500); bind(s,&server_sock,sizeof(server_sock)) int inet_aton(const char *cp, struct in_addr *inp) char *inet_ntoa(struct in_addr in); htons() – ntohs() htonl() – ntohl() ns = accept(s,0,0) connect(s, const struct sockaddr *to, socklen_t tolen) recvfrom(int s, void *buf, size_t len, int flags, struct sendto(int s, const void *buf, size_t len, int flags, const sockaddr *from, socklen_t *fromlen) struct sockaddr *to, socklen_t tolen) 6