GNU/Linux >> Linux Esercitazione >  >> Linux

Thread preventivi vs thread non preventivi

  1. No, la tua comprensione non è del tutto corretta. I thread non preventivi (noti anche come cooperativi) in genere cedono manualmente il controllo per consentire l'esecuzione di altri thread prima che finiscano (sebbene spetti a quel thread chiamare yield() (o qualsiasi altra cosa) per farlo accadere.
  2. Anticipare il threading è più semplice. I thread cooperativi hanno meno overhead.
  3. Normalmente usa la preemptive. Se ritieni che il tuo progetto abbia un sovraccarico di cambio di thread, i thread cooperativi sarebbero una possibile ottimizzazione. In molte (la maggior parte?) situazioni, questo sarà un investimento abbastanza grande con un ritorno minimo.
  4. Sì, per impostazione predefinita otterrai il threading preventivo, anche se se cerchi il pacchetto CThreads, supporta il threading cooperativo. Poche persone (ora) vogliono thread cooperativi che non sono sicuro siano stati aggiornati nell'ultimo decennio però...

I thread non preventivi sono anche chiamati thread cooperativi. Un esempio di questi è POE (Perl). Un altro esempio è il classico Mac OS (prima di OS X). I thread cooperativi hanno l'uso esclusivo della CPU fino a quando non la rinunciano. Lo scheduler seleziona quindi un altro thread da eseguire.

I thread preventivi possono rinunciare volontariamente alla CPU proprio come quelli cooperativi, ma quando non lo fanno, verrà preso da loro e lo scheduler avvierà un altro thread. I thread POSIX e SysV rientrano in questa categoria.

I grandi vantaggi dei thread cooperativi sono una maggiore efficienza (almeno su macchine single-core) e una gestione più semplice della concorrenza:esiste solo quando cedi il controllo, quindi il blocco non è richiesto.

I grandi vantaggi dei thread preventivi sono una migliore tolleranza ai guasti:un singolo thread che non riesce a cedere non interrompe l'esecuzione di tutti gli altri thread. Normalmente funziona anche meglio su macchine multi-core, poiché più thread vengono eseguiti contemporaneamente. Infine, non devi preoccuparti di assicurarti di cedere costantemente. Ciò può essere davvero fastidioso all'interno, ad esempio, un ciclo di scricchiolii di numeri pesanti.

Puoi mescolarli, ovviamente. Un singolo thread preventivo può avere molti thread cooperativi in ​​esecuzione al suo interno.


Se utilizzi senza prelazione non significa che il processo non esegue il cambio di contesto quando il processo è in attesa di I/O. Il dispatcher sceglierà un altro processo in base al modello di pianificazione. Dobbiamo fidarci del processo.

senza prelazione:

  1. meno cambio di contesto, meno sovraccarico che può essere sensato in un modello non preventivo

  2. Più facile da gestire poiché può essere gestito su un processore single-core

preventivo :

Vantaggio:

  1. In questo modello, abbiamo una priorità che ci aiuta ad avere un maggiore controllo sul processo in esecuzione

  2. Una migliore concorrenza è un rimbalzo

  3. Gestione delle chiamate di sistema senza bloccare l'intero sistema

Svantaggio:

  1. Richiede algoritmi più complessi per la sincronizzazione e la gestione delle sezioni critiche è inevitabile.

  2. Il sovraccarico che ne deriva


Linux
  1. Introduzione ai thread di Linux – Parte I

  2. I thread hanno un heap distinto?

  3. Thread e descrittori di file

  4. fopen() è una funzione thread-safe in Linux?

  5. Quando usare pthread_exit() e quando usare pthread_join() in Linux?

Qual è la differenza tra thread NPTL e POSIX?

Verifica se la stringa ha caratteri non spazi bianchi in Bash

Gestione del segnale con più thread in Linux

Renice:Come cambiare tutti i thread?

I thread del kernel di Linux sono davvero processi del kernel?

Devo tentare di "bilanciare" i miei thread o Linux lo fa?