Su piattaforme a 64 bit, LuaJIT consente solo fino a 1-2 GB di dati (senza contare gli oggetti allocati con malloc
). Da dove viene questa limitazione, e perché è ancora meno rispetto alle piattaforme a 32 bit?Perché la memoria di LuaJIT è limitata a 1-2 GB su piattaforme a 64 bit?
risposta
LuaJIT è progettato per utilizzare puntatori a 32 bit. Sulle piattaforme x64
il limite deriva dall'uso di mmap e dal flag MAP_32BIT
.
MAP_32BIT (a partire da Linux 2.4.20, 2.6):
Mettere la mappatura nei primi 2 gigabyte di spazio di indirizzi del processo. Questo flag è supportato solo su x86-64, per programmi a 64 bit. È stato aggiunto per consentire l'allocazione degli stack di thread da qualche parte nei primi 2 GB di memoria, in modo da migliorare le prestazioni di commutazione di contesto su alcuni dei primi processori a 64 bit.
Essenzialmente utilizzando questo limite di flag per i primi 31 bit, non i primi 32 bit come suggerisce il nome. Dai un'occhiata a here per una bella panoramica del limite di 1 GB usando MAP_32BIT
nel kernel di Linux.
Anche se si potrebbe avere più di 1 GB, l'autore LuaJIT spiega perché questo sarebbe un male per le prestazioni:
- Un GC completa richiede 50% in più di tempo di quanto gli stanziamenti stessi.
- Se il GC è abilitato, raddoppia il tempo di allocazione.
- Per simulare un'applicazione reale, i collegamenti tra gli oggetti sono randomizzati nella terza esecuzione. Questo raddoppia il tempo di GC!
E questo era solo per 1 GB! Ora immagina di usare 8 GB: un ciclo GC completo manterrà la CPU occupata per ben 24 secondi! Ok, quindi la modalità normale è usare il GC incrementale. Ma questo significa solo che il sovraccarico è ~ 30% più alto, è misto tra le allocazioni e sfrutta la cache della CPU ogni volta. Fondamentalmente la tua applicazione sarà dominata dal sovraccarico del GC e comincerai a chiedermi perché è lento ....
tl; versione dr: Non provarlo a casa. E il GC ha bisogno di una riscrittura (posticipata a LuaJIT 2.1).
Per riassumere, il limite di 1 GB è una limitazione del kernel Linux e del garbage collector LuaJIT. Questo si applica solo agli oggetti all'interno dello stato di LuaJIT e può essere superato utilizzando malloc
, che verrà allocata al di fuori dello spazio degli indirizzi inferiore a 32 bit. Inoltre, è possibile utilizzare il build su x64
in modalità a 32 bit e accedere a tutti i 4 GB.
Guarda anche questi link per ulteriori informazioni:
- 1. Perché limitare la memoria di 2 GB durante l'esecuzione in Windows a 64 bit?
- 2. Perché valgrind è limitato a 32 Gb su architetture a 64 bit?
- 3. Perché la funzione SetupDiCallClassInstaller è limitata ai programmi a 64 bit?
- 4. Accesso a file da 2,3,4 GB in processo a 32 bit su Windows a 64 bit (o 32 bit)
- 5. Assegnazione di oltre 4 GB di memoria in un sistema a 64 bit
- 6. SQL Server 2012 a 32 bit o 64 bit su computer a 64 bit?
- 7. App Java a 64 bit: è richiesto un sistema operativo a 64 bit, JRE a 64 bit e applicazione a 64 bit?
- 8. allineamenti nelle strutture su piattaforme a 32 bit
- 9. Su quali piattaforme è limitata la memoria locale del thread e quanto è disponibile?
- 10. Applicazione a 32 o 64 bit su sistema operativo a 64 bit?
- 11. Perché MSBuild a 64 bit carica estensioni a 32 bit?
- 12. Quanta memoria può accedere a un processo a 32 bit su un sistema operativo a 64 bit?
- 13. Un processo a 32 bit può accedere a più memoria su un sistema operativo Windows a 64 bit?
- 14. La macchina virtuale a 32 o 64 bit è più veloce sulla macchina a 64 bit (VMware)
- 15. SDK Android a 32 o 64 bit su sistema operativo Windows a 64 bit?
- 16. Python è ctypes.c_long a 64 bit su sistemi a 64 bit?
- 17. Sto sviluppando un'applicazione a 64 bit. È possibile eseguire l'applicazione a 64 bit su un sistema operativo a 32 bit?
- 18. Compilare binario a 32 bit su sistema a 64 bit
- 19. Applicazione DirectX su finestre a 64 bit
- 20. strtok su macchine a 64 bit
- 21. Esecuzione di codice assembly a 32 bit su un processore Linux a 64 bit e 64 bit: Spiegazione dell'anomalia
- 22. Puntatori a 32 bit con ISA x86-64: perché no?
- 23. Perché __sync_add_and_fetch funziona per una variabile a 64 bit su un sistema a 32 bit?
- 24. puntatore C++ su macchina a 64 bit
- 25. Esegui libreria a 32 bit su iPhone 5s 64 bit
- 26. Perché mmap un file da 4 GB su armv7l a 32 bit è riuscito?
- 27. Boost.Test su Windows a 64 bit
- 28. esegue un binario a 32 bit su una macchina a 64 bit
- 29. Perché è più veloce a 64 bit rispetto a 32 bit?
- 30. Interoperabilità a 32 e 64 bit su Windows a 64 bit
Può citare un riferimento per il limite di 1 GB?Da tutto quello che ho visto, il limite è 2GB e le volte in cui altri hanno detto che è 1GB per 64-bit o sono stati ignorati o i thread si sono fermati lì – Taegost
@Taegost È 1GB su Linux. Chiarirò – MaxB