Systemy 32-bitowe vs. 64-bitowe

224

Jakie są różnice między systemami 32-bitowymi i 64-bitowymi?

Jeśli użyłeś obu z nich, jakich ostrych różnic doświadczyłeś?

Czy w niektórych przypadkach używanie programów 32-bitowych na systemach 64-bitowych byłoby problemem?

Mehper C. Palavuzlar
źródło
Jest tu wiele nieporozumień, a gdzie indziej w Internecie, między adresowaniem fizycznym (dostępem do pamięci RAM), wpływa na to PEA, wpływa na to płyta główna, a adresowaniem logicznym (pamięć wirtualna na proces). W 32-bitowym systemie operacyjnym pamięć wirtualna jest ograniczona do 4 GB minus to, co rezerwuje jądro. Jest niezależny od pamięci RAM, możesz mieć 0,1 MB lub 8 GB pamięci RAM i miałbyś dokładnie 4 GB pamięci wirtualnej (ale niektóre zarezerwowane przez jądro). PEA może być użyte, aby mieć więcej pamięci RAM, ale nie jest to idealna odpowiedź, ponieważ jądro NIE MOŻE uzyskać dostępu do wszystkich.
ctrl-alt-delor

Odpowiedzi:

264

Uwaga: Odpowiedzi te dotyczą standardowych procesorów PC x86 (Intel i AMD) i Windows (zazwyczaj skonfigurowanych dla użytkowników końcowych). Inne 32-bitowe lub 64-bitowe układy, inne systemy operacyjne i inne konfiguracje systemu operacyjnego mogą mieć różne kompromisy.

Z technicznego punktu widzenia 64-bitowy system operacyjny zapewnia:

  • Pozwala poszczególnym procesom zająć więcej niż 4 GB pamięci RAM każdy (w praktyce większość, ale nie wszystkie 32-bitowe systemy operacyjne również ograniczają całkowitą użyteczną pamięć systemową RAM do mniej niż 4 GB, a nie tylko maksymalną na aplikację).

  • Wszystkie wskaźniki zajmują 8 bajtów zamiast 4 bajtów. Wpływ na użycie pamięci RAM jest minimalny (ponieważ prawdopodobnie nie będziesz mieć aplikacji wypełnionej gigabajtami wskaźników), ale w najgorszym teoretycznym przypadku może to spowodować, że pamięć podręczna procesora będzie w stanie pomieścić 1/2 tyle wskaźników (co będzie efektywnie 1/2 wielkości). W przypadku większości aplikacji nie jest to wielka sprawa.

  • Istnieje wiele innych rejestrów procesora ogólnego przeznaczenia w trybie 64-bitowym. Rejestry to najszybsza pamięć w całym systemie. Jest tylko 8 w trybie 32-bitowym i 16 rejestrów ogólnego przeznaczenia w trybie 64-bitowym. W naukowych aplikacjach komputerowych, które napisałem, zauważyłem nawet 30-procentowy wzrost wydajności dzięki ponownej kompilacji w trybie 64-bitowym (moja aplikacja może naprawdę korzystać z dodatkowych rejestrów).

  • Większość 32-bitowych systemów operacyjnych pozwala tylko pojedynczym aplikacjom na użycie 2 GB pamięci RAM, nawet jeśli masz zainstalowane 4 GB pamięci RAM. Wynika to z faktu, że pozostałe 2 GB przestrzeni adresowej jest zarezerwowane do udostępniania danych między aplikacjami, z systemem operacyjnym i do komunikacji ze sterownikami. Windows i Linux pozwolą ci dostosować ten kompromis do 3 GB dla aplikacji i 1 GB współdzielonego, ale może to powodować problemy dla niektórych aplikacji, które nie oczekują zmiany. Domyślam się, że może to uszkodzić kartę graficzną, która ma 1 GB pamięci RAM (ale nie jestem pewien). 64-bitowy system operacyjny może zapewnić 32-bitowym aplikacjom możliwość korzystania z pełnych 4 GB.

Z perspektywy użytkownika:

  • Szybkość aplikacji jest zwykle większa dla 64-bitowej aplikacji w 64-bitowym systemie operacyjnym w porównaniu z 32-bitową wersją aplikacji w 32-bitowym systemie operacyjnym, ale większość użytkowników nie zauważy tego przyspieszenia. Większość aplikacji dla zwykłych użytkowników tak naprawdę nie korzysta z dodatkowych rejestrów lub korzyści równoważą większe wskaźniki wypełniające pamięć podręczną.

  • Jeśli masz jakieś aplikacje do przechowywania pamięci (takie jak edytory zdjęć, przetwarzanie wideo, obliczenia naukowe itp.), Jeśli masz (lub możesz kupić) więcej niż 3 GB pamięci RAM i możesz uzyskać 64-bitową wersję aplikacji, wybór jest prosty: użyj 64-bitowego systemu operacyjnego.

  • Niektóre urządzenia nie mają sterowników 64-bitowych. Przed dokonaniem przełączenia sprawdź płytę główną, wszystkie karty wtykowe i wszystkie urządzenia USB. Należy pamiętać, że na początku systemu Windows Vista było wiele problemów ze sterownikami. Te dni są ogólnie lepsze.

  • Jeśli uruchamiasz tak wiele aplikacji jednocześnie, że kończy Ci się pamięć RAM (zwykle możesz to powiedzieć, ponieważ komputer zaczyna się naprawdę spowalniać i słyszysz chrzęst dysku twardego), wtedy będziesz potrzebować 64-bitowego systemu operacyjnego (i wystarczająca ilość pamięci RAM).

  • Bez problemu można uruchamiać aplikacje 32-bitowe (ale nie sterowniki) w 64-bitowym systemie Windows. Najgorsze spowolnienie, jakie mierzyłem dla 32-bitowej aplikacji w 64-bitowym systemie Windows, to około 5% (co oznacza, że ​​jeśli zajęło 60 sekund, aby zrobić coś w 32-bitowym systemie Windows, zajęło to co najwyżej 60 * 1,05 = 65 sekund z ta sama 32-bitowa aplikacja w 64-bitowym systemie Windows).

Co 32-bit vs. 64-bit nie oznacza:

W systemach x86 32-bit vs. 64-bit bezpośrednio odnosi się do wielkości wskaźników. To wszystko.

  • Nie odnosi się do wielkości inttypu C. Jest to określone przez konkretną implementację kompilatora, a większość popularnych kompilatorów wybiera 32 int-bitowe systemy 64-bitowe.

  • Nie odnosi się bezpośrednio do wielkości normalnych rejestrów niepunktowych. Jednak użycie 64-bitowych rejestrów arytmetycznych wymaga, aby aplikacja i system operacyjny działały również w 64-bitowym trybie wskaźnika.

  • Nie odnosi się bezpośrednio do wielkości fizycznej magistrali adresowej. Na przykład system z 64-bitowymi liniami pamięci podręcznej i maksymalnie 512 GB pamięci potrzebuje tylko 33 bitów na swojej szynie adresowej (tj log2(512*1024**3) - log2(64) = 33.).

  • Nie odnosi się do wielkości fizycznej magistrali danych: jest to bardziej związane z kosztami produkcji (liczba pinów w gnieździe procesora) i rozmiarami linii pamięci podręcznej.

Pan Fooz
źródło
8
Bardzo dobra odpowiedź. Zwłaszcza, że ​​zauważyłeś, że tak naprawdę nie ma limitu 4 GB pamięci RAM, ale limit wykorzystania pamięci procesowej. Tylko dla twojej informacji, uważam, że powinieneś rzucić
Przełom
8
Są to aplikacje, które nie działają w 64-bitowym systemie Windows: aplikacje 16-bitowe / te, które używają 32-bitowych lub niepodpisanych sterowników trybu jądra. To bardzo dużo dla uzależnionego od oprogramowania takiego jak ja ...
fluxtendu
1
@flextendu, biorąc pod uwagę wymagania wydajnościowe tych starych programów, prawie na pewno można je uruchomić na maszynie wirtualnej. W przypadku VMware Player, Virtual PC i Virtual Box nie ma powodu, aby nie wypróbowywać jednego z nich, jeśli masz sprecyzowaną 32-bitową licencję Windows. Jeśli nie chcesz z tym zadzierać, prawdopodobnie będą one działać również w „trybie Windows XP”.
Mark Booth
6
BTW, aplikacje 32-bitowe nie będą zużywały więcej niż 2 GiB pamięci RAM, chyba że w ich manifeście zostanie włączona określona flaga. Źródło: blogs.technet.com/b/markrussinovich/archive/2008/11/17/…
Hello71,
Tak, jestem pewien, że Hello71 natrafił na coś bardzo ważnego, co nie zostało tutaj omówione: większość aplikacji 32-bitowych nigdy nie skorzysta bezpośrednio z dodatkowej pamięci RAM. Myślę, że warto o tym wspomnieć, nie?
Django Reinhardt
107

Zasadniczo możesz zrobić wszystko na większą skalę:

  1. Pamięć RAM na system operacyjny: limit 4 GB pamięci RAM na x86 dla systemu operacyjnego (przez większość czasu)
  2. Pamięć RAM na proces: Limit pamięci RAM 4 GB na x86 dla procesów (zawsze). Jeśli uważasz, że to nie jest ważne, spróbuj uruchomić ogromną aplikację intensywnie korzystającą z bazy danych MSSQL. Będzie zużywał> 4 GB, jeśli jest dostępny i działa znacznie lepiej.
  3. Adresy: adresy mają 64 bity zamiast 32 bitów, co pozwala mieć „większe” programy, które zużywają więcej pamięci.
  4. Uchwyty dostępne dla programów: Możesz utworzyć więcej uchwytów plików, procesów ... Na przykład w Windows x64 możesz utworzyć> 2000 wątków na proces, ale na x86 bliżej kilkuset.
  5. Szersze dostępne programy: Z x64 można uruchamiać zarówno programy x86, jak i x64. (Przykład systemu Windows: wow64, Windows32 na emulacji Windows64)
  6. Opcje emulacji: Z x64 można uruchamiać maszyny wirtualne zarówno x86, jak i x64.
  7. Szybciej: niektóre obliczenia są szybsze na 64-bitowym procesorze
  8. Dzielenie wielu zasobów systemowych: Dużo pamięci RAM jest bardzo ważne, gdy chcesz uruchomić co najmniej jedną maszynę wirtualną, która dzieli zasoby systemowe.
  9. Dostępne ekskluzywne programy: kilka nowych programów obsługuje tylko x64. Przykładowa wymiana 2007.
  10. Przyszłe przestarzałe x86 ?: Z czasem będzie używanych coraz więcej 64-bitów i coraz więcej x86 nie będzie używanych. Tak więc dostawcy będą obsługiwać tylko 64-bitowe coraz więcej.

Dwa duże typy architektury 64-bitowej to architektury x64 i IA64. Ale x64 jest zdecydowanie najbardziej popularny.

x64 może uruchamiać polecenia x86, a także polecenia x64. IA64 uruchamia także polecenia x86, ale nie robi rozszerzeń SSE. W Itanium znajduje się sprzęt do uruchamiania instrukcji x86; to emulator, ale sprzętowo.

Jak wspomniano w @Phil, możesz przyjrzeć się temu, jak to działa .

Brian R. Bondy
źródło
1
Um. IA64 uruchamia polecenia x86. Jednak nie robi rozszerzeń SSE. W Itanium znajduje się sprzęt do uruchamiania instrukcji x86; to emulator, ale sprzętowo.
tzot
2
Kilka lat temu Raymond Chen napisał o „limicie” wątku 2000 i jest to mniej więcej miejska legenda: blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx
bk1e
Głosuj za Arstechnicą za ich wyjaśnienie.
Avihu Turzion,
2
Limit pamięci RAM 4 GB nie jest do końca prawdą (jest to raczej sztuczny limit nakładany na systemy Windows użytkowników domowych), sprawdź PAE . W przypadku najnowocześniejszego sprzętu jądro Linux PAE (które jest domyślnie używane w wersji 32-bitowej) może w pełni obsłużyć ponad 4 GB. To samo dotyczy FreeBSD i NetBSD.
Izzy
Systemy 32-bitowe nie mogą używać więcej niż 4 GB (1. punkt) z powodu tych „adresów” (3. punkt). Ponieważ najwyższa liczba 32-bitowa to 4.294.967.296 (= 4 GB). Więc twoje 1. i 3. punkt to SAME. Możesz usunąć 3. punkt. :)
Jet
46

Największy wpływ, jaki ludzie zauważą w tej chwili, to fakt, że 32-bitowy komputer może obsłużyć maksymalnie 4 GB pamięci. Gdy zdejmiesz pamięć przydzieloną do innych celów przez system operacyjny, Twój komputer prawdopodobnie pokaże tylko około 3,25 GB użytecznej pamięci. Przejdź do wersji 64-bitowej, a limit ten zniknie.

Jeśli robisz poważny rozwój, może to być bardzo ważne. Spróbuj uruchomić kilka maszyn wirtualnych, a wkrótce zabraknie ci pamięci. Serwery częściej potrzebują dodatkowej pamięci, więc przekonasz się, że 64-bitowe użycie jest znacznie większe na serwerach niż na komputerach stacjonarnych. Prawo Moore'a gwarantuje, że będziemy mieć coraz więcej pamięci na maszynach, więc w pewnym momencie komputery stacjonarne również przełączą się na 64-bitowe jako standard.

Bardziej szczegółowy opis różnic między procesorami znajduje się w tym doskonałym artykule z ArsTechnica .


źródło
7
Platforma 32-bitowa i ograniczenie 4 GB jest nieco błędne i jest (było) głównie ograniczeniem wyboru / projektu architektury systemu operacyjnego. Naprawdę, 4 GB z 32 bitów jest naprawdę na granicy przestrzeni procesowej VA. Adres fizyczny obsługuje 36 bitów na 32-bitowych procesorach Intela
Tall Jeff,
1
Dajesz rację, co z pewnością jest prawdą. Ale wpływ w prawdziwym świecie użytkowników komputerów PC jest taki, że maszyna nie będzie korzystać z pełnego 4 GB, za które zapłacili. Mój tata miał ten problem i nadal jest zdezorientowany, że 4 GB, za które zapłacił, nie może być w pełni wykorzystane.
2
Doceń swój punkt, ale po prostu próbując przekonać, że poprawki nie ma w procesorze lub przechodząc do wersji 64-bitowej, jest to tylko kwestia nieco ulepszonej konstrukcji systemu operacyjnego. Jest to rozwiązane na przykład w wersjach systemu Windows dla przedsiębiorstw, nawet w wersjach 32-bitowych. Pozwala na 64 GB pamięci RAM.
Wysoki Jeff,
Technicznie limit nie znika. Przenosi się dalej tam, gdzie nie jest praktyczne / niemożliwe jest zainstalowanie takiej ilości pamięci RAM na komputerze w dowolnym momencie w ciągu następnej dekady.
Zobacz moją uwagę na temat PAE powyżej: limit 4 GB nie jest prawdziwy dla całego systemu - ale dotyczy tylko pojedynczych procesów (żaden proces nie może uzyskać dostępu do 4 GB i więcej - ale cały system, tj. Wszystkie procesy razem, może mieć włączony PAE ). Więc jeśli nie ma zainstalowanych aplikacji, które korzystają z dostępu do 4 GB i więcej (takich jak edytory / konwertery wideo z dużymi plikami wideo) i zainstalowanych 8 GB +, nie powinno to mieć większego znaczenia, czy używa się 32-bitowego czy 64-bitowego.
Izzy
31

Nic nie jest za darmo: chociaż aplikacje 64-bitowe mają dostęp do większej ilości pamięci niż aplikacje 32-bitowe, wadą jest to, że potrzebują więcej pamięci. Wszystkie wskaźniki, które kiedyś wymagały 4 bajtów, teraz potrzebują 8. Na przykład, domyślnym wymaganiem w Emacsie jest 60% więcej pamięci, gdy jest zbudowany dla architektury 64-bitowej. Ten dodatkowy ślad ma negatywny wpływ na wydajność na każdym poziomie hierarchii pamięci: większe pliki wykonywalne ładują się z dysku dłużej, większe zestawy robocze powodują więcej stronicowania, a większe obiekty oznaczają mniejsze dopasowanie do pamięci podręcznej procesora. Jeśli myślisz o procesorze z 16 KB pamięci podręcznej L1, 32-bitowa aplikacja może pracować z 4096 wskaźnikami, zanim nie trafi i trafi do pamięci podręcznej L2, ale aplikacja 64-bitowa musi sięgnąć po pamięć podręczną L2 po zaledwie 2048 wskaźnikach.

Na x64 jest to złagodzone przez inne ulepszenia architektury, takie jak więcej rejestrów, ale w PowerPC, jeśli twoja aplikacja nie może korzystać z> 4G, prawdopodobnie będzie działać szybciej na „ppc” niż „ppc64”. Nawet w przypadku Intela istnieją obciążenia działające szybciej na x86, a kilka działa o ponad 5% szybciej na x64 niż x86.

James
źródło
2
Ta odpowiedź sugeruje, że PowerPC64 nie jest tak dobry jak x86-64. Prawda jest taka, że ​​powerpc64 nie poprawił powerpc, ponieważ powerpc nie został uszkodzony.
ctrl-alt-delor
3
Linux ma teraz x32 ABI, ze wszystkimi zaletami prędkości x86-64 (więcej rejestrów, przeprojektowany ABI), ale z 32-bitowymi wskaźnikami. +1 za wskazanie, że zalety trybu 64-bitowego nie wynikają z faktycznego zwiększenia szerokości, ale z szansy na zrzucenie dużej ilości bagażu, który powstrzymywał architekturę. Reguły 64-bitowe mają wartość dla niektórych aplikacji, ale 64-bitowa przestrzeń wskaźnika jest rzadziej potrzebna.
Peter Cordes,
19

64-bitowy system operacyjny może zużywać więcej pamięci RAM. W praktyce o to chodzi. 64-bitowy system Vista / 7 wykorzystuje bardziej zaawansowane funkcje bezpieczeństwa w miejscach, w których umieszczają ważne komponenty w pamięci RAM, ale nie jest to tak naprawdę „zauważalne” jako takie.

Od ChrisInEdmonton:

32-bitowy system operacyjny w systemie ix86 z PAE może adresować do 64 GB pamięci RAM. 64-bitowy system operacyjny na x86-64 może uzyskiwać dostęp do 256 TB wirtualnej przestrzeni adresowej, chociaż może to zostać zwiększone w kolejnych procesorach, do 16 EB. Należy pamiętać, że niektóre systemy operacyjne jeszcze bardziej ograniczają przestrzeń adresową, a większość płyt głównych będzie miała dodatkowe ograniczenia.

Phoshi
źródło
4
W przypadku systemu operacyjnego TYLKO wersja 32-bitowa w porównaniu z wersją 64-bitową odnosi się do wielkości wskaźników (co poprawnie omawia pierwszy akapit). -1: Niektóre systemy operacyjne wybierają blokowanie domyślnego rozmiaru liczby całkowitej do rozmiaru wskaźnika, ale ani Windows, ani Linux nie robią tego. Dokładność matematyczna liczb całkowitych pozostaje niezmieniona. Żaden powszechnie używany system operacyjny nie zmienia precyzji zmiennoprzecinkowej (jak twierdzi drugi akapit). „float” lub „single” to 32 bity, „double” to 64 bity, niezależnie od tego, czy system operacyjny używa wskaźników 32- czy 64-bitowych.
Pan Fooz
Ach, wyraźnie się
myliłem
Nie ma problemu. -1 -> +1
Mr Fooz
Warto edytować swoją odpowiedź, aby określić, ile pamięci RAM można uzyskać. 32-bitowy system operacyjny w systemie ix86 z PAE może adresować do 64 GB pamięci RAM. 64-bitowy system operacyjny na platformie x86-64 może uzyskać dostęp do 256 TB wirtualnej przestrzeni adresowej, chociaż może to zostać zwiększone w kolejnych procesorach, do 16 EB. Należy pamiętać, że niektóre systemy operacyjne jeszcze bardziej ograniczają przestrzeń adresową, a większość płyt głównych będzie miała dodatkowe ograniczenia.
ChrisInEdmonton
Chciałem to uprościć, ponieważ liczby są w większości na tyle wysokie, że w tej chwili są nieistotne, ale teraz nie mogę ich zranić.
Phoshi
14

Nie jestem pewien, czy mogę odpowiedzieć na wszystkie pytania bez napisania całego eseju (zawsze jest Google ...), ale nie musisz projektować aplikacji inaczej dla wersji 64-bitowej. Myślę, że chodzi o to, że należy pamiętać o tym, że rozmiary wskaźników nie są już takie same jak ints. I masz mnóstwo potencjalnych problemów z wbudowanymi założeniami, że niektóre typy danych mają długość czterech bajtów, co może już nie być prawdą.

Może to wywołać wiele problemów w Twojej aplikacji - od zapisywania / wczytywania z pliku, iteracji przez dane, wyrównania danych, aż po bitowe operacje na danych. Jeśli masz istniejącą bazę kodu, którą próbujesz przenieść lub pracujesz nad obiema, prawdopodobnie będziesz mieć wiele drobnych problemów.

Myślę, że jest to kwestia implementacji, a nie projektu. Tzn. Myślę, że „projekt” powiedzmy, pakiet do edycji zdjęć będzie taki sam, bez względu na rozmiar. Piszemy kod, który kompiluje się zarówno do wersji 32-bitowej, jak i 64-bitowej, a konstrukcja z pewnością nie różni się między nimi - jest to ta sama baza kodów.

Podstawową „wielką rzeczą” dla 64-bitowych jest to, że zyskujesz dostęp do dużo większej przestrzeni adresowej pamięci niż 32-bitowe. Oznacza to, że naprawdę możesz włożyć do komputera więcej niż 4 GB pamięci i sprawić, by miało to znaczenie.

Jestem pewien, że inne odpowiedzi będą dotyczyły szczegółów i korzyści bardziej niż ja.

Jeśli chodzi o wykrywanie różnicy, to programowo po prostu sprawdzasz rozmiar wskaźnika (np. Sizeof (void *)). Odpowiedź 4 oznacza 32 bity, a 8 oznacza, że ​​pracujesz w środowisku 64-bitowym.

Greg Whitfield
źródło
4
Jeśli piszesz programy, które od niechcenia zakładają, że niektóre typy wskaźników mają taki sam rozmiar jak niektóre typy integralne, zrób to. Tak było od dawna.
David Thornley,
@David: Masz absolutną rację. Niestety, istnieje mnóstwo kodów, które właśnie to robią.
10

Proces 32-bitowy ma wirtualną przestrzeń adresów 4 GB; może to być za mało dla niektórych aplikacji. 64-bitowa aplikacja ma praktycznie nieograniczoną przestrzeń adresową (oczywiście jest ograniczona, ale najprawdopodobniej nie osiągniesz tego limitu).

W OSX są inne zalety. Zobacz następujący artykuł , dlaczego uruchomienie jądra w 64-bitowej przestrzeni adresowej (niezależnie od tego, czy aplikacja działa w 64 lub 32-bitowej wersji) lub uruchomienie aplikacji w 64-bitowej przestrzeni adresowej (gdy jądro jest wciąż 32-bitowe) prowadzi do znacznie lepszej wydajności. Podsumowując: Jeśli jeden z nich jest 64-bitowy (jądro lub aplikacja, lub oba oczywiście), TLB („bufor podglądu tłumaczenia”) nie musi być opróżniany za każdym razem, gdy przełączasz się z jądra, aby użyć spacji i wstecz (co przyspieszy dostęp do pamięci RAM).

Również zyskujesz na wydajności podczas pracy ze zmiennymi „long long int” (zmienne 64-bitowe, takie jak uint64_t). 32-bitowy procesor może dodawać / dzielić / odejmować / mnożyć dwie wartości 64-bitowe, ale nie w ramach jednej operacji sprzętowej. Zamiast tego musi podzielić tę operację na dwie (lub więcej) operacje 32-bitowe. Tak więc aplikacja, która dużo działa z liczbami 64-bitowymi, zyska większą prędkość dzięki możliwości wykonywania 64-bitowej matematyki bezpośrednio sprzętowo.

Wreszcie architektura x86-64 oferuje więcej rejestrów niż klasyczne architektury x86. Praca z rejestrami jest znacznie szybsza niż praca z pamięcią RAM, a im więcej rejestrów ma procesor, tym rzadziej trzeba zamieniać wartości rejestrów na pamięć RAM i wracać do rejestrów.

Aby dowiedzieć się, czy Twój procesor może działać w trybie 64-bitowym, możesz spojrzeć na różne zmienne sysctl. Np. Otwórz terminal i wpisz

sysctl machdep.cpu.extfeatures

Jeśli wyświetla EM64T, twój procesor obsługuje 64-bitową przestrzeń adresową zgodnie ze standardem x86-64. Możesz także poszukać

sysctl hw.optional.x86_64

Jeśli mówi 1 (prawda / włączony), twój procesor obsługuje tryb bitów x86-64, jeśli mówi 0 (fałsz / wyłączony), to nie. Jeśli ustawienie w ogóle nie zostanie znalezione, należy uznać je za fałszywe.

Uwaga: możesz także pobrać zmienne sysctl z natywnej aplikacji C, bez potrzeby korzystania z narzędzia wiersza poleceń. Widzieć

man 3 sysctl
Mecki
źródło
błąd: „machdep.cpu.extfeatures” to nieznany klucz
Myślę, że nie nazywa się to EM64T, także, jeśli nie jesteś wystarczająco niefortunny, aby mieć dane wywiadowcze.
9

Pamiętaj, że przestrzeń adresowa może być używana dla więcej niż (rzeczywistej) pamięci. Można również mapować pamięć dużych plików, co może poprawić wydajność w bardziej dziwnych wzorcach dostępu, ponieważ uruchamia się bardziej wydajne i wydajne buforowanie na poziomie maszyny wirtualnej na poziomie bloków. Bezpieczniej jest również alokować duże bloki pamięci w 64-bitach, ponieważ menedżer heap jest mniejszy może napotkać fragmentację przestrzeni adresowej, która nie pozwoli mu na przydzielenie dużego bloku.

Niektóre rzeczy powiedziane w tym wątku (np. Podwojenie # rejestrów) dotyczą tylko x86-> x86_64, a nie ogólnie 64-bitowych. Podobnie jak fakt, że pod x86_64 jedna gwarantowana ma SSE2, 686 kodów i tani sposób na wykonanie PIC. Te funkcje nie dotyczą wyłącznie wersji 64-bitowej, ale ograniczają dziedzictwo i usuwają znane ograniczenia x86

Ponadto dość często ludzie wskazują na podwojenie rejestrów jako przyczynę przyspieszenia, podczas gdy bardziej prawdopodobne jest, że domyślne użycie SSE2 załatwia sprawę (przyspieszenie memcpy i podobne funkcje). Jeśli włączysz ten sam zestaw dla x86, różnica będzie znacznie mniejsza. (*) (***)

Należy również pamiętać, że często wiąże się to z początkową karą, ponieważ średnia struktura danych wzrośnie po prostu dlatego, że rozmiar wskaźnika jest większy. Ma to również wpływ na pamięć podręczną, ale jest bardziej zauważalne w tym, że średnia memcpy () (lub jakikolwiek inny odpowiednik kopii pamięci w twoim języku) potrwa dłużej. Jest to tylko wielkość kilku procent btw, ale wyżej wymienione przyspieszenia również są w tej wielkości.

Zwykle narzut wyrównania jest również większy w architekturach 64-bitowych (rekordy poprzednio 32-bitowe często stają się mieszanką wartości 32-bitowych i 64-bitowych), jeszcze bardziej wysadzając struktury.

Ogólnie rzecz biorąc, moje proste testy wskazują, że z grubsza się wzajemnie znoszą, jeśli sterowniki i biblioteki wykonawcze są w pełni przystosowane, nie dając znaczącej różnicy prędkości dla przeciętnej aplikacji. Jednak niektóre aplikacje mogą nagle stać się szybsze (np. W zależności od AES) lub wolniejsze (kluczowa struktura danych jest ciągle przenoszona / skanowana / kroczona i zawiera wiele wskaźników). Testy odbywały się jednak w systemie Windows, dlatego optymalizacja PIC nie była testowana.

Zauważ, że większość języków JIT-VM (Java, .NET) używa znacznie więcej wskaźników (wewnętrznie) niż np. C ++. Prawdopodobnie ich użycie pamięci wzrasta bardziej niż w przypadku przeciętnego programu, ale nie odważę się utożsamiać tego bezpośrednio z efektami spowalniającymi (ponieważ są to naprawdę złożone i funkowe bestie i często trudne do przewidzenia bez pomiaru)

Windows 64-bit domyślnie używa SSE2 do liczb zmiennoprzecinkowych, co wydaje się przyspieszać proste operacje i spowalnia złożone operacje (sin, cos itp.).

(*) mało znanym faktem jest to, że liczba rejestrów SSE podwaja się również w trybie 64-bitowym

(**) Dr Dobbs miał fajny artykuł na ten temat kilka lat temu.

Marco van de Voort
źródło
8

Poza oczywistymi problemami z pamięcią, o których wspomina tutaj większość ludzi, myślę, że warto przyjrzeć się pojęciu „broadword computing”, o którym ostatnio mówił Knuth (między innymi). Dzięki manipulowaniu bitami można uzyskać wiele korzyści, a operacje bitowe na słowie 64-bitowym idą znacznie dalej niż na słowie 32-bitowym. Krótko mówiąc, możesz wykonywać więcej operacji w rejestrach bez konieczności uderzania w pamięć, a z punktu widzenia wydajności to całkiem spora wygrana.

Spójrz na Tom 4, sprzed Fascicle 1A, na kilka przykładów fajnych sztuczek, o których mówię.


źródło
7

Oprócz możliwości adresowania większej ilości pamięci x86_64 ma także więcej rejestrów, co pozwala kompilatorowi na generowanie wydajniejszego kodu. Poprawa wydajności zwykle będzie jednak dość niewielka.

Architektura x86_64 jest wstecznie kompatybilna z x86. Możliwe jest uruchamianie niezmodyfikowanych 32-bitowych systemów operacyjnych. Możliwe jest również uruchamianie niezmodyfikowanego 32-bitowego oprogramowania z 64-bitowego systemu operacyjnego. Wymaga to jednak wszystkich zwykłych bibliotek 32-bitowych. Mogą wymagać osobnej instalacji.

Kristof Provost
źródło
Więcej rejestrów i przeprojektowany ABI (przekazywanie argumentów w rejestrze) to zwykle przyspieszenie od 10 do 15%, co jest całkiem przyzwoite. Jest teraz Linux ABI x32 z 32-bitowymi wskaźnikami, ale używający trybu długiego amd64 i konwencji wywoływania args-in-register. Masz więc wszystkie zalety szybkości amd64, ale bez narzutu wymaganego 64 bitów na każdy wskaźnik. Jest dobry do wszystkiego, co nie potrzebuje> 4 GB (wirtualnej) pamięci.
Peter Cordes
6

Ten wątek jest już za długi, ale ...

Większość odpowiedzi skupia się na tym, że masz większą 64-bitową przestrzeń adresową, dzięki czemu możesz adresować więcej pamięci. Dla około 99% wszystkich aplikacji jest to całkowicie nieistotne. Duży whoop.

Prawdziwy powód, 64-bit jest dobry to nie , że rejestry są większe, ale istnieją dwa razy więcej z nich! Oznacza to, że kompilator może przechowywać więcej twoich wartości w rejestrze zamiast rozlewać je do pamięci i ładować je z powrotem w kilku instrukcjach później. Jeśli i kiedy kompilator optymalizacyjny rozwija dla ciebie pętle, może rozwinąć je około dwa razy więcej, co naprawdę może poprawić wydajność.

Ponadto zdefiniowano konwencje podprogramu wywołującego / wywoływanego dla 64-bitów, aby zachować większość przekazywanych parametrów w rejestrach zamiast wywoływania przez wywołującego ich na stos, a wywoływanego odsuwania.

Tak więc „typowa” aplikacja C / C ++ poprawi wydajność o około 10% lub 15% po ponownej kompilacji dla wersji 64-bitowej. (Zakładając, że pewna część aplikacji była związana z obliczeniami. Oczywiście nie jest to oczywiste; wszystkie komputery czekają z tą samą prędkością. Twój przebieg może się różnić).

Zgiń w Sente
źródło
Chociaż zestaw instrukcji jest lepszy dla x64 niż x86, zazwyczaj nie jest to ważne. Kod 64-bitowy może być wolniejszy niż 32-bitowy, ponieważ instrukcje mogą być większe, więc mniej mieści się w pamięci podręcznej. (Rozwinięcie pętli, BTW, jest obecnie bardzo wątpliwą techniką, ponieważ zwiększy liczbę braków pamięci podręcznej). Tam, gdzie pracuję, potrzebujemy 64 bitów do zwiększenia adresowania pamięci.
David Thornley
David, zestawy instrukcji x64 i x86 są prawie identyczne, z wyjątkiem rozmiaru argumentu i niektórych prefiksów rejestru. W przypadku IA64, czyli Itanium, czyli Itanic, kody 64-bitowe zwykle byłyby trzy razy większe niż kody x86 i obciążałyby pamięć podręczną instrukcji dokładnie tak, jak mówisz. To był duży czynnik, dlaczego ta architektura zawiodła. Ale przy x86 aka AMD64 aka EM64T ten wzrost kodu wynosi zwykle tylko 10-20%.
Chociaż x64 sprawia, że ​​więcej rejestrów jest adresowalnych , nie jestem pewien, o ile faktycznie zwiększa to liczbę dostępnych rejestrów fizycznych - wszystkie najnowsze procesory x86 mają wiele (> 100) rejestrów „w tle” i używają „zmiany nazw rejestrów” + spekulacyjnego wykonania aby umożliwić niezależnym ścieżkom kodu wykonywanie równoległe do pewnego stopnia. W efekcie, jeśli działa n niezależnych ścieżek kodu, n jest dostępnych tyle razy, ile rejestrów jest dostępnych (aż do wyczerpania się wszystkich rejestrów cienia).
@j_random_hacker. Masz całkowitą rację, że te sztuczki dzieją się pod architekturą. Ale bez względu na to, ile rejestrów cienia jest dostępnych, jeśli program musi pracować z więcej niż 8 elementami danych i tylko 8 rejestrów jest dostępnych w zestawie instrukcji, kompilator musi wygenerować instrukcje przechowywania / przeładowywania. Tak więc, X64 naprawdę sprawia, że ​​dwa razy więcej rejestrów jest „dostępnych”
Z mojego doświadczenia wynika, że ​​jest to o wiele mniej i jest kompensowane przez fakt, że średni blok memblock do przeniesienia jest większy.
Marco van de Voort
6

Oprócz wspomnianych już zalet, oto kilka innych aspektów związanych z bezpieczeństwem:

  • Procesory x86_64 mają w swoich tabelach stron bit „non-execute”. Może to zapobiec lukom w zabezpieczeniach spowodowanym przepełnieniem bufora. 32-bitowe procesory x86 obsługują tę funkcję tylko w trybie PAE.
  • Większa przestrzeń adresowa pozwala na lepszą randomizację układu przestrzeni adresowej (ASLR), co utrudnia wykorzystanie przekroczeń bufora.
  • x86_64 cpus posiada kod niezależny od pozycji, tj. dostęp do danych w stosunku do rejestru wskaźnika instrukcji (RIP).

Kolejną zaletą, która przychodzi na myśl, jest to, że ilość wirtualnej ciągłej pamięci przydzielonej vmalloc()w jądrze Linuksa może być większa w trybie 64-bitowym.

knweiss
źródło
5

W 32-bitowej maszynie masz tylko 4 294 967 295 bajtów pamięci do adresowania. Na komputerze 64-bitowym masz 1,84467441 × 10 ^ 19 bajtów pamięci.

Wikipedia tak mówi

64-bitowe procesory obliczają określone zadania (takie jak silniki dużych liczb) dwa razy szybciej niż pracujące w środowiskach 32-bitowych (podany przykład pochodzi z porównania 32-bitowego i 64-bitowego kalkulatora Windows; zauważalny dla silni powiedzmy 100 000 ). Daje to ogólne poczucie teoretycznych możliwości 64-bitowych aplikacji zoptymalizowanych.

Podczas gdy 64-bitowe architektury bezsprzecznie ułatwiają pracę z dużymi zestawami danych w aplikacjach, takich jak cyfrowe wideo, obliczenia naukowe i duże bazy danych, toczy się poważna debata, czy one lub ich 32-bitowe tryby zgodności będą szybsze niż w porównywalnej cenie Systemy 32-bitowe do innych zadań. W architekturze x86-64 (AMD64) większość 32-bitowych systemów operacyjnych i aplikacji jest w stanie działać płynnie na 64-bitowym sprzęcie.

64-bitowe maszyny wirtualne Sun firmy Sun uruchamiają się wolniej niż ich 32-bitowe maszyny wirtualne, ponieważ Sun zaimplementował tylko „serwerowy” kompilator JIT (C2) dla platform 64-bitowych. [9] Kompilator „klienta” JIT (C1), który wytwarza mniej wydajny kod, ale kompiluje się znacznie szybciej, jest niedostępny na platformach 64-bitowych.

Należy zauważyć, że szybkość nie jest jedynym czynnikiem branym pod uwagę w porównaniu procesorów 32-bitowych i 64-bitowych. Aplikacje takie jak wielozadaniowość, testy warunków skrajnych i klastrowanie (do obliczeń o wysokiej wydajności), HPC, mogą być lepiej dostosowane do architektury 64-bitowej przy prawidłowym wdrożeniu. Z tego powodu klastry 64-bitowe zostały szeroko wdrożone w dużych organizacjach, takich jak IBM, HP i Microsoft.

Mark Cidade
źródło
2
Długość magistrali adresu fizycznego jest niezależna od tego, czy jest to procesor 32 czy 64-bitowy. Niektóre 32-bitowe procesory mają szyny adresowe większe niż 32 bity, a żaden 64-bitowy procesor nie ma 64-bitowej szyny adresowej.
1
Zgoda. Teoretycznie przestrzeń adresowa wynosi 2 ^ 64. W praktyce producenci procesorów używają mniejszych wartości ... jak 2 ^ 40 lub 2 ^ 48.
Stu Thompson,
5

Cytat z Microsoft.com:

W poniższej tabeli zwiększone maksymalne zasoby komputerów opartych na 64-bitowych wersjach systemu Windows i 64-bitowym procesorze Intel są porównywane z istniejącymi maksymalnymi zasobami 32-bitowymi.

Tabela MS

Mehper C. Palavuzlar
źródło
2
Ciekawe, ale warte odnotowania, że ​​niektóre 32-bitowe wersje systemu Windows pozwalają na więcej pamięci FIZYCZNEJ. Zobacz na przykład en.wikipedia.org/wiki/…
ChrisInEdmonton
@ChrisInEdmonton system obsługuje więcej niż 4 GB pamięci lub pamięci, ale adres dla każdego procesu jest nadal ograniczony do 2 GB (3 GB przy dużym adresie). Więc nawet jeśli twój system ma dużo pamięci, nadal nie pomaga to programom, które zajmują dużo pamięci, a wydajność wciąż pozostaje w tyle za wersją 64-bitową. Ma także znacznie mniejszy zakres adresów dla ASLR i pliku odwzorowanego w pamięci
phuclv
4

Kristof i Poshi stwierdzili główne różnice techniczne między 32 a 64-bitowym systemem operacyjnym. Doświadczenie użytkownika jest zwykle bardzo różne od teorii. 64-bitowe wersje konsumenckie systemu Windows (XP i Vista) mają duże luki w obsłudze sterowników. Mam wiele drukarek, skanerów i innych urządzeń zewnętrznych, które nie działają z wersjami 64-bitowymi, które działają dobrze z wersjami 32-bitowymi. Są to urządzenia, które miały 64-bitowe sterowniki i nadal nie działały. W tym momencie polecam trzymać się z dala od wszelkich produktów konsumenckich, które są 64-bitowe od Microsoft, dopóki nie usłyszysz o tym, jak Windows 7 sobie z tym radzi, od prawdziwych użytkowników końcowych, a nie tylko od uber-maniaków, którzy obecnie mają do niego dostęp. Daj mu co najmniej 6 miesięcy i zobacz, co ludzie przeżywają.

Kevin K.
źródło
Może być mniej sterowników, ale nie jest tak źle, ponieważ to brzmi. Używam 64 bitów od 2007 roku i nigdy nie miałem żadnych trudności. Powiedziawszy to, nie mam podłączonych żadnych niejasnych ani starożytnych urządzeń.
RomanSt
1
Moja najnowsza wersja z 64-bitową wersją systemu Vista była zupełnie nową drukarką wielofunkcyjną HP w zeszłym miesiącu na 2-miesięcznym systemie Dell. Zarówno Dell, jak i HP poddali się, a mój klient zapłacił mi za zainstalowanie XP Pro i pozbycie się Visty. Nic nie jest niejasne w obu jednostkach.
Kevin K,
1
Zazwyczaj, jeśli kupujesz komputer z 64-bitowym systemem operacyjnym, wszystko będzie działać. Byłbym ostrożny przed próbą aktualizacji starszego komputera, gdybym miał starszą drukarkę lub gdybym chciał uaktualnić na własną rękę.
David Thornley,
Sprzęt, który chce nadawać markę Works with Windows lub Certified do użytku z logo Windows, musi oferować sterowniki 64-bitowe. Może poszukaj tego następnym razem. Ale czasami dostawcy nie przejmują się sprzętem konsumenckim, ponieważ większość konsumentów prawdopodobnie nadal będzie korzystać z wersji 32-bitowej.
Joey,
2

Niektóre programy do gier używają reprezentacji bit-board . Na przykład szachy, warcaby i othello mają planszę 8x8, tj. 64 kwadraty, więc posiadanie co najmniej 64 bitów w słowie maszynowym znacznie poprawia wydajność.

Pamiętam, że czytałem o programie szachowym, którego 64-bitowa wersja była prawie dwa razy szybsza niż wersja 32-bitowa.

Hugh Allen
źródło
2

Termin 32-bitowy i 64-bitowy odnosi się do sposobu, w jaki procesor komputera (zwany również procesorem) obsługuje informacje. 64-bitowe wersje systemu Windows obsługują duże ilości pamięci o dostępie swobodnym (RAM) bardziej skutecznie niż systemy 32-bitowe.

moim zdaniem prędkość może być inna

LestiWulan
źródło
1

Kolejną kwestią w odniesieniu do systemu Microsoft Windows jest to, że od wielu lat istnieje interfejs API Win32, który jest przeznaczony dla 32-bitowych systemów operacyjnych i nie jest zoptymalizowany pod kątem kompilacji 64-bitowej. Kiedy piszę biblioteki DLL dla moich aplikacji, generalnie kompiluję w Win32, która nie jest 64-bitową wersją rzeczy. Przed Vistą nie było wielu udanych 64-bitowych wersji systemu Windows. Wydaje mi się, że tam, gdzie pracuję, mój nowy komputer ma 4 GB pamięci RAM, ale nadal używam 32-bitowego systemu Windows XP Pro, ponieważ jest to znany stabilny system operacyjny S w stosunku do XP64 lub Vista.

Myślę, że możesz również spojrzeć wstecz, kiedy nastąpiła zmiana z 16-bitowej na 32-bitową, aby uzyskać więcej informacji na temat tego, dlaczego zmiana może być dla wielu ludzi czymś wielkim. Aplikacje o kluczowym znaczeniu, które firma może uruchamiać na komputerze stacjonarnym, np. Małe pakiety księgowe, mogą nie działać w 64-bitowym systemie operacyjnym, a zatem istnieje potrzeba utrzymywania starszej maszyny, wirtualnej lub rzeczywistej.

Zmiana rozmiaru adresu może mieć poważne konsekwencje i konsekwencje.

JB King
źródło
1

Dla większości praktycznych celów prawdopodobnie nie zauważysz różnicy.

Aby zainstalować 64-bitowy system operacyjny, musisz mieć 64-bitowy procesor (większość procesorów w ciągu ostatnich kilku lat).

64-bitowy system operacyjny ma kilka zalet:

  • Umożliwi to uruchomienie więcej niż 4 GB pamięci RAM (maksymalna liczba, którą można adresować w 32-bitowym systemie operacyjnym, to 2 ^ 32 = 4 GB)
  • Jest to przydatne do pracy z dużymi zestawami danych (np. W programie Excel) i niektórymi intensywnymi obliczeniowo zadaniami (np. Photoshop i duże pliki)
  • Możesz uruchomić tylko program 64-bitowy na 64-bitowym systemie operacyjnym, ale możesz uruchomić program 32-bitowy na obu (pamiętaj, że wiele programów występuje jako oba, więc nie ma zbyt wielu 64-bitowych programów programy).

W większości scenariuszy programy 64-bitowe zużywają nieco więcej pamięci, ale w przypadku komputera osobistego zwykle nie jest to zauważane.

cyberx86
źródło