2010-04-29 8 views
31

Sono un membro di un team che sviluppa un'applicazione Delphi. I requisiti di memoria sono enormi. 500 MB è normale, ma in alcuni casi ha esaurito l'eccezione di memoria. La memoria allocata in questi casi è in genere compresa tra 1000 e 1700 MB.Perché limitare la memoria di 2 GB durante l'esecuzione in Windows a 64 bit?

Ovviamente vogliamo un compilatore a 64 bit, ma ciò non accadrà ora (e se dovesse succedere, dobbiamo anche convertire in unicode, ma questa è un'altra storia ...).

La mia domanda è perché c'è un limite di memoria di 2 GB per processo quando si esegue in un ambiente a 64 bit. Il puntatore è a 32 bit, quindi penso che 4 GB sarebbero il limite giusto. Io uso Delphi 2007.

EDIT: Quindi, se ho impostato il flag IMAGE_FILE_LARGE_ADDRESS_AWARE a Delfi utilizzando:

{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} 

ed eseguendo il file EXE risultante su un Server 2003 x64 di Windows quindi l'applicazione può indirizzare 4 GB?

  • Devo impostare/interruttore 3GB in boot.ini?
  • Abbiamo provato questo, ma su un server Windows Server 2003 a 32 bit e sembra limitare le risorse di Windows. C'erano più eccezioni per "Memoria insufficiente" con GDIError nel registro. Ma forse questo scompare quando si esegue in un sistema operativo a 64 bit?
+0

L'interruttore da 3 GB in avvio.ini è solo per Windows a 32 bit ed è necessario che LARGEADDRESSAWARE funzioni. Attenzione, riduce lo spazio disponibile su Windows stesso su sistemi a 32 bit. Vedi esempio qui, http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx, o leggi gli eccellenti Windwos Internals di Russinovoch e Solomon. –

risposta

32

Se si compila l'applicazione Delphi utilizzando il flag/LARGEADDRESSAWARE, sarà in grado di affrontare la completa 4 GB su un sistema operativo a 64 bit. Altrimenti, quando è in esecuzione in un WOW32, il sistema operativo presuppone che l'app si aspetti lo stesso ambiente che avrebbe su un sistema operativo a 32 bit, il che significa che 4 GB di spazio indirizzo, 2 GB è dedicato al sistema operativo e 2 GB è assegnato a l'applicazione.

+4

Questo è valido solo su 32 bit. Non c'è alcuna differenza binaria tra un puntatore da 3 GB e un puntatore da 4 GB, quindi qualsiasi app in grado di gestire 3 GB può fare 4 GB./LARGEADDRESSAWARE è adatto per l'intero 4 GB su sistemi a 64 bit senza alcuna modifica di avvio. L'unica volta che devi fare/3GB è se vuoi usare più spazio di indirizzamento in un sistema a 32 bit. L'articolo che hai linkato è di circa dieci anni non aggiornato e si rivolge solo a sistemi a 32 bit. PAE è un sistema completamente diverso. – Puppy

+0

@Dead: Sì, ovviamente sui sistemi a 64 bit (http://support.microsoft.com/kb/294418) l'articolo originale è solo 5 anni non aggiornato, 10. La risposta tuttavia rimane errata/incompleto rispetto alla discussione sulle implicazioni sui sistemi operativi a 32 bit. – Deltics

+1

@Deltics - LARGEADDRESSAWARE non si applica solo a 3 GB Ciò è assolutamente errato. http://msdn.microsoft.com/en-us/library/wz223b1z%28VS.80%29.aspx. È un'indicazione che l'applicazione può gestire ** QUALSIASI ** indirizzo superiore a 2 GB. È assolutamente corretto che se si desidera l'intero spazio di indirizzi da 4 GB su un sistema operativo a 64 bit con un'applicazione a 32 bit e se è in grado di gestirlo, è possibile utilizzare lo switch LARGEADDRESSAWARE. Non sono sicuro del motivo per cui ritieni che ciò non sia corretto. – Thomas

6

http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx

User-mode spazio di indirizzi virtuali per ogni processo a 32 bit: 2 GB

+4

Windows non è in grado di sapere se Delphi utilizza l'aritmetica firmata o non firmata sugli indirizzi di memoria, quindi deve supporre che il bit superiore sia inutilizzabile a meno che non si dichiari esplicitamente il contrario. –

+0

@ Marco: Questo è, uh, non vero per niente. Come detto sopra, l'impostazione di un flag di avvio consentirà a Delphi di indirizzare più di 2 GB da –

+1

@BlueRaja, "impostando un flag di avvio" = "esplicitamente dichiarato in modo diverso". –

14

La sintassi di Delphi per impostare il flag LARGEADDRESSAWARE nel file eseguibile PE è:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} 

Metti che nel file .dpr.

2

Finché si sceglie di ricevere puntatori a 32 bit con il set di bit alti (includendo il flag LARGE_ADDRESS_AWARE PE), non vi è alcun limite di 2 GB.

Osservazione diretta

var 
    p: Pointer; 
    n: Int64; 
begin 
    p := Pointer($D0000000); //Above the 2GB line; and the 3GB line! 

    p := VirtualAlloc(p, 1024, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE); 
    if p = nil then 
     RaiseLastWin32Error; 

    n := Cardinal(p); 
    ShowMessage(IntToHex(n, 16)); 
end; 

enter image description here

Conclusione

Non v'è alcun limite di 2 GB, a 64 bit di Windows, fino a quando si giuro è possibile gestire i puntatori di cui sopra $ 7FFFFFFF.

Nota: Qualsiasi codice è rilasciato nel pubblico dominio. Nessuna attribuzione richiesta.

Problemi correlati