/ / Alcuni dubbi sulla programmazione senza blocco [chiuso] - c ++, c, assemblaggio, senza blocco

Alcuni dubbi sulla programmazione senza blocco [chiuso] - c ++, c, assemblaggio, senza blocco

Ciao gente,
Prima di tutto mi dispiace, questo sarà un post abbastanza lungo. Quindi, per favore abbiate la pazienza di leggerlo.

Qui, ho intenzione di mettere giù alcuni concetti che ho imparato mentre sfogliare alcuni articoli sulla programmazione lock-free e presentare i miei dubbi su tale apprendimento.
Inoltre, la discussione è sulla piattaforma * NIX multiprocessore.

Iniziando dicendo "LOCKLESS = BLOCKLESS" come si dice che il sistema dei thread nel suo insieme progredisce perché un CAS / DCAS può fallire solo se qualche thread ha fatto progressi.
Quindi, possiamo dire che, qui in caso di blocco su un mutex, stiamo ruotando / aspettando una condizione (il ciclo CAS mentre per es.).

Quest1> In che modo girare su un ciclo while è più efficiente del blocco su a
mutex?
Quest2> Un buon design che impiega mutex assicura anche che il sistema progredisca, quindi
non è BLOCKLESS anche per definizione?

Come risposta alla domanda 1, si potrebbe sostenere che il blocco può andare nell'attesa del kernel e potrebbero esserci dei commutatori di contesto che possono essere costosi. Qualsiasi ulteriore chiarezza su di esso sarebbe apprezzato.

Ok, supponendo che dopo aver ottenuto la risposta per la prima domanda 2 sarò convinto a pensare che il lock-free sia veramente veloce e in tempo reale quando le operazioni atomiche devono essere fatte non sono grandi / in termini di tempo.

Quest3> Quindi, non è lock-free qualcosa come spinlock? Se sì, perché non possiamo usare 
blocco rotazione pthread?

Andando avanti, nella maggior parte della letteratura disponibile in rete, si vedrebbe un'implementazione di un'operazione atomica come questa:

__asm__ __volatile __ ("locknxadd" X "% 0,% 1" : "= r" (risultato), "= m" (* (T *) i_pAddress) : "0" (i_addValue) : "memoria"); // Cosa significa questo ? Memoria Scherma?
Quest4> Fa ": memory" nel suddetto assemblare significa schermare la memoria? Se si, 
non richiede circa 100 cicli da implementare?
Quest5> Doesnt l'istruzione di blocco qui asserisce che l'operazione è in corso
fatto su una risorsa condivisa, quindi altri thread stanno bloccando qui?
Per quanto ne so
questa domanda non è valida per l'arco multi proc proc Intel più o meno recente
come il blocco è fatto sulle linee della cache.

Grazie in anticipo.

risposte:

2 per risposta № 1

Sono molte domande!

In che modo girare su un ciclo while è più efficiente del blocco su un mutex?

Se la risorsa è in gran parte incontattata, in media non si deve girare a lungo, il che potrebbe renderlo più economico rispetto all'utilizzo di un mutex.

Un buon design che impiega mutex assicura anche che il sistema progredisca, quindi non è BLOCKLESS anche per definizione?

Probabilmente è più giusto per i thread in attesa. Se si gira mentre si attende una risorsa, una discussione "sfortunata" potrebbe dover attendere molto tempo.

Quindi, non è lock-free qualcosa come lo spinlock? Se sì, perché non possiamo usare il blocco dello spin pthread?

Se hai una buona idea su come rendere un algoritmo privo di blocco, potresti non dover girare affatto.

Fa ": memory" nel suddetto assemblare significa schermare la memoria? Se sì, non occorrono circa 100 cicli da implementare?

Sì, è la scherma della memoria sui sistemi che ne hanno bisognoquello. La sincronizzazione di molte cache della CPU richiede molto tempo (forse più di 100 clock). D'altra parte, uno spinlock o un mutex richiederebbe anche il funzionamento corretto delle recinzioni memeory.

L'istruzione di blocco qui non asserisce che l'operazione viene eseguita su una risorsa condivisa, quindi altri thread stanno bloccando qui?

Si tratta di un tipo diverso di blocco, probabilmente a livello di hardware: se altri thread richiedono i dati appena aggiornati, dovranno attendere che diventino disponibili su loro PROCESSORE.


2 per risposta № 2
  1. lock-free in qualche modo usa alcuni spinlock comecose. Ma quando parliamo di spin come lock, di solito vogliamo sincronizzare grandi blocchi di codice. E quando parliamo di lock-free, prende di mira un compito, che di solito è solo una istruzione. Il primo gira quando fa qualcosa da molto tempo e il secondo gira quando ha fatto qualcosa di breve. Il primo continua a girare e il secondo "giro" è semplicemente un "tentativo".

  2. se non ho fatto alcun errore, quel "ricordo" significa non farloOttimizza le variabili di memoria nella variabile di registro (non proprio corretto. Precisamente, dice al compilatore che l'uso della memoria deve essere fortemente ordinato, ma non ha nulla a che fare con la scherma della memoria hardware).

  3. l'istruzione di blocco non è veloce come quella non bloccata,ma ancora più veloce del cambio di contesto. Ma è più lento, quindi di solito quando si scrive una cosa rotante, faremo prima un test senza blocco. Se è passato, faremo quello bloccato.