Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Sistemi Operativi
AA 2021/2022 UNIFI
Vittorio Sodini
Gestione I/O
- Dispositivi
- Interfaccia
- Driver
I/O due tipi:
- Sincrono
- Asincrono
DMA Controller
Puntatori
- Registri
- Bus PCIe
DMA Request
- Bufferizzazione
- Clustering
Gestione Processi
Process Control Block (PCB)
Scheduling
- A lungo termine
- A breve termine
- A medio termine
Thread
- Pthread
- In Java
- Problematica
Variabili d'ambiente
Sincronizzazione
Concurrency
Sync Process
Monitor
- Wait
- Signal
Sezione critica
Semafori
Attesa limitata
Alte problemi
Struttura I/O
Un controllore di dispositivo ha buffer e regs.
- Si occupa del data transfer tra periferica e buffer.
- Per ogniuno c'è un driver che uniforma l'interfaccia.
- A buffer carico, une interrupt avverte il driver, che passa il controllo al SO e restituisce dati e puntatori.
- Adatto a piccoli dati.
DMA
- Una volta impostati buffer, puntatori, contatori necessari, il controllore trasferisce in blocco i dati direttamente tra mem centrale e dispositivo (bypass CPU).
Architettura CPU
- mono processore
- multi processore:
- + veloci: n.b.: γ(n CPUs) ≠ γ(1 CPU) · n
- economia di scala: Se più programmi devono lavorare sugli stessi dati.
- + affidabili: comportamento migliore ai guasti (anche tolleranza).
Tipi multiprocessore
- multielaborazione asimmetrica: es: 1 solo CPU = programma, gestore
- multielaborazione simmetrica:
- CPU può giocare qualunque parte
- proprie set di reg e cache
CPU multicore
multiprocessore in un unico chip
- + veloce risp a cpu separate
- potenza richiesta
Appaiono come n processori ordinarii
Struttura del SO
- Features
Computazione client-server
- Tipi di server
- server elaborativi (compute server): interfaccia a servizi
- file server: esecutore di file
- Peer-to-peer
- cade distinzione client-server: tutti pari
- per entrare a fare parte un nodo deve unirsi alla rete
- con reg. centralizzato
- un nodo iscrive il proprio servizio nel reg. autorizzato
- c. contattato (iniziale) avviene tramite il registro
- con protocolo di scoperta
- ➔ ? reg; i nodi si provano volta in volta i servizi tramite p.d. scoperta
- con reg. centralizzato
Protezione e sicurezza presuppongono conoscere ID user gruppi, ?st privilegiati
Progettazione di un SO
Preferibile perché altrimenti richiederebbe ricompilazione kernel ogni volta
Ricorda sis stratificato ma è + flessibile , + eff perché i moduli non devono invocare la funzionalità di trasmissione di messaggi .
Processi Java
- Il metodo exec() della classe Runtime permette di eseguire un proc
- Es Windows:
Process p = Runtime.getRuntime().exec("notepad.exe");
System.out.println("attendo che finisca...")
p.waitFor(); // attende che il processo generato finisca
System.out.println("finito!");
- Es Windows:
Sempre meglio usare Thread (Cap succ.) con Java per portabilità
- Tramite obj Process si può usare
- p.getInputStream
- p.getOutputStream
- p.getErrorStream
- p.destroy
Problematiche Programmazione Multithread
-
Ambiguità fork()
Se un thread invoca fork() il nuovo process potrebbe contenere un duplicato di tutti i thread. Su Linux duplica solo chiamante, ma può generare errori in quanto gli altri thread possono lasciare memoria del nuovo processo in stato inconsistente e generare problemi se si tenta exec (prog) sostituisce l'intero process, inclusi i thread, col prog specificato.
-
Cancellazione dei thread (più specifiche in fondo)
Terminare un thread prima che completi il suo compito. Def Thread bersaglio: quello da cancellare. Può avvenire in 2 modi:
- cancellazione immediata
- cancellazione differita
-
Dati specifici dei Threads (TLS)
Thread e e stesso process condividono i dati. Tuttavia ogni thread può ospitare una copia per alcuni dati - TLS - visibili attraverso tutte le chiamate (≠ da var locali). Sono tipo var globali limitate al singolo thread (o static). Alcuni SO già forniscono un'area.
Linux Threads
Linux non distingue tra processi e thread — task. Con clone() è possibile generare un nuovo 'thread': riceve come parametro un insieme di flags al fine di stabilire qualcosa risorse del task genetore dobbiamo essere condivise col figlio (e.g.: CLONE_FS: info su file sys,, CLONE_FILES info su file aperti ... ). Se nessun flag e impostato non si fa condivisione e otteniamo una funzionalità simile a fork().
Quando si usa fork() si crea un nuovo task contenente una copia di tutte le str dati usate dal genitore clone i puntatori alle str dati, a seconda dei flags.
PThreads
API standard POSIX per la creazione e la sync di threads. È una specifica del comportamento dei thread, i progetisti di OS devono implementarlo come meglio credono.
pthread_create() crea un nuovo thread associato ad una funzione e lo esegue.
#include <pthread.h> pthread_t tid; // ID del task pthread_attr_t attr; // attr per la creazione pthread_attr_init (&attr); // inizia con alcuni di default int r = pthread_create (&tid, &attr, thread_function, param); // ret 0 se OK
pthread_join() attende la terminazione di un thread e permette di ottenere il val ritornato dalla funzione associata al thread. pthread_join(tid, &ret_val) // posso anche solo aspettare cancellazione con NULL.
Uso dei semafori
Si distingue tra:
Semafori contatore
Usati per controlli dell'accesso a una data risorsa, presente in un # finito di esemplari.
Il semaforo è una impostazione di una risorsa: implementa il processo, dichiarano avanzamento:
wait (s) semaforo S... - I processi che restituiscono una risorsa inviano signal ( ) su S, ov. S++.
Quando S = 0 - unit (che r.1 e r2 sono occupate, e può che m.endev.
L'uso dovrammi bloccarci fino a che non torni positivo.
I semafori sono utilizzabili da risorse così come per sincronizzare i processi:
Problemi:
- A) garantire che i due proc. non possano eseguire signal e wait sullo stesso S contemporaneamente.
- B) wait() effettua comunque una busy waiting - occupa CPU inutilmente -
Per risolvere A) si va su hardware paravt
B) si fa in modo che la wait divenute s=0 alazione viendiere sempre CPU
‘blocchi’ il process- da exec a waiting - con “block()” - e si onca coda d’attesa asocial aI semaforo
Un processo bloccato sarà rinvolta con o . wakeup ( ,) - de lo nimuale dalla coda d’attesa -
=> Ready Que
Realizzazione:
typedef struct {
- int value ;
- struct process * list ;
} semafore ; lista proc. in attesa al semaforo
segnal preleva da questa lista e ie ua
Implement. di wait()
wait ( semaphor * S) { S - value -= ; if ( S - value < = 0 ) block() ;}Implementazione di wakeup()
signal ( semaphore * S) { S - value + += ; if ( S - value > 0 ) wakeup(); /* rim. processo P da S-list */}Stallo (o deadlock)
: due e più processi operativano indefinitivamente un evento che può esere
generato solo da uno dov. e dei processi in attesa.
Attesa indefinitiva (o starvation)
: un processo non puÒ’ mavi essere rimosso della coda di un semaforo daz e‘
sospeso (es: LIFO) mai a lui )
Inversione delle priorità
problema ch sima versi queand un proc a alta priorità deve mod.dati il kernelt
utilizçando un fe muyo, a bassa priorità. Tipicamente provetro da Prior -> =
Tiama deve allendere Pz. la sitación si compica se che rl’azione .
Per ris, si avvia protocollo di ereditarietà delle prionate que trasf a P2 a la priorità di Pz