@ultrasound: la cosa e' decsamente piu' complicata di cosi'!
In soldoni.
In Windows i programmi non vengono caricati in memoria.
Quello che Windows fa e' mappare il file dell'eseguibile nel segmento della memoria virtuale associata al codice, quindi crea il segmento relativo allo stack e allo heap.
Ora, ritorna in gioco la questione delle pagine! Ed in particolare il concetto di working set (WS): Il SO carica nella memoria fisica solo le pagine associate al segmento di codice correntemente in esecuzione, dello stack e dello heap correntemente in uso.
A mano a mano che l'esecuzione avanza, piu' stack viene usato o piu' dati vengono allocati nello heap, si vanno a caricare in memoria altre pagine.
Quante? C'e' un numero minimo e un numero massimo, che dipende dalla dimensione dell'eseguibile, dalla quantita' di memoria fisica, dal numero di processi attivi e dai relativi WS.
Il numero di queste pagine cambia con il tempo, secondo opportune politiche di ottimizzazione.
Se il processo richiede di caricare PIU' pagine del WS, il SO si occupa di scaricare su disco alcune pagine del processo corrente, o di altri processi ed allocarne di nuove.
Ovviamente tutto l'ambaradan entra in gioco in modo evidente quando vuoi usare piu' memoria di quella fisicamente disponibile: se non hai abilitato i PagingFile, Windows non puo' liberare la memoria ed il processo corrente va in crash (oltre ad impastare il sistema, perche' con scarsita' di memoria, tutto va in malora).
Ovviamente, visto che anche il PagingFile ha generalmente una dimensione massima, se tenti di allocare PIU' memoria di quella fisica + quella disponibile nel PagingFile, schianta tutto!
Nota: la partizione di swap di Linux e' l'equivalente del PagingFile di Windows: hanno lo stesso compito.