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