2016-06-11 33 views
6

Se ho un puntatore e mi preoccupo delle prestazioni di accesso alla memoria, posso verificare se la successiva operazione su di esso attiverà un errore di pagina. In caso affermativo, è possibile progettare un algoritmo in modo che riordini le operazioni di loop per ridurre al minimo gli errori di pagina.Come sapere se un puntatore si trova nella memoria fisica o provocherà un errore di pagina?

Esiste un modo portatile (o linux/windows non portatile) per controllare un particolare indirizzo di memoria se l'accesso attiverà un errore di pagina?

+0

Perché non basta usare questo algoritmo per tutto il tempo? Presumibilmente massimizzerebbe anche l'utilizzo della cache, che migliorerebbe comunque le prestazioni. –

+0

Decisamente un modo portabile, non c'è niente per questo nella libreria C++. E molto improbabile nella pratica; le strutture necessarie che il kernel del sistema operativo utilizza per gestire la memoria virtuale devono, ovviamente, essere nello spazio del kernel protetto. Non vedo immediatamente un evidente problema di sicurezza con accesso in sola lettura; tuttavia questa è una porzione di dati così esoterica, è improbabile che qualsiasi sistema operativo spenda degli sforzi per esporre questi dati. –

+0

[C'è in Windows e non si desidera utilizzarlo] (https://blogs.msdn.microsoft.com/oldnewthing/20060927-07/?p=29563/). – nwp

risposta

3

No. Non esiste un modo portatile per verificare se un dato indirizzo è attualmente nella memoria fisica o scambiato nel file di scambio. In realtà, non penso che Linux o Windows offrano la possibilità di controllarlo in modo non portatile. (Naturalmente, in Linux si può scrivere ).

Come altri hanno detto nei commenti, si desidera anche verificare se i dati sono nella cache o meno (l'accesso dalla memoria fisica è molto più lento rispetto alla cache).

La soluzione migliore è riordinare il ciclo per ridurre al minimo gli errori di pagina (== massimizza la località di riferimento).

6

Circa dieci anni fa, Emery Berger ha proposto una strategia di garbage collection VM-aware che richiedeva all'applicazione di sapere quali pagine erano presenti in memoria. A scopo di test, lui e i suoi studenti hanno prodotto una patch del kernel che ha notificato l'applicazione di eventi di paging utilizzando segnali in tempo reale, consentendo al garbage collector di mantenere il proprio database di pagine residenti. (Anche se sembra una duplicazione degli sforzi, è molto più efficiente di più chiamate di sistema al fine di ottenere informazioni ogni volta che è necessario.)

È possibile trovare informazioni su questa interessante ricerca sul suo research page.

Per quanto ne so, non esiste alcuna implementazione di questa patch per un kernel Linux recente, ma sarebbe sempre possibile ripristinarla.

+0

Questo è davvero interessante! Mi chiedo se i risultati che sostengono siano davvero impressionanti _ "Eseguendo raccolte di dati inutili in memoria, BC può accelerare i programmi Java di ordini di grandezza (fino a 41X)." _ In questo caso non vedo alcun motivo per cui linux lo sviluppo non ha aggiunto questa funzionalità ai kernel recenti. Pensi che ci sia qualche problema di sicurezza? – AndresR

+0

No, non penso ci siano mai stati problemi di sicurezza. Ho un'opinione sul perché l'idea non è stata accettata, ma basti dire che nessuno nel team di linux era sufficientemente motivato per difendere l'idea. – rici

+1

Accelera i programmi Java di 10 anni che utilizzavano una strategia di raccolta dei dati inutili inefficace. Non sono sicuro di come sia applicabile a C o C++ o a qualsiasi altro linguaggio non garbage collection. (Non per sottrarre alla risposta, informazioni storiche molto interessanti.) –

0

Su Linux c'è un meccanismo, vedere man proc:

/[pid]/pagemap Questo file mostra la mappatura di ciascuna delle virtuali le pagine del processo in frame fisici o area di swap. Esso contiene un valore a 64-bit per ogni pagina virtuale, con i bit impostati come segue:

  • 63 Se impostato, la pagina è presente nella RAM.
  • 62 Se impostato, la pagina è nello spazio di swap
  • ...

Per esempio,

$ sudo hexdump -e '/0 "%08_ax "' -e '/8 "%016X" "\n"' /proc/self/pagemap 
00000000 0600000000000000 
* 
00002000 A6000000000032FE 
00002008 A60000000007F3A6 
00002010 A600000000094560 
00002018 A60000000008D0C0 
00002020 A60000000009EBE6 
00002028 A6000000000C8E87 
+0

Questo sembra davvero promettente, mi chiedo quanto sarebbe rapido mantenere il sondaggio qui per prendere decisioni. È accessibile senza accesso root? – AndresR

+0

Non sono sicuro che tu voglia usare questo meccanismo per fare ciò che volevi, ho appena elencato per completezza. Sembra che tu abbia bisogno di essere root, dato che anche se il file proc sembra essere di mia proprietà, se provo ad aprirlo ricevo il codice di errore "Operazione non consentita". – meuh

Problemi correlati