Quali sono le differenze tra i sistemi a 32 e 64 bit?
Se li hai usati entrambi, che tipo di forti differenze hai riscontrato?
In alcuni casi sarebbe un problema utilizzare programmi a 32 bit su sistemi a 64 bit?
Quali sono le differenze tra i sistemi a 32 e 64 bit?
Se li hai usati entrambi, che tipo di forti differenze hai riscontrato?
In alcuni casi sarebbe un problema utilizzare programmi a 32 bit su sistemi a 64 bit?
Risposte:
Nota: queste risposte si applicano alle CPU standard basate su x86 (Intel e AMD) e Windows (normalmente configurate per gli utenti finali). Altri chip a 32 o 64 bit, altri sistemi operativi e altre configurazioni del sistema operativo possono avere diversi compromessi.
Da un punto di vista tecnico, un sistema operativo a 64 bit offre:
Consente ai singoli processi di indirizzare più di 4 GB di RAM ciascuno (in pratica, la maggior parte ma non tutti i sistemi operativi a 32 bit limitano anche la RAM totale del sistema utilizzabile a meno di 4 GB, non solo il massimo per applicazione).
Tutti i puntatori richiedono 8 byte anziché 4 byte. L'effetto sull'utilizzo della RAM è minimo (perché è probabile che non si abbia un'applicazione riempita con gigabyte di puntatori), ma nel peggiore dei casi teorici, ciò può rendere la cache della CPU in grado di contenere 1/2 del numero di puntatori (rendendo è effettivamente 1/2 della dimensione). Per la maggior parte delle applicazioni, questo non è un grosso problema.
Esistono molti più registri CPU per scopi generici in modalità 64 bit. I registri sono la memoria più veloce dell'intero sistema. Esistono solo 8 in modalità 32 bit e 16 registri di uso generale in modalità 64 bit. Nelle applicazioni di informatica scientifica che ho scritto, ho visto un aumento delle prestazioni fino al 30% ricompilando in modalità a 64 bit (la mia applicazione potrebbe davvero utilizzare i registri extra).
La maggior parte dei sistemi operativi a 32 bit consente alle singole applicazioni di utilizzare solo 2 GB di RAM, anche se ne sono installati 4. Questo perché gli altri 2 GB di spazio degli indirizzi sono riservati per la condivisione di dati tra applicazioni, con il sistema operativo e per la comunicazione con i driver. Windows e Linux ti permetteranno di adattare questo compromesso a 3 GB per le applicazioni e 1 GB condivisi, ma ciò può causare problemi per alcune applicazioni che non prevedono il cambiamento. Suppongo anche che potrebbe paralizzare una scheda grafica con 1 GB di RAM (ma non ne sono sicuro). Un sistema operativo a 64 bit può avvicinare le singole applicazioni a 32 bit ai 4 GB completi con cui giocare.
Dal punto di vista di un utente:
La velocità dell'applicazione è in genere maggiore per un'applicazione a 64 bit in un sistema operativo a 64 bit rispetto alla versione a 32 bit dell'applicazione su un sistema operativo a 32 bit, ma la maggior parte degli utenti non vedrà questo accelerazione. La maggior parte delle applicazioni per utenti normali non sfrutta realmente i registri extra o i vantaggi sono bilanciati da puntatori più grandi che riempiono la cache.
Se disponi di applicazioni di memoria (come editor di foto, elaborazione video, elaborazione scientifica, ecc.), Se hai (o puoi acquistare) più di 3 GB di RAM e puoi ottenere una versione a 64 bit dell'applicazione, la scelta è semplice: utilizzare il sistema operativo a 64 bit.
Alcuni componenti hardware non dispongono di driver a 64 bit. Controlla la scheda madre, tutte le schede plug-in e tutti i dispositivi USB prima di effettuare il passaggio. Si noti che agli inizi di Windows Vista c'erano molti problemi con i driver. In questi giorni le cose sono generalmente migliori.
Se esegui così tante applicazioni alla volta che stai esaurendo la RAM (di solito puoi dirlo perché il tuo computer inizia a diventare molto lento e senti lo scricchiolio del disco rigido), allora vorrai un sistema operativo a 64 bit (e RAM sufficiente).
È possibile eseguire applicazioni a 32 bit (ma non driver) in Windows a 64 bit senza problemi. Il peggior rallentamento che ho misurato per un'applicazione a 32 bit in Windows a 64 bit è di circa il 5% (il che significa che se ci sono voluti 60 secondi per fare qualcosa in Windows a 32 bit, ci sarebbero voluti al massimo 60 * 1,05 = 65 secondi con la stessa applicazione a 32 bit in Windows a 64 bit).
Cosa non implica 32-bit vs. 64-bit :
Sui sistemi x86, 32 bit contro 64 bit si riferiscono direttamente alla dimensione dei puntatori. È tutto.
Non si riferisce alla dimensione del int
tipo C. Questo è deciso dalla particolare implementazione del compilatore e la maggior parte dei compilatori popolari sceglie 32 bit int
su sistemi a 64 bit.
Non si riferisce direttamente alla dimensione dei normali registri senza puntatore. Tuttavia, l'utilizzo di registri aritmetici a 64 bit richiede che l'applicazione e il sistema operativo siano eseguiti anche in modalità puntatore a 64 bit.
Non si riferisce direttamente alla dimensione del bus dell'indirizzo fisico. Ad esempio, un sistema con linee di cache a 64 bit e un massimo di 512GiB di memoria necessita solo di 33 bit nel suo bus degli indirizzi (ad es log2(512*1024**3) - log2(64) = 33
.).
Non si riferisce alla dimensione del bus di dati fisici: è più correlato ai costi di produzione (numero di pin nel socket della CPU) e alle dimensioni della linea della cache.
Fondamentalmente puoi fare tutto su una scala più grande:
I 2 grandi tipi di architetture a 64 bit sono architetture x64 e IA64. Ma x64 è di gran lunga il più popolare.
x64 può eseguire comandi x86 e comandi x64. Anche IA64 esegue i comandi x86, ma non le estensioni SSE. C'è hardware dedicato su Itanium per l'esecuzione delle istruzioni x86; è un emulatore, ma in hardware.
Come accennato da @Phil, puoi avere uno sguardo più approfondito su come funziona qui .
Il maggiore impatto che le persone noteranno al momento è che un PC a 32 bit può indirizzare solo un massimo di 4 GB di memoria. Quando togli la memoria allocata per altri usi dal sistema operativo, il tuo PC probabilmente mostrerà solo circa 3,25 GB di memoria utilizzabile. Passa a 64 bit e questo limite scompare.
Se stai facendo uno sviluppo serio, questo potrebbe essere molto importante. Prova a eseguire diverse macchine virtuali e presto esaurisci la memoria. È più probabile che i server necessitino di memoria aggiuntiva e quindi scoprirai che l'utilizzo a 64 bit è molto maggiore sui server rispetto ai desktop. La legge di Moore assicura che avremo sempre più memoria sulle macchine e quindi a un certo punto i desktop passeranno anche a 64 bit come standard.
Per una descrizione molto più dettagliata delle differenze del processore, consulta questo eccellente articolo di ArsTechnica .
Niente è gratuito: sebbene le applicazioni a 64 bit possano accedere a più memoria rispetto alle applicazioni a 32 bit, il rovescio della medaglia è che hanno bisogno di più memoria. Tutti quei puntatori che prima necessitavano di 4 byte, ora ne hanno bisogno 8. Ad esempio, il requisito predefinito in Emacs è il 60% in più di memoria quando è costruito per un'architettura a 64 bit. Questo footprint aggiuntivo compromette le prestazioni a tutti i livelli della gerarchia di memoria: eseguibili più grandi impiegano più tempo a caricarsi dal disco, set di lavoro più grandi causano più paging e oggetti più grandi significano meno adattamenti nelle cache del processore. Se si pensa a una CPU con una cache L1 16K, un'applicazione a 32 bit può funzionare con 4096 puntatori prima di perdere e passare alla cache L2 ma un'applicazione a 64 bit deve raggiungere la cache L2 dopo soli 2048 puntatori.
Su x64 questo è mitigato dagli altri miglioramenti dell'architettura come altri registri, ma su PowerPC se la tua applicazione non può usare> 4G è probabile che funzioni più velocemente su "ppc" rispetto a "ppc64". Anche su Intel ci sono carichi di lavoro che funzionano più velocemente su x86 e pochi funzionano più del 5% più velocemente su x64 rispetto a x86.
Un sistema operativo a 64 bit può utilizzare più RAM. Questo è tutto, in pratica. 64 bit Vista / 7 utilizzano funzionalità di sicurezza più elaborate per il luogo in cui inseriscono componenti vitali nella RAM, ma ciò non è realmente "evidente" in quanto tale.
Da ChrisInEdmonton:
Un sistema operativo a 32 bit su un sistema ix86 con PAE può indirizzare fino a 64 GB di RAM. Un sistema operativo a 64 bit su x86-64 può accedere fino a 256 TB di spazio di indirizzi virtuali, sebbene ciò possa essere aumentato nei processori successivi, fino a 16 EB. Si noti che alcuni sistemi operativi limitano ulteriormente lo spazio degli indirizzi e la maggior parte delle schede madri avrà ulteriori restrizioni.
Non sono sicuro di poter rispondere a tutte le tue domande senza scrivere un intero saggio (c'è sempre Google ...), ma non è necessario progettare le tue app in modo diverso per 64 bit. Immagino che ciò a cui si fa riferimento sia che devi tenere conto di cose come le dimensioni del puntatore non hanno più le stesse dimensioni degli ints. E hai un sacco di potenziali problemi con ipotesi integrate su alcuni tipi di dati lunghi quattro byte che potrebbero non essere più veri.
Questo probabilmente farà scattare qualsiasi cosa nella tua applicazione - tutto, dal salvataggio / caricamento da file, iterazione attraverso i dati, allineamento dei dati, fino alle operazioni bit a bit sui dati. Se hai una base di codice esistente che stai tentando di eseguire il porting o lavori su entrambi, è probabile che avrai un sacco di piccoli problemi da superare.
Penso che questo sia un problema di implementazione, piuttosto che di progettazione. Cioè penso che il "design" di dire, un pacchetto di fotoritocco sarà lo stesso qualunque sia il formato delle parole. Scriviamo codice che viene compilato per entrambe le versioni a 32 e 64 bit, e il design certamente non differisce tra i due: è la stessa base di codice.
Il "grosso problema" fondamentale su 64 bit è che si ottiene l'accesso a uno spazio di indirizzi di memoria molto più grande di 32 bit. Ciò significa che puoi davvero scaricare più di 4 GB di memoria nel tuo computer e farlo davvero fare la differenza.
Sono sicuro che altre risposte andranno nei dettagli e benefici più di me.
In termini di rilevamento della differenza, quindi programmaticamente basta controllare la dimensione di un puntatore (es. Sizeof (void *)). La risposta di 4 indica i suoi 32 bit e 8 indica che si sta eseguendo in un ambiente a 64 bit.
Un processo a 32 bit ha uno spazio di indirizzi virtuali di 4 GB; questo potrebbe essere troppo piccolo per alcune app. Un'app a 64 bit ha uno spazio di indirizzi praticamente illimitato (ovviamente è limitato, ma molto probabilmente non raggiungerai questo limite).
Su OSX ci sono altri vantaggi. Vedi l' articolo seguente , perché l'esecuzione del kernel nello spazio degli indirizzi a 64 bit (indipendentemente dal fatto che l'app esegua 64 o 32) o l'esecuzione dell'app nello spazio degli indirizzi a 64 bit (mentre il kernel è ancora a 32 bit) porta a prestazioni molto migliori. Riassumendo: se uno è 64 bit (kernel o app, o entrambi ovviamente), il TLB ("translation lookaside buffer") non deve essere svuotato ogni volta che si passa dal kernel per usare spazio e ritorno (che accelererà accesso RAM).
Inoltre si ottengono miglioramenti delle prestazioni quando si lavora con variabili "long long int" (variabili a 64 bit come uint64_t). Una CPU a 32 bit può aggiungere / dividere / sottrarre / moltiplicare due valori a 64 bit, ma non in una singola operazione hardware. Invece deve dividere questa operazione in due (o più) operazioni a 32 bit. Quindi un'app che funziona molto con numeri a 64 bit avrà un guadagno di velocità di poter fare matematica a 64 bit direttamente nell'hardware.
Infine, ma non meno importante, l'architettura x86-64 offre più registri rispetto alle architetture x86 classiche. Lavorare con i registri è molto più veloce di lavorare con la RAM e più registri ha la CPU, meno spesso è necessario scambiare i valori dei registri nella RAM e tornare ai registri.
Per scoprire se la tua CPU può funzionare in modalità 64 Bit, puoi guardare varie variabili sysctl. Ad esempio, aprire un terminale e digitare
sysctl machdep.cpu.extfeatures
Se elenca EM64T, la CPU supporta lo spazio degli indirizzi a 64 bit secondo lo standard x86-64. Puoi anche cercare
sysctl hw.optional.x86_64
Se dice 1 (vero / abilitato), la tua CPU supporta la modalità bit x86-64, se dice 0 (falso / disabilitato), non lo fa. Se l'impostazione non viene trovata affatto, considerarla falsa.
Nota: puoi anche recuperare variabili sysctl da un'app C nativa, non è necessario utilizzare lo strumento da riga di comando. Vedere
man 3 sysctl
Si noti che lo spazio degli indirizzi può essere utilizzato per più di (reale) memoria. Si può anche mappare in memoria file di grandi dimensioni, che possono migliorare le prestazioni in schemi di accesso più dispari perché entra in gioco la cache di livello VM a livello di blocco più potente ed efficiente. È anche più sicuro allocare blocchi di memoria di grandi dimensioni su 64 bit poiché l'heapmanager è inferiore probabilmente incontrerà la frammentazione dello spazio degli indirizzi che non gli permetterà di allocare un grande blocco.
Alcune delle cose dette in questo thread (come il raddoppio dei # registri) si applicano solo a x86-> x86_64, non a 64 bit in generale. Proprio come il fatto che in x86_64 uno garantito abbia SSE2, 686 codici operativi e un modo economico per fare PIC. Queste funzionalità non sono strettamente a 64 bit, ma riguardano il taglio dell'eredità e la correzione delle limitazioni note di x86
Inoltre abbastanza spesso le persone indicano il raddoppio dei registri come causa dell'accelerazione, mentre è più probabile l'uso predefinito di SSE2 che faccia il trucco (accelerando memcpy e funzioni simili). Se abiliti lo stesso set per x86 la differenza è molto più piccola. (*) (***)
Inoltre, tieni presente che spesso comporta una sanzione iniziale poiché la struttura media dei dati aumenterà semplicemente perché la dimensione di un puntatore è maggiore. Questo ha anche effetti cache, ma è più evidente nel fatto che il memcpy medio () (o qualunque sia l'equivalente per la copia di memoria nella tua lingua) richiederà più tempo. Questo è solo nell'ampiezza di qualche percento tra i due, ma anche gli speedups sopra citati sono di tale entità.
Di solito l'overhead di allineamento è anche maggiore sulle architetture a 64 bit (i record precedentemente a 32 bit diventano spesso solo un mix di valori a 32 e 64 bit), facendo esplodere ancora di più le strutture.
Nel complesso, i miei semplici test indicano che si annulleranno all'incirca l'un l'altro, se i driver e le librerie di runtime si sono completamente adattati, senza alcuna differenza di velocità significativa per l'app media. Tuttavia, alcune app possono improvvisamente diventare più veloci (ad esempio quando dipendono da AES) o più lente (la struttura di dati cruciale viene costantemente spostata / scansionata / percorsa e contiene molti puntatori). I test erano su Windows, quindi l'ottimizzazione dei PIC non è stata valutata.
Si noti che la maggior parte dei linguaggi JIT-VM (Java, .NET) utilizza in media un numero significativamente maggiore di puntatori (internamente) rispetto ad esempio al C ++. Probabilmente il loro uso della memoria aumenta più che per il programma medio, ma non oso associarlo direttamente agli effetti di rallentamento (dal momento che sono bestie davvero complesse e funky e spesso difficili da prevedere senza misurare)
Per impostazione predefinita, Windows a 64 bit utilizza SSE2 per virgola mobile, il che sembra velocizzare operazioni semplici e rallentare operazioni complesse (sin, cos ecc.).
(*) un fatto poco noto è che il numero di registri SSE raddoppia anche in modalità 64 bit
(**) Il dottor Dobbs ha pubblicato un bell'articolo a riguardo qualche anno fa.
Oltre alle ovvie problematiche relative al memoryspace che la maggior parte delle persone menziona qui, penso che valga la pena di guardare l'idea di "broadword computing" di cui Knuth (tra gli altri) ha parlato recentemente. Ci sono molte efficienze da ottenere attraverso la manipolazione dei bit e le operazioni bit a bit su una parola a 64 bit vanno molto oltre rispetto a una parola a 32 bit. In breve, puoi fare più operazioni nei registri senza dover colpire la memoria e, dal punto di vista delle prestazioni, è una vittoria piuttosto grande.
Dai un'occhiata al volume 4, pre-fascicolo 1A per alcuni esempi dei trucchi interessanti di cui sto parlando.
Oltre alla capacità di indirizzare più memoria, x86_64 ha anche più registri che consentono al compilatore di generare codice più efficiente. Il miglioramento delle prestazioni sarà generalmente piuttosto piccolo però.
L'architettura x86_64 è retrocompatibile con x86. È possibile eseguire sistemi operativi non modificati a 32 bit. È anche possibile eseguire software non modificato a 32 bit da un sistema operativo a 64 bit. Ciò richiederà però tutte le solite librerie a 32 bit. Potrebbe essere necessario installarli separatamente.
Questo thread è già troppo lungo, ma ...
La maggior parte delle risposte si concentra sul fatto che hai uno spazio di indirizzi più grande, a 64 bit, in modo da poter indirizzare più memoria. Per circa il 99% di tutte le applicazioni, questo è totalmente irrilevante. Grande urlo.
La vera ragione per cui 64 bit è buono non è che i registri sono più grandi, ma ce ne sono il doppio! Ciò significa che il compilatore può tenere un maggior numero di valori nel registro invece di riversarli in memoria e caricarli di nuovo in alcune istruzioni in seguito. Se e quando un compilatore di ottimizzazione sta svolgendo i tuoi loop per te, può srotolarli all'incirca il doppio, il che può davvero aiutare le prestazioni.
Inoltre, sono state definite le convenzioni del chiamante / chiamata di subroutine per 64 bit per mantenere la maggior parte dei parametri passati nei registri anziché il chiamante che li spinge sullo stack e la chiamata che li fa saltare.
Quindi un'applicazione "tipica" C / C ++ otterrà un miglioramento delle prestazioni di circa il 10% o il 15% semplicemente ricompilando per 64 bit. (Supponendo che una parte dell'app sia stata calcolata. Naturalmente, questo non è garantito; tutti i computer attendono alla stessa velocità. Il tuo chilometraggio può variare.)
Oltre ai vantaggi già menzionati, qui ci sono alcuni altri aspetti relativi alla sicurezza:
Un altro vantaggio che viene in mente è che la quantità di memoria contigua virtuale allocata vmalloc()
nel kernel Linux può essere maggiore in modalità 64 bit.
Con una macchina a 32 bit hai solo 4.294.967.295 byte di memoria da indirizzare. Con una macchina a 64 bit hai 1.84467441 × 10 ^ 19 byte di memoria.
I processori a 64 bit calcolano attività particolari (come fattoriali di grandi dimensioni) due volte più velocemente che lavorare in ambienti a 32 bit (l'esempio dato deriva dal confronto tra il calcolatore di Windows a 32 e 64 bit; si nota per fattoriale di 100.000 ). Questo dà una sensazione generale di possibilità teoriche di applicazioni ottimizzate a 64 bit.
Mentre le architetture a 64 bit rendono indiscutibilmente il lavoro con grandi set di dati in applicazioni come video digitali, elaborazione scientifica e grandi database, c'è stato un considerevole dibattito sul fatto che loro o le loro modalità di compatibilità a 32 bit saranno più veloci di quelle a prezzi comparabili Sistemi a 32 bit per altre attività. Nell'architettura x86-64 (AMD64), la maggior parte dei sistemi operativi e delle applicazioni a 32 bit è in grado di funzionare senza problemi sull'hardware a 64 bit.
Le macchine virtuali Java a 64 bit di Sun sono più lente da avviare rispetto alle loro macchine virtuali a 32 bit poiché Sun ha implementato solo il compilatore JIT "server" (C2) per piattaforme a 64 bit. [9] Il compilatore JIT "client" (C1), che produce codice meno efficiente ma si compila molto più velocemente, non è disponibile su piattaforme a 64 bit.
Va notato che la velocità non è l'unico fattore da considerare in un confronto tra processori a 32 e 64 bit. Applicazioni come multi-tasking, stress test e clustering (per il calcolo ad alte prestazioni), HPC, possono essere più adatte a un'architettura a 64 bit, data la corretta distribuzione. I cluster a 64 bit sono stati ampiamente implementati in grandi organizzazioni come IBM, HP e Microsoft, per questo motivo.
Citazione da Microsoft.com:
Nella tabella seguente, le maggiori risorse massime di computer basate su versioni a 64 bit di Windows e il processore Intel a 64 bit vengono confrontate con i massimi esistenti di risorse a 32 bit.
Kristof e Poshi hanno dichiarato le principali differenze tecniche tra i sistemi operativi a 32 e 64 bit. L'esperienza dell'utente è generalmente molto diversa dalla teoria. Le versioni consumer a 64 bit di Windows fino ad oggi (XP e Vista) presentano ampi buchi nel supporto del driver. Ho avuto molte stampanti, scanner e altri dispositivi esterni completamente non funzionanti con le versioni a 64 bit che funzionano bene con le versioni a 32 bit. Questi sono dispositivi con driver a 64 bit e non funzionerebbero ancora. A questo punto, ti consiglio di stare lontano da qualsiasi cosa basata sul consumatore che sia a 64 bit da Microsoft fino a quando non senti parlare di come Windows 7 gestisce questo, dagli utenti finali reali, non solo dagli utenti esperti che attualmente hanno accesso ad esso. Dagli almeno 6 mesi e guarda cosa stanno vivendo le persone.
Alcuni programmi di gioco usano una rappresentazione bitboard . Gli scacchi, le pedine e l'altello, ad esempio, hanno una scheda 8x8, cioè 64 quadrati, quindi avere almeno 64 bit in una parola macchina aiuta significativamente le prestazioni.
Ricordo di aver letto di un programma di scacchi la cui build a 64 bit era quasi due volte più veloce della versione a 32 bit.
Il termine 32-bit e 64-bit si riferisce al modo in cui un processore del computer (chiamato anche CPU), gestisce le informazioni. Le versioni a 64 bit di Windows gestiscono grandi quantità di memoria ad accesso casuale (RAM) in modo più efficace rispetto ai sistemi a 32 bit.
la velocità potrebbe essere diversa secondo me
Un altro punto a riguardo di Microsoft Windows è che per molti anni esiste l'API Win32 che è progettata per sistemi operativi a 32 bit e non è ottimizzata per la compilazione a 64 bit. Quando scrivo alcune DLL per le mie applicazioni, generalmente compilo in Win32 che non è la versione a 64 bit delle cose. Prima di Vista, non ci sono state molte versioni a 64 bit di successo di Windows, credo che dove lavoro la mia nuova macchina abbia 4 GB di RAM, ma sto ancora usando Windows XP Pro a 32 bit in quanto è un noto O / stabile S rispetto a XP64 o Vista.
Penso che potresti voler guardare indietro anche quando c'è stato il passaggio da 16 bit a 32 bit per ulteriori dettagli sul perché il passaggio potrebbe essere un grosso problema per alcune persone. Le applicazioni mission-critical che un'azienda può eseguire su un desktop, ad esempio piccoli pacchetti di contabilità, potrebbero non funzionare su un sistema operativo a 64 bit e quindi è necessario mantenere una macchina legacy, virtuale o reale.
La modifica della dimensione di un indirizzo può avere conseguenze e ripercussioni importanti.
Ai fini più pratici probabilmente non noterai alcuna differenza.
È necessario disporre di una CPU a 64 bit (la maggior parte delle CPU negli ultimi anni) per installare un sistema operativo a 64 bit.
I vantaggi di un sistema operativo a 64 bit sono alcuni:
Nella maggior parte degli scenari, i programmi a 64 bit utilizzano un po 'più di memoria, ma in genere per un personal computer questo non viene notato.