7.4.1 Multitasking e multithreading

Ogni percorso di esecuzione di un processo è detto thread. Un processo è costituito da almeno un thread che coincide con il processo stesso. Come per i processi, un thread ne può creare un altro. Per ogni thread relativo ad un processo non vengono create tutte le strutture dati necessarie alla creazione di un processo, per cui un thread risulta molto più “leggero” (nel senso che occupa meno memoria) di un processo, poiché tutti i thread relativi ad un processo utilizzano le stesse strutture dati che caratterizzano il processo di cui essi fanno parte.

Per il fatto che il sistema sia multitasking e multithreading nasce l’esigenza della sincronizzazione delle operazioni effettuate dai vari task e thread, per evitare problemi insidiosi come i deadlock25 e le race condition26. L’argomento è piuttosto complesso ed è trattato in modo approfondito in [0]. A tale scopo l’accesso dei thread o processi alle risorse è regolato da meccanismi di mutua esclusione (semafori, mutex, ...). Inoltre, poiché l’esecuzione di un thread può essere interrotta in qualunque momento (ad esempio perché termina il suo time slice di utilizzo della CPU), si introduce il concetto di operazione atomica, ovvero un’insieme di operazioni che un thread può eseguire con la garanzia da parte del sistema che non sarà interrotto durante l’esecuzione (tutto il gruppo di operazioni viene eseguito nello stesso time slice). Dal punto di vista di programmazione il controllo di più thread è più complesso rispetto al controllo di più processi.