Sistema operativo - Multi-threading

Cos'è Thread?

Un thread è un flusso di esecuzione attraverso il codice del processo, con un proprio contatore di programma che tiene traccia di quale istruzione eseguire successivamente, registri di sistema che contengono le sue variabili di lavoro correnti e uno stack che contiene la cronologia di esecuzione.

Un thread condivide con i suoi thread peer poche informazioni come segmento di codice, segmento di dati e file aperti. Quando un thread altera un elemento della memoria del segmento di codice, tutti gli altri thread lo vedono.

Un thread è anche chiamato a lightweight process. I thread forniscono un modo per migliorare le prestazioni dell'applicazione tramite il parallelismo. I thread rappresentano un approccio software per migliorare le prestazioni del sistema operativo riducendo l'overhead thread equivale a un processo classico.

Ogni thread appartiene esattamente a un processo e nessun thread può esistere al di fuori di un processo. Ogni thread rappresenta un flusso di controllo separato. I thread sono stati utilizzati con successo nell'implementazione di server di rete e server web. Forniscono inoltre una base adeguata per l'esecuzione parallela di applicazioni su multiprocessori a memoria condivisa. La figura seguente mostra il funzionamento di un processo a thread singolo e multithread.

Differenza tra processo e thread

SN Processi Filo
1 Il processo è pesante o richiede molte risorse. Il filo è leggero e richiede meno risorse di un processo.
2 Il cambio di processo richiede l'interazione con il sistema operativo. Il cambio di thread non deve interagire con il sistema operativo.
3 In più ambienti di elaborazione, ogni processo esegue lo stesso codice ma ha la propria memoria e le proprie risorse di file. Tutti i thread possono condividere lo stesso insieme di file aperti, processi figli.
4 Se un processo è bloccato, nessun altro può essere eseguito fino a quando il primo processo non viene sbloccato. Mentre un thread è bloccato e in attesa, può essere eseguito un secondo thread nella stessa attività.
5 Più processi senza l'utilizzo di thread utilizzano più risorse. Più processi a thread utilizzano meno risorse.
6 In più processi ogni processo opera indipendentemente dagli altri. Un thread può leggere, scrivere o modificare i dati di un altro thread.

Vantaggi di Thread

  • I thread riducono al minimo il tempo di cambio di contesto.
  • L'uso dei thread fornisce la concorrenza all'interno di un processo.
  • Comunicazione efficiente.
  • È più economico creare e cambiare contesto i thread.
  • I thread consentono l'utilizzo di architetture multiprocessore su scala ed efficienza maggiori.

Tipi di filo

I thread vengono implementati nei seguenti due modi:

  • User Level Threads - Thread gestiti dall'utente.

  • Kernel Level Threads - Thread gestiti dal sistema operativo che agiscono sul kernel, un core del sistema operativo.

Thread a livello utente

In questo caso, il kernel di gestione dei thread non è a conoscenza dell'esistenza dei thread. La libreria di thread contiene codice per creare e distruggere thread, per passare messaggi e dati tra thread, per pianificare l'esecuzione di thread e per salvare e ripristinare i contesti di thread. L'applicazione inizia con un singolo thread.

Vantaggi

  • Il cambio di thread non richiede privilegi in modalità kernel.
  • Il thread a livello utente può essere eseguito su qualsiasi sistema operativo.
  • La pianificazione può essere specifica dell'applicazione nel thread a livello utente.
  • I thread a livello utente sono veloci da creare e gestire.

Svantaggi

  • In un tipico sistema operativo, la maggior parte delle chiamate di sistema si blocca.
  • L'applicazione multithread non può sfruttare il multiprocessing.

Thread a livello di kernel

In questo caso, la gestione dei thread viene eseguita dal kernel. Non è presente alcun codice di gestione dei thread nell'area dell'applicazione. I thread del kernel sono supportati direttamente dal sistema operativo. Qualsiasi applicazione può essere programmata per essere multithread. Tutti i thread all'interno di un'applicazione sono supportati all'interno di un singolo processo.

Il kernel mantiene le informazioni di contesto per il processo nel suo insieme e per i singoli thread all'interno del processo. La pianificazione dal kernel viene eseguita su base thread. Il kernel esegue la creazione, la pianificazione e la gestione dei thread nello spazio del kernel. I thread del kernel sono generalmente più lenti da creare e gestire rispetto ai thread utente.

Vantaggi

  • Il kernel può pianificare contemporaneamente più thread dallo stesso processo su più processi.
  • Se un thread in un processo è bloccato, il kernel può pianificare un altro thread dello stesso processo.
  • Le routine del kernel stesse possono essere multithread.

Svantaggi

  • I thread del kernel sono generalmente più lenti da creare e gestire rispetto ai thread utente.
  • Il trasferimento del controllo da un thread a un altro all'interno dello stesso processo richiede un cambio di modalità al kernel.

Modelli multithreading

Alcuni sistemi operativi forniscono un thread a livello utente combinato e una funzione thread a livello di kernel. Solaris è un buon esempio di questo approccio combinato. In un sistema combinato, più thread all'interno della stessa applicazione possono essere eseguiti in parallelo su più processori e una chiamata di sistema di blocco non deve bloccare l'intero processo. I modelli multithreading sono di tre tipi

  • Molti a molti relazione.
  • Molti a uno.
  • Rapporto uno a uno.

Molti a molti modello

Il modello molti-a-molti multiplexa un numero qualsiasi di thread utente su un numero uguale o inferiore di thread del kernel.

Il diagramma seguente mostra il modello di threading molti-a-molti in cui 6 thread a livello utente sono multiplexing con 6 thread a livello di kernel. In questo modello, gli sviluppatori possono creare tutti i thread utente necessari ei thread del kernel corrispondenti possono essere eseguiti in parallelo su una macchina multiprocessore. Questo modello fornisce la massima precisione sulla concorrenza e quando un thread esegue una chiamata di sistema di blocco, il kernel può pianificare un altro thread per l'esecuzione.

Molti a un modello

Il modello many-to-one associa molti thread a livello utente a un thread a livello di kernel. La gestione dei thread viene eseguita nello spazio utente dalla libreria di thread. Quando il thread effettua una chiamata di sistema di blocco, l'intero processo verrà bloccato. Solo un thread alla volta può accedere al kernel, quindi più thread non possono essere eseguiti in parallelo su multiprocessori.

Se le librerie di thread a livello utente sono implementate nel sistema operativo in modo tale che il sistema non le supporti, i thread del kernel utilizzano le modalità di relazione molti-a-uno.

Modello uno a uno

Esiste una relazione uno a uno del thread a livello utente con il thread a livello di kernel. Questo modello fornisce più concorrenza rispetto al modello molti-a-uno. Consente inoltre l'esecuzione di un altro thread quando un thread effettua una chiamata di sistema di blocco. Supporta più thread da eseguire in parallelo sui microprocessori.

Lo svantaggio di questo modello è che la creazione del thread utente richiede il thread del kernel corrispondente. OS / 2, Windows NT e Windows 2000 utilizzano un modello di relazione uno a uno.

Differenza tra thread a livello di utente e thread a livello di kernel

SN Thread a livello utente Thread a livello di kernel
1 I thread a livello utente sono più veloci da creare e gestire. I thread a livello di kernel sono più lenti da creare e gestire.
2 L'implementazione avviene tramite una libreria di thread a livello di utente. Il sistema operativo supporta la creazione di thread del kernel.
3 Il thread a livello utente è generico e può essere eseguito su qualsiasi sistema operativo. Il thread a livello di kernel è specifico del sistema operativo.
4 Le applicazioni multi-thread non possono sfruttare il multiprocessing. Le routine del kernel stesse possono essere multithread.