3) Quali soluzioni esistono per realizzare i thread?
Per i Thread esistono soluzioni realizzative:
nel kernel (kernel-level thread):
vantaggio: integrazione degli strumenti nel kernel
svantaggio: soluzione meno efficiente rispetto di quelle realizzare al livello applicativo
a livello applicativo (user-level thread):
vantaggio: possibilità di variare le politiche secondo necessità
svantaggio: interferenza con le politiche di kernel
miste (FastThread):
vantaggio: possibilità di integrare le due politiche secondo necessità ed ottenere i vantaggi di entrambe
La realizzazione dei processi leggeri senza modifica del kernel implica il problema delle primitive sospensive: se un thread esegue una primitiva sospensiva, viene sospeso l'intero processo (e quindi anche tutti gli altri thread).
Rimedi:
Uso di primitive ad-hoc, che non interessano il kernel
Uso di primitive solamente non sospensive (select e primitive asincrone) in un wrapper (il codice è detto jacket) che avvolge la chiamata alla primitiva e garantisce la non sospensione.
Realizzativamente vengono implementati alcuni modelli di organizzazione dei thread
Dispatcher/worker model:
un thread dispatcher legge le richieste di servizi dalla mailbox di sistema
dopo aver esaminato la richiesta, sceglie un thread inattivo (worker) e gli affida una richiesta, probabilmente scrivendo un puntatore al messaggio in una parola di memoria associata al thread; quindi risveglia il thread
il thread cerca nella cache comune per vedere se la richiesta può essere soddisfatta. In caso negativo invia un messaggio al disco e si sospende, permettendo così ad un altro thread di andare in esecuzione
Team model:
non c’è il dispatcher; ogni thread guarda nella mailbox. Poichè può accadere che un thread non possa soddisfare una richiesta, è necessario che i thread, prima di guardare nella mailbox, guardino nella coda delle richieste inevase
Pipeline model:
i thread si passano i dati in sequenza (modello non adatto per un file server, ma può essere adatto per altre situazioni)
Strumenti di sincronizzazione tra thread: