Da qui https://people.freebsd.org/~lstewart/articles/cpumemory.pdf
-
- Does scrivere operazione portare i dati nella cache?
Dall'articolo:
Di default tutti i dati letti o scritti dai core della CPU è memorizzato nella cache . Vi sono aree di memoria che non possono essere memorizzate nella cache, ma questo è qualcosa di cui devono preoccuparsi solo gli implementatori del sistema operativo; è non visibile al programmatore dell'applicazione. Esistono anche le istruzioni che consentono al programmatore di ignorare deliberatamente determinate cache. Questo saranno discussi nella sezione 6.
-
- Nell'assegnazione grande memoria, la memoria può venire dal sistema operativo. questo meccanismo occuperà la cache?
Forse no. Occuperà la cache solo dopo aver letto o scritto i dati. Dall'articolo:
Sui sistemi operativi come Linux con il supporto della domanda di paging, una chiamata mmap modifica solo le tabelle di pagina ... No memoria effettiva è allocato al momento della chiamata mmap.
La parte di allocazione si verifica quando si accede per la prima volta a una pagina di memoria, leggendo o scrivendo dati o eseguendo il codice. Nella risposta al conseguente errore di pagina, il kernel prende il controllo e determina, usando l'albero della tabella della pagina, i dati che devono essere presenti sulla pagina . Questa risoluzione dell'errore di pagina non è economica, ma succede per ogni singola pagina utilizzata da un processo.
-
3 .Assume che v'è un array allocato B, e l'intero B è ora nella cache. Le linee della cache occupate da B diventano non valide (disponibili) subito dopo l'array B libero?
dall'articolo invalidazione di una linea di cache avviene solo quando v'è stata un'operazione di scrittura su un altro CPU
Che ha sviluppato nel corso degli anni è la MESI coerenza della cache protocollo (Modified, Esclusivo, Condiviso , Non valido). Il protocollo prende il nome da i quattro stati in cui può essere inserita una linea di cache quando si utilizza il protocollo MESI. ... Se il secondo processore desidera scrivere sulla linea cache, il primo processore invia il contenuto della riga cache e contrassegna la linea cache localmente come non valida.
E anche la linea di cache può essere sfrattati:
un altro particolare della cache che è piuttosto interessante per i programmatori è la strategia di sostituzione della cache. La maggior parte delle cache sfrutta prima l'elemento meno recente (LRU).
E dalla mia esperienza con TCMalloc free()
non è un motivo valido per sfrattare la memoria da una cache. Al contrario potrebbe essere dannoso per le prestazioni. Su free()
TCMalloc mette semplicemente un blocco di memoria liberato nella sua cache. E questo blocco di memoria verrà restituito da malloc()
quando un'applicazione richiederà un blocco di memoria la volta successiva. Questa è l'essenza di un coclea di allibratori come TCMalloc. E se questo blocco di memoria è ancora in cachethen, è ancora meglio per le prestazioni!
Direi che questo non è qualcosa controllato dalla lingua. Per la lingua, tutto ciò è astratto come "memoria". Vedi [questo] (http://www.programcreek.com/2012/10/how-is-an-array-stored-in-memory-and-brought-to-cache/) però. –
@ArjunSreedharan: il compilatore conosce il sistema operativo e la CPU. Potrebbe aggiungere istruzioni per il controllo della cache. – MSalters