È possibile suggerire a Windows di eliminare completamente un processo di scambio


13

È possibile suggerire al gestore della memoria virtuale di Windows di eliminare un particolare processo?

La situazione in cui mi trovo spesso sta normalmente usando circa il 50% della mia RAM per tutti i normali programmi, uno in particolare un IDE per un target incorporato, insieme al debugger associato.

Poi lascio in esecuzione un processo affamato di memoria, ad esempio WireShark o qualcosa che sta accumulando dati durante un fine settimana, tutto viene scambiato, come dovrebbero. Al termine del processo, la maggior parte dei processi viene scambiata.

Quindi le sporadiche pause per scambiare nuovamente il processo causano problemi con il debugger, presumibilmente a causa di problemi di temporizzazione nelle comunicazioni tra IDE e hardware-debugger. Pertanto, il controllo del dispositivo di destinazione può essere sporadico fino a quando un numero sufficiente di tentativi non ha ripristinato i dati di debug nell'IDE.


Questo sarebbe molto utile! Dal punto di vista degli utenti, è fastidioso attendere il processo di scambio dopo ogni clic o azione dell'utente. Sarebbe molto meglio dire: "cancella questo processo!" , prendi un caffè e torna a un sistema reattivo!
Tomas,

Non ho familiarità con le specifiche del processo di scambio di Windows ma è questo qualcosa che stai cercando? Dovrebbe esserci un esempio binario funzionante nei commenti.
Rik,

1
Una volta ho fatto una domanda simile e ho scritto un programma basato sulle risposte che ho ricevuto su Stack Overflow.
Kerrek SB,

@Kerrek, ho provato a compilare il codice in MinGW e ho riscontrato errori su ogni lettura "Impossibile leggere un byte da 0x161000, errore 299 (0 byte letti)." Dal momento che ho solo Windows al lavoro, non sono stato abbastanza coraggioso da eseguire il binario casuale che hai collegato, quindi il problema potrebbe essere nella mia compilation.
Greg,

1
@KerrekSB, sembra un problema minore. Forse stai toccando un'area di memoria che non è mappata? Comunque penso che la tua risposta meriti la generosità :) PS: lo unsapap sembra molto più lento di quanto potrebbe essere, rispetto alla velocità dell'HDD. Sembra che il collo di bottiglia sia da qualche altra parte, ma dove?
Tomas,

Risposte:


1

KerrekSB ha sviluppato uno strumento speciale per questo scopo:

/programming//a/2940209/684229

È disponibile su GiTHUB con file binari: https://github.com/louisdx/unpage

Durante l'esecuzione, vengono visualizzati molti errori "Impossibile leggere un byte da 0x .... 000, errore 299 (0 byte letti)", ma non è un problema, lo strumento funziona alla grande.


"ma è un problema"? Non penso sia un problema.
Kerrek SB,

Citazione: "strumento che tenta di ripristinare tutte le applicazioni nella memoria fisica". Con il "processo affamato di memoria" del poster questo potrebbe non funzionare.
harrymc,

@harrymc citazione dalla domanda: After the big process is finished, most processes are left in swap.. Quindi presumibilmente ha già concluso il "processo di fame della memoria".
Rik

@KerrekSB ovviamente, quello era un errore di battitura. Grazie :-)
Tomas,

@Tomas Ho trovato questo . Con la mia conoscenza molto limitata di c ++, ho verificato che per ogni accesso non riuscito la pagina è effettivamente protetta dal bit PAGE_GUARD. Ho usato if (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }poco prima della linea ReadProcessMemory. PAGE_GUARD è 256 e ho 260 con le pagine non riuscite. Quindi è possibile sbarazzarsi degli errori. Qualcuno con una certa conoscenza di c ++ e Paging deve leggere sul bit PAGE_GUARD.
Rik

1

È possibile utilizzare Process Lasso per assegnare a un processo una priorità della pagina Memoria :

A partire da Windows Vista, ogni pagina di memoria ha una priorità che va da 0 a 7. L'elenco di standby è diviso in otto elenchi che ciascuno gestisce pagine con priorità diversa. Quando Memory Manager desidera prendere una pagina dall'elenco di standby, prende prima le pagine dagli elenchi a bassa priorità. "

Process Lasso può aiutare a gestire le priorità di memoria consentendo di impostare priorità di memoria persistenti per i processi, in modo che le loro pagine di memoria virtuale siano impostate su una priorità specifica ogni volta che vengono eseguite.

Process Lasso ha due versioni: gratuita e commerciale ($ 18,95 con prova).


Temo che tu stia rispondendo a una domanda completamente diversa. Dare al processo una priorità di memoria è un compito diverso, probabilmente inutile nel contesto OP e io delineati: quando hai già un processo che è in scambio e vuoi annullarlo. Non vuoi impedire che cambi.
Tomas,

@Tomas: Questa non è la mia comprensione. La richiesta è di impedire che un determinato processo venga scambiato. Se il processo stesso non è programmato per bloccare le sue pagine in memoria, la soluzione migliore successiva è assegnargli la massima priorità di memoria per rendere meno probabile lo scambio.
harrymc il

3
@harrymc, OP dice quando il porco di memoria viene eseguito, "tutto viene scambiato - come dovrebbero" quindi questo è ciò che l'OP vuole. È solo che lunedì mattina vuole che gli insiemi di lavoro dei processi importanti vengano introdotti tutti in una volta, non in frantumi e trame da errori di pagina nel tempo.
mgkrebbs,

@mgkrebbs: Questa è una soluzione diversa al problema, che credo sia impossibile da fare. La mia soluzione è che se l'IDE non viene mai sostituito, non è necessario sostituirlo nuovamente. Il "processo di fame della memoria" avrà solo pochi megabyte di RAM in meno, il che non influirà troppo sulle sue prestazioni.
harrymc,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.