2013-10-24 13 views
5

Sto lavorando a uno strumento "RAM gratuita" che deve forzare Windows per inviare il segnale 'LOW_MEMORY' a tutte le applicazioni (che chiede a tutte le applicazioni di liberare i dati inutilizzati, il server SQL e le cache dei file vengono cancellati in modo da finire con un sacco di spazio libero extra).Come forzare Windows a inviare il segnale "LOW_MEMORY" a tutte le applicazioni?

Quale sarà l'approccio migliore per farlo in C++? La soluzione più "naturale" per me sarebbe quella di allocare una grande quantità di memoria, ma è un modo "buono" e "stabile"? Forse c'è qualche funzione nativa di Windows C++ per esso in WinAPI o da qualche altra parte?

p.s. Il concetto di questo strumento è venuto da (e so che il modo migliore è quello di ... comprare un po 'di RAM, ma ho dovuto scrivere tale strumento ora):

https://superuser.com/questions/214526/how-does-a-free-up-ram-utility-free-up-ram

+0

Perché stai usando/scrivendo questo strumento? Il tuo sistema operativo libera automaticamente la RAM quando necessario. – orlp

+8

... e leggere la domanda collegata dovrebbe averti dato l'idea già che un tale strumento in generale non ti sta davvero facendo bene – codeling

+0

Lo scrivo perché la compagnia per cui lavoro mi ha fatto scrivere. Quindi non c'è "nessuna discussione" a riguardo;) E so che la maggior parte di questi programmi (come CClenaer ecc.) Lo fa anche in questo modo. Quindi voglio solo inviare quel segnale alle applicazioni di Windows in C++, anche quando è un po 'inutile nel risultato. – PolGraphic

risposta

2

Un'altra possibilità potrebbe essere quella di scorrere attraverso l'elenco processo attivo, e chiedere ognuno tagliare è working set, tramite SetProcessWorkingSetSize (hProcess, (size_t) -1, (size_t) -1), come descritto here on MSDN, potenzialmente saltando applicazioni se il tuo intento è tentare di migliorare le prestazioni di alcune applicazioni particolari (il benchmarking è assolutamente tuo amico qui).

Questo fa sì che il sistema operativo svuoti le pagine virtuali su disco, liberando la memoria fisica per altre applicazioni. Non sono sicuro che ciò causerà, ad es., SQL Server per rilassare le sue richieste di memoria, ma vale sicuramente la pena provarlo.

0

ci sono alcuni link che può essere utile a voi a MSDN:

Speriamo che possano darti un inizio. L'altro modo in cui è possibile liberare ram è segnalare a Windows ogni pagina l'assegnazione della RAM dei processi al file di scambio, che libererà la RAM fisica. Quindi, mentre l'utente utilizza una particolare applicazione, verrà spostato di nuovo su RAM fisica dal sistema operativo, in questo modo la gestione viene ancora gestita per la maggior parte dal sistema operativo.

+0

Votato per "su" per neutralizzarlo;) Triste che non potevo segnare entrambe le tue risposte, ma devo scegliere e James Hugard ha dato una soluzione, tuttavia hai dato un ottimo punto di partenza per una ricerca più approfondita. – PolGraphic

+0

Grazie per il voto in alto :) è stato onestamente solo curioso, amo la risposta di James, un modo simpatico, conciso e amichevole con il sistema operativo per fare flush alla virtual ram. – GMasucci

Problemi correlati