Credo di aver trovato la risposta a queste domande (sperando che siano corrette, nel caso fatemi sapere). Le posto in modo da essere utili a qualcun altro:
1) Concatenazione dei comandi nella shell unix con more e less
La shell consente di concatenare l'esecuzione di più processi per formare una “catena di montaggio" (pipeline) con la sintassi:
comando1 | comando2 | ...
i processi dei vari comandi vengono lanciati in parallelo.
Lo standard output di ciascun processo è collegato allo standard input del processo successivo (usando le pipe di Unix). Molti comandi, pensati per essere usati in pipeline, si comportano da filtri: in assenza di argomenti, prendono i dati su cui operare dallo standard input, e producono il risultato sullo standard output (esempi: wc, head, tail)
Esempio
ls *. pdf | wc
conta il numero di file PDF nella directory corrente
Un esempio di filtro usato come ultimo elemento di una pipeline è il comando more, che visualizza il suo input una pagina alla volta (aspettando che l'utente prema `spazio' per passare alla pagina successiva).
Il comando less è una versione estesa di more, che consente anche di tornare indietro (usando il tasto `b').
Esempio:
per visualizzare un elenco di file molto lungo una pagina per volta, si può usare il comando:
ls | less
2) Cosa succede con questo codice supponendo che si parta con PID = 100.
for (i = 0; i < 10; i ++)
i = fork();
Creo 10 processi figli ed la i in ogni iterazione contiene il valore di ritorno della chiamata fork(); PID=100 resta il PID del padre.
3)Quanta memoria allocai l sistema operativo all'avvio? 1/3
4) Perché nei sistemi multiprocessore l'uso dei semafori è inutile
I semafori devono essere eseguiti in modo atomico. Si deve garantire che nessuno dei due processi possa eseguire operazioni wait( ) e signal( ) contemporaneamente sullo stesso semaforo. Si tratta di un problema di accesso alla sezione critica, e in un contesto monoprocessore lo si può risolvere semplicemente inibendo le interruzioni durante l’esecuzione di signal( ) e wait( ). Nei sistemi con un sola CPU, infatti, le interruzioni sono i soli elementi di disturbo: non vi sono istruzioni eseguite da altri processori. Finché non si riattivano le interruzioni, dando la possibilità allo scheduler di riprendere il controllo della CPU, il processo corrente continua indisturbato al sua esecuzione.
Nei sistemi multiprocessore è necessario disabilitare le interruzioni di tutti i processori, perché altrimenti le istruzioni dei diversi processi in esecuzione su processori distinti potrebbero interferire tra di loro. Tuttavia, disabilitare le interruzioni di tutti i processi può non essere cosa semplice, e causare un notevole calo di prestazioni. E’ per questo che - per garantire l’esecuzione atomica di wait( ) e signal( ) – i sistemi SMP devono mettere a disposizione tecniche di realizzazione dei lock (per esempio gli spinlock)
Quindi in breve perché i semafori si usano in genere quando si ha un solo processore. Infatti usare i semafori in un sistema multiprocessore significherebbe disabilitare le interruzioni di tutti i processi che:
· non è cosa semplice,
· causerebbe cali di prestazioni
5) Dato un blocco di codice per la sincronizzazione di 2 processi, dire perché garantiva mutua esclusione ma non progresso con turno inizializzato a 0.
do{ do{
while (turno != i); while (turno != j);
sezione critica sezione critica
turno=j turno=i
sezione non critica sezione non critica
}while }while
Non soddisfa il progresso perché effettua il controllo solo sulla variabile j e quindi anche se il processo j non è pronto per entrare nella sezione critica non fa entrare neanche il processo i la stessa cosa ma al contrario per l'altro blocco di codice, il tutto si risolve con l'algoritmo di peterson che effettua un doppio controllo.
Ovviamente soddisfa la mutua esclusione perché se entra j non entra i