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?
64-bit
operating-systems
32-bit
computer-architecture
cpu-architecture
Mehper C. Palavuzlar
źródło
źródło
Odpowiedzi:
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
int
typu C. Jest to określone przez konkretną implementację kompilatora, a większość popularnych kompilatorów wybiera 32int
-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.
źródło
Zasadniczo możesz zrobić wszystko na większą skalę:
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 .
źródło
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
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.
źródło
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:
źródło
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.
źródło
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
Jeśli wyświetla EM64T, twój procesor obsługuje 64-bitową przestrzeń adresową zgodnie ze standardem x86-64. Możesz także poszukać
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ć
źródło
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.
źródło
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
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.
źródło
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ć).
źródło
Oprócz wspomnianych już zalet, oto kilka innych aspektów związanych z bezpieczeństwem:
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.źródło
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
źródło
Cytat z Microsoft.com:
źródło
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ą.
źródło
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.
źródło
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
źródło
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.
źródło
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:
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.
źródło