Ottimizzazione 4 Gigabyte: BCDEdit e Boot.ini

Nelle edizioni a 32 bit di Windows, le applicazioni dispongono di 4 gigabyte (GB) dello spazio indirizzi virtuale disponibile. Lo spazio indirizzi virtuale è diviso in modo che sia disponibile 2 GB per l'applicazione e l'altro 2 GB sia disponibile solo per il sistema. La funzionalità di ottimizzazione 4 gigabyte (ottimizzazione 4GT o 4GT RAM) abilitata con il comando BCDEdit /set increaseuserva aumenta lo spazio degli indirizzi virtuale disponibile per l'applicazione fino a 3 GB e riduce la quantità disponibile per il sistema tra 1 e 2 GB.

Per le applicazioni con utilizzo elevato di memoria, ad esempio i sistemi di gestione dei database (DBMS), l'uso di uno spazio indirizzi virtuale più ampio può offrire notevoli vantaggi di prestazioni e scalabilità. Tuttavia, la cache dei file, il pool di pagine e il pool non a pagina sono più piccoli, che possono influire negativamente sulle applicazioni con rete elevata o I/O. È quindi consigliabile testare l'applicazione sotto carico ed esaminare i contatori delle prestazioni per determinare se l'applicazione può trarre vantaggio dallo spazio indirizzi più ampio.

Per abilitare 4GT, usare il comando BCDEdit /set per impostare l'opzione di immissione di avvio di increaseuserva su un valore compreso tra 2048 (2 GB) e 3072 (3 GB).

Windows Server 2003 e versioni precedenti: Per abilitare 4GT, aggiungere l'opzione /3GB al file di Boot.ini. L'opzione /3GB è supportata nei sistemi seguenti:

  • Windows Server 2003
  • Windows XP Professional

L'opzione /3 GB rende disponibile uno spazio indirizzi virtuale completo di 3 GB per le applicazioni e riduce la quantità disponibile per il sistema a 1 GB. In Windows Server 2003 la quantità di spazio indirizzi disponibile per le applicazioni può essere modificata impostando l'opzione /USERVA in Boot.ini su un valore compreso tra 2048 e 3072, che aumenta la quantità di spazio indirizzi disponibile per il sistema. Ciò può aiutare a mantenere le prestazioni complessive del sistema quando l'applicazione richiede più di 2 GB, ma meno di 3 GB di spazio indirizzi.

Per abilitare un'applicazione per usare lo spazio indirizzi più grande, impostare il flag di IMAGE_FILE_LARGE_ADDRESS_AWARE nell'intestazione dell'immagine. Il linker incluso in Microsoft Visual C++ supporta l'opzione /LARGEADDRESSAWARE per impostare questo flag. L'impostazione di questo flag e l'esecuzione dell'applicazione in un sistema che non dispone del supporto 4GT non devono influire sull'applicazione.

Nelle edizioni a 64 bit di Windows, le applicazioni a 32 bit contrassegnate con il flag di IMAGE_FILE_LARGE_ADDRESS_AWARE hanno 4 GB di spazio indirizzi disponibile.

Edizioni itanium di Windows Server 2003: Prima di SP1, i processi a 32 bit hanno solo 2 GB di spazio indirizzi disponibile.

Usare le linee guida seguenti per supportare 4GT nelle applicazioni:

  • Gli indirizzi vicino al limite di 2 GB vengono in genere usati da varie DLL di sistema. Pertanto, un processo a 32 bit non può allocare più di 2 GB di memoria contigua, anche se è disponibile l'intero spazio indirizzi a 4 GB.
  • Per recuperare la quantità totale di spazio virtuale utente, usare la funzione GlobalMemoryStatusEx . Per recuperare l'indirizzo utente più alto possibile, usare la funzione GetSystemInfo . Rilevare sempre il valore reale in fase di esecuzione ed evitare di usare definizioni costanti hard-cablate, ad esempio: #define HIGHEST_USER_ADDRESS 0xC0000000.
  • Evitare confronti firmati con puntatori, perché potrebbero causare l'arresto anomalo delle applicazioni in un sistema abilitato per 4GT. Una condizione come quella seguente è false per un puntatore superiore a 2 GB: if (pointer > 40000000).
  • Il codice che usa il bit più alto di un puntatore per uno scopo definito dall'applicazione avrà esito negativo quando 4GT è abilitato. Ad esempio, una parola a 32 bit potrebbe essere considerata un indirizzo in modalità utente se è sotto 0x80000000 e un codice di errore se precedente. Questo non è vero con 4GT.

VirtualAlloc in genere restituisce indirizzi bassi prima degli indirizzi elevati. Pertanto, il processo potrebbe non usare indirizzi molto elevati, a meno che non alloca una quantità elevata di memoria o abbia uno spazio indirizzi virtuale frammentato. Per forzare l'allocazione da indirizzi superiori prima degli indirizzi inferiori a scopo di test, specificare MEM_TOP_DOWN quando si chiama VirtualAlloc o si imposta il valore del Registro di sistema seguente su 0x100000:

HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Controllo\Gestione\ sessioni Gestione della\ memoria AllocationPreference

Limiti di memoria per le versioni di Windows

Estensione indirizzo fisico

Informazioni di riferimento tecnico 4GT