Lezione n.5 del 09/11/2007 ========================== Argomenti --------- * Gestione dei processi - informazioni associate ai processi - identificatore di processo - real/effective UID (GID) * Priorità dei processi - priorità assegnata dal SO - livello di nice . comandi nice e renice * Comandi per la gestione dei processi - ps: output e opzioni principali - top: output e comandi interattivi * Segnali - descrizione dei segnali . SIGHUP, SIGTERM, SIGKILL, SIGSTOP . segnali prodotti da tastiera . segnali invocati da processi - comandi per l'invio di segnali . kill, killall e cenni a nohup * Shell e processi - esecuzione in background e job - comandi fg, bg e stop - invio segnali da tastiera (^C, ^D) Riferimenti ::::::::::: * Dispensa 'Amministrazione di un Sistema UNIX in Rete', Capitolo 5 * Dispensa 'Supplementi per il Sistema FreeBSD ed Integrazioni', Capitolo 1 * Guida alla Programmazione in Linux, Sezioni 3.3.1 e 5.3.1 http://gapil.truelite.it/ Materiale di supporto ::::::::::::::::::::: File sorgente 'loop_inf.c', 'loop_sleep.c' e 'loop_time.c'. Esercizio --------- * Utilizzare il programma 'loop_inf.c' - compilare il programma (cc -Wall -o ) - eseguire il programma come utente 'osor' - tramite top (*lanciato da utente root*) controllare lo stato della CPU - giustificare l'output di top - modificare il livello di nice tramite il comando interattivo di top - come cambia l'output di top rispetto a prima (relativamente all'utilizzo della CPU)? - terminare il programma usando il comando interattivo kill da dentro top * Utilizzare il programma 'loop_time.c' - compilare ed eseguire come utente 'osor' - controllare le differenze dell'output di top (*lanciato da utente root*) rispetto a prima - terminare il programma * Utilizzare il programma 'loop_sleep.c' - compilare ed eseguire come utente 'osor' - settare a 1 secondo l'intervallo di update di top (*lanciato da utente root*) - visualizzare solo i processi che appartengono all'utente con cui il programma e` stato lanciato - ordinare l'output secondo il campo 'time' - controllare tramite top gli stati in cui passa il processo ed il livello di priorita' - terminare il processo * Usare ps per ottenere l'elenco tutti i processi in esecuzione sulla macchina, modificando le informazioni in output tramite le opzioni -o e -O (vedere la pagina di manuale) Soluzione --------- Risposte alle domande ::::::::::::::::::::: * E` importante osservare l'utilizzo della CPU. Visto che il programma gira sempre *solo* in spazio utente, la percentuale 'user' va al 100%. Cambiando il nice level, oltre a cambiare il numero nella colonna nice, il consumo di CPU si sposta nel campo nice. * In questo caso il programma invoca continuamente una syscall, quindi gira anche in modalita' kernel. La percentuale di CPU 'system' non raggiunge il 100% perche' comunque il programma in parte gira *anche* in spazio utente (gestione del ciclo). * In questo caso il processo passa dallo stato run (quando esegue il ciclo interno) allo stato sleep (quando e' bloccato in attesa del timer, per effetto della chiamata sleep()). E' interessante notare il livello di priorita': questo cresce quando il processo e' sleeping, mentre decresce quando il processo usa la CPU, cioe` durante il ciclo for. Questo perche' UNIX decrementa la priorita' dei processi che stanno usando molta CPU, e viceversa (politica anti-starvation).