2010-03-02 14 views
15

Ho un programma che richiede molta memoria, come 2/3 di tutta la RAM fisica. Dopo un certo periodo di tempo il mio sistema operativo inizia a cambiare il programma in hdd. Ma ho bisogno che il programma risponda molto velocemente tutto il tempo, quindi ho bisogno di evitare il paging per quel processo.Come impedire il paging per un programma/processo?

Come si può impedire al sistema operativo di scambiare un processo?

Grazie per qualsiasi aiuto!

risposta

8

All'inizio del programma, chiamare:

mlockall(MCL_CURRENT | MCL_FUTURE); 

(Se non si ha il sorgente del programma, si dovrà corrompere il processo con ptrace per fare questo).

Tenere presente che ciò aumenterà le possibilità di allocazioni di memoria causate dal mancato funzionamento del processo.

+0

Non penso che * si possa * "depredare" il processo. No, a meno che tu non abbia accesso alla tecnologia di Tron. :) –

+2

"debauch" un processo significa farlo ubriacare, festeggiare con esso, ecc ... :) – dicroce

+0

Penso che sia una metafora corretta :) – caf

4

Usa mmap() al posto di malloc, e utilizzare il flag "MAP_LOCKED". (funziona su linux> 2.5.37)

+0

Si noti che questo avrà lo stesso effetto (rispetto allo scambio) come usando * mlock *; quindi si applicano gli stessi avvertimenti. – sleske

+0

Ecco un collegamento a una discussione @ kerneltrap riguardante questa tecnica: http://kerneltrap.org/node/7878 – dicroce

6

Bene, c'è il mlock per il blocco della memoria (che dice che il kernel potrebbe non essere scambiato), ma è pensato per quantità relativamente piccole di memoria e richiederebbe una modifica del programma.

L'altra opzione potrebbe essere quella di regolare la "swappiness" di Linux, cioè la sua tendenza a scambiare pagine. Vedi here per una discussione interessante. Ciò non è possibile per processo, tuttavia.

Non sono a conoscenza di alcuna soluzione per processo per il tuo problema.