Domanda

Nei sistemi multitasking, alcune condizioni anomale impediscono il progresso di eseguire processi o thread. Mi riferisco sia ai processi e thread semplicemente come "processi". Due di queste condizioni sono chiamati morti-lock e live-blocco.

Il primo si riferisce ai processi che bloccano a vicenda, così impedendo sia da eseguire. Quest'ultima si riferisce a processi che impediscono reciprocamente di progredire, ma in realtà non bloccano l'esecuzione. Ad esempio, potrebbero causare continuamente l'un l'altro per eseguire il rollback le transazioni, né mai essere in grado di finirli.

Un'altra condizione è conosciuta come la fame di risorse, in cui uno o più limitate risorse, necessarie per il progresso dei processi, sono stati esauriti da loro e non può essere ripristinato a meno che lo stato di avanzamento dei processi. Questo è anche un caso particolare di live-serratura.

Mi piacerebbe sapere se c'è qualche altra definizione, in particolare di tipo accademico, per "la fame" che non si limita a "morire di fame risorsa". I riferimenti sono particolarmente benvenuti.

E, no, non si tratta di compiti a casa. : -)

È stato utile?

Soluzione

Non direi che la fame di risorse è un caso particolare di un livelock. Di solito:

  • In un livelock, nessun thread fa progressi ma tengono esecuzione. (In una situazione di stallo, non hanno nemmeno tenere in esecuzione)

  • Quando si muore di fame, un po 'di filo (s) fanno progressi e qualche filo (s) non sono in esecuzione.

Una buona spiegazione: http://docs.oracle.com/ JavaSE / tutorial / essenziali / concorrenza / starvelive.html . Ma capisco la scelta della terminologia può variare.

Quando si tratta di fame, la definizione che ho sentito è:

Supponiamo che è possibile specificare un percorso infinito di esecuzione (interlacciato) coerenti con le ipotesi (semantica semafori, comportamenti scheduler OS ...) tale che T filo è sospeso in attesa di qualche risorsa e mai ripreso, anche se era possibile infinite volte. Poi si chiama T morendo di fame.

Ma la pratica non corrisponde a quello. Supponiamo due thread eseguono sezione critial in un ciclo infinito. Tuo codice di sincronizzazione consente al primo filo per accedere alla sezione critial una volta ogni ora. E 'la fame? Entrambi i fili sono autorizzati a progredire, ma il primo sta facendo il suo lavoro dolorosamente lento.

La fonte più semplice di fame sono semafori deboli. Se si utilizza una sincronizzazione primitiva (o costruire il proprio) che si comporta allo stesso modo, allora la fame si tradurrà.

I problemi classici in cui la fame è ben nota:

Per maggiori dettagli, vi consiglio con tutto il cuore Il piccolo libro dei semafori (libero): http: //www.greenteapress .com / semafori / .

Si sta chiedendo se ogni fame è causata da in attesa di qualche risorsa. Direi - Sì.

Un thread può essere sospeso:

(1) su alcuni chiamata di sistema di bloccaggio - attesa su / acquisire un mutex, semafori, variabile condizionale; write (), poll () ecc.

(2) su qualche operazione non bloccante -. Come eseguire calcoli

Starving su (1) sta morendo di fame sulle risorse (mutex, tampone ecc.).

Starving su (2) sta morendo di fame sulla CPU - si può considerare come una risorsa. Se accade, il problema è con il programmatore.

HTH

Altri suggerimenti

Immagina di essere in una coda per l'acquisto di cibo in un ristorante, per il quale le donne in gravidanza hanno la priorità. E c'è solo un sacco di donne in gravidanza in arrivo per tutto il tempo.

Presto essere affamati. ;)

Ora immaginate di essere un processo a bassa priorità e le donne incinte sono quelle a più alta priorità. =)

Un altro settore in cui la fame o "blocco indefinito" viene tipicamente up è quando si parla di algoritmi di scheduling con priorità. Un algoritmo di schedulazione priorità ha la possibilità di lasciare un processo a bassa priorità attesa indefinitamente. Un flusso costante di processi ad alta priorità può impedire un processo a bassa priorità che possano accedere a correre.

In caso di schedulatori prioritari, la soluzione è "invecchiamento". L'invecchiamento è la tecnica di aumentare gradualmente la priorità dei processi che aspettano nel sistema per un lungo periodo di tempo.

La fame è semplicemente quando un processo o un servizio non viene servono, anche quando non v'è alcuna situazione di stallo sul sistema.

Questo è un esempio che ho appena fatto su solo a fini di chiarimento.

Immaginate un algoritmo che controllano i computer l'accesso a una rete WAN o qualcosa di simile. Questo algoritmo potrebbe avere una politica che dice "Fornire accesso prioritario a quei computer che utilizzeranno meno larghezza di banda.", Che vi sembrerà una corretta politica, ma allora che cosa succede quando un singolo computer vuole accedere alla rete per un upload ftp che verrà inviare diversi GB da qualche parte. Con solo questa politica, quel computer moriranno di fame in quanto l'algoritmo sarà mai selezionare quel computer, dal momento che ci saranno sempre altri computer che richiedono minore consumo di banda.

Questo si chiama fame.

Lavoro è anche una sorta di risorsa. Quando la distribuzione del lavoro in una configurazione produttore-consumatore non è giusto (o ideale), alcuni thread potrebbero non avere elementi di lavoro a sufficienza per tenerli occupati tutto il tempo.

Un processo non ottiene una risorsa o le risorse per un tempo più lungo. Questa non è una situazione di stallo, perché un processo / e gestito senza problemi. Invecchiamento può essere utilizzato per risolvere questo problema, un fattore di invecchiamento viene utilizzato per ogni richiesta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top