Cos'è un recinto di memoria?
-
08-07-2019 - |
Domanda
Cosa si intende per utilizzo di una barriera di memoria esplicita?
Soluzione
Ai fini delle prestazioni, le moderne CPU eseguono spesso istruzioni non funzionanti per sfruttare al massimo il silicio disponibile (inclusa la lettura / scrittura della memoria). Poiché l'hardware impone l'integrità delle istruzioni, questo non viene mai notato in un singolo thread di esecuzione. Tuttavia, per più thread o ambienti con memoria volatile (ad esempio I / O mappati in memoria) ciò può portare a comportamenti imprevedibili.
Una barriera / barriera di memoria è una classe di istruzioni che indica che le letture / scritture della memoria si verificano nell'ordine previsto. Ad esempio, un "full fence" indica tutte le operazioni di lettura / scrittura prima che il recinto venga eseguito prima di quelli dopo il recinto.
Nota: i recinti di memoria sono un concetto hardware. Nei linguaggi di livello superiore siamo abituati a trattare con mutex e semafori - questi potrebbero essere implementati usando recinzioni di memoria a basso livello e l'uso esplicito delle barriere di memoria non è necessario. L'uso delle barriere di memoria richiede uno studio attento dell'architettura hardware e più comunemente presente nei driver di dispositivo rispetto al codice dell'applicazione.
Il riordino della CPU è diverso dalle ottimizzazioni del compilatore, sebbene gli artefatti possano essere simili. È necessario adottare misure separate per impedire al compilatore di riordinare le istruzioni se ciò può causare comportamenti indesiderati (ad esempio l'uso della parola chiave volatile in C).
Altri suggerimenti
Copia la mia risposta ad un'altra domanda, Quali sono alcuni trucchi che un processore fa per ottimizzare il codice? :
Il più importante sarebbe il riordino dell'accesso alla memoria.
Assenze recinzioni di memoria o istruzioni di serializzazione, il processore è libero di riordinare gli accessi alla memoria. Alcune architetture di processori hanno restrizioni su quanto possono riordinare; Alpha è noto per essere il più debole (cioè quello che può riordinare di più).
Un ottimo trattamento dell'argomento può essere trovato nella documentazione sorgente del kernel Linux, in Documentazione / memory-barriers.txt .
Il più delle volte, è meglio usare primitive bloccanti dal compilatore o dalla libreria standard; questi sono ben testati, dovrebbero avere tutte le necessarie barriere di memoria e probabilmente sono abbastanza ottimizzati (l'ottimizzazione delle primitive di blocco è difficile; anche gli esperti possono sbagliarle a volte).
Nella mia esperienza si riferisce a una barriera di memoria , che è un'istruzione (esplicita o implicito) per sincronizzare l'accesso alla memoria tra più thread.
Il problema si verifica nella combinazione di moderni compilatori aggressivi (hanno una straordinaria libertà di riordinare le istruzioni, ma di solito non sanno nulla dei tuoi thread) e moderne CPU multicore.
Una buona introduzione al problema è il " The ' La dichiarazione con doppio controllo è rotta "Dichiarazione ". Per molti, è stato il campanello d'allarme che ci sono draghi.
Le barriere implicite di memoria completa sono generalmente incluse nelle routine di sincronizzazione dei thread della piattaforma, che ne coprono il nucleo. Tuttavia, per una programmazione senza blocchi e l'implementazione di schemi di sincronizzazione personalizzati e leggeri, spesso è necessaria solo la barriera o anche solo una barriera a senso unico.
Barriera di memoria, nota anche come membar o memory fence, è una classe di istruzioni che causano una centrale unità di elaborazione (CPU) per imporre un vincolo di ordinazione sulla memoria operazioni emesse prima e dopo il istruzione barriera.
Le CPU utilizzano ottimizzazioni delle prestazioni ciò può risultare fuori servizio esecuzione, incluso carico di memoria e operazioni di magazzino. Operazione di memoria il riordino normalmente passa inosservato all'interno di un singolo thread di esecuzione, ma provoca comportamenti imprevedibili in programmi e driver di dispositivo simultanei se non attentamente controllato. L'esatto la natura di un vincolo di ordinazione è dipendente dall'hardware e definito da modello di memoria dell'architettura. Alcuni le architetture forniscono molteplici barriere per far rispettare diverse vincoli di ordinazione.
Le barriere di memoria sono generalmente utilizzate durante l'implementazione di macchine di basso livello codice che funziona su memoria condivisa da più dispositivi. Tale codice include primitive di sincronizzazione e strutture dati senza blocco su sistemi multiprocessore e dispositivo driver che comunicano con il computer hardware.