Permettimi di contraddirti strafe...
il prefetch non funziona assolutamente come dici tu.
L'area di prefetch è una zona di memoria riservata al precaricamento di codice eseguibile (cioè ci va solo codice di librerie e programmi, non dati). Questa zona viene allocata in posizioni strategiche (e non contigue), secondo algoritmi statistici molto complessi. Questo perchè la memoria RAM, essendo ad accesso casuale, permette di "accorpare" virtualmente zone anche non contigue, come fossero un'unica area di memoria continua.
Il codice eseguibile precaricato in essa è scelto a sua volta mediante altri algoritmi statistici che valutano il "peso" di ciascuna porzione di codice, in base alla frequenza d'uso, ma anche ad altri parametri (quali la riusabilità, per esempio una libreria è statisticamente più probabile venga usata magari da più applicazioni).
Una volta precaricato il codice, quando questo viene richiamato dal sistema o dall'utente in condizioni di ampia dispobibilità di memoria viene copiato (la memoria allocata come cache è flaggata come non eseguibile), in un'altra zona di memoria, mantenendo nella cache la copia originale.
All'aumento di richiesta di memoria il meccanismo cambia leggermente, perchè, il codice viene eseguito senza essere copiato (si cambia la flag di esecuzione su quella particolare area di memoria) che viene "rimarcata" al termine dell'esecuzione.
In pratica virtualmente viene sottratta quella memoria dal quantitativo della cache di prefetch, per poi essere "riaggiunto" secondo meccanismi statistici alla fine dell'esecuzione.
L'impressione utilizzando come strumento di analisi l'analizzatore (scusa il gioco di parole) di processi di windows è che venga liberata una maggior quantità di memoria, ma in realtà la memoria allocata è sempre la stessa.
Quello che cambia è come viene "marcata" l'area di memoria in cui in condizioni di ampia disponibilità di memoria verrebbe copiato il codice eseguibile richiamato. Quella che normalmente infatti sarebbe area d'esecuzione (e quindi non sarebbe possibile caricarci altro che il codice in oggetto), viene marcata come area dati per quel codice.
In soldoni?
Un eseguibile che senza prefetch occupa fisicamente in memoria X, andrà ad occupare in condizionid di ampia disponibilità di memoria 2X (esecuzione + copia in cache), ed in caso di mancanza di memoria X+Y, dove Y è la porzione di memoria deputata a parte dei dati di esecuzione già virtualmente contenuta in X, ma che non può essere usata direttamente (richiedendo l'allocazione di un'area esterna), perchè l'area di dimensione X deve essere mantenuta "immutata" per poter essere poi rimarcata come "cache prefetch".