2013-04-11 14 views
6

Bu sahip olduğum çok temel bir şüphe. Ben bir BT veya CS adamı değilim, bu yüzden lütfen basit bir dilde açıklamaya çalışın. Şimdi bu soruyu sormamın nedeni, 64 & 32 bit işletim sistemindeki 32 bit uygulamaları çalıştırabileceğimiz. AFAIK 64 bit veri türleri, 32 bit uygulamalardan iki kat daha fazla bellek alır. Ayrıca 64 bit uygulamalar sadece 64 bit işletim sistemlerinde çalışabilir. Öyleyse neden 64 bit uygulamalar oluşturma zahmetine giriyorsunuz? Belki de Firefox'un sadece 32 bitlik bir sürümü var mı? Bu soru SO standartlarına uymuyorsa özür dilerim, ancak kontrol edemiyorum aynı şeyi düşünmeyi bırakıyorum. Teşekkür ederiz.Neden C++ uygulaması için 64 bit hedefler oluşturmalıyız?

GÜNCELLEME: Bir şekilde bir karışıklık var gibi görünüyor. Neden 64 bitlik bir mimari makineye ihtiyacımız olduğunu sorgulamak istemedim. 32 bit makinelerin yalnızca 4GB RAM kullanabileceğini biliyorum & 64 bit makinelerin çok daha yüksek bir sınırı var. Neden 64 bit Uygulamalar oluşturmamız gerektiğini soruyordum!

+0

Hiç 32bit işleminde 150GiB ram tahsis etmeye çalıştı? – PlasmaHH

+4

64-bit uygulamalar daha fazla belleğe erişebilir. Bazı uygulamalar için bu önemli, diğerleri için çok değil. – john

+0

@PlasmaHH GiB nedir? giga bytes (GB) ile ilgili mi? –

cevap

10

Yukarıda verilen OBVIOUS nedenlerinden başka (çoğunlukla "2-3GB'dan daha fazla bellek kullanma"), 64-bit için derleme sebebi, x86-64'ün 16 yazmaç olduğu, x86-32'in 8 olduğu. Bu yazmaçlardan biri yığınlayıcıdır ve genellikle rBP "framepointer" için ayrılmıştır, gerçek faydalı kayıt sayısı sırasıyla 6 ve 14'tür. Ek kayıtlar, örneğin, çok sayıda parametrenin kayıtlara geçirilmesine ve bir işlev içinde kayıtlarda tutulan daha büyük sayıda geçici değişkene izin verir. Bu, kodun gerçek yürütme hızı üzerinde olumlu bir etkiye sahiptir, çünkü her zaman bellek bir kayıt yerine kullanıldığında, AT LEAST daha karmaşık bir yönerge ve çoğu zaman kullanılması gereken ek bir talimat sağlar. Bu da, yeterli kayıt olmadığında kodu daha büyük hale getirir.

Genellikle 64 bit x86 kodu, gerçek algoritmalarda hiçbir değişiklik yapılmadan% 5-15 daha hızlı çalışır ve tipik olarak sahiptir. Bazen algoritmalar çok daha fazla kazanç elde etmek için değiştirilebilir. Çünkü, örneğin telefon numarasını çevirmek ve karma değerini indekslemek yerine 64 bitlik tamsayı değerlerini kullanmak yerine "telefon numarası" ile dizine eklenmiş bir dizi olabilir. 32-bit olanların, yani "yarım operasyon sayısı" için 2x hızlanma anlamına geliyor.

Uygulamadan ihtiyacınız olan bir performanssa, karşılaştırma yapmalısınız (birden fazla platformda). Örneğin, daha büyük işaretçilerin önbelleğin daha hızlı dolduğu ve kodun daha yavaş çalıştığı anlamına gelen durumlar söz konusudur, çünkü "yalnızca çok sayıda bağlanmış liste girdisi önbelleğe sığar".

Kısaca: Çoğu durumda, 64 bit uygulamalar aynı şeyi yapan 32 bit uygulamalardan daha hızlıdır.

+0

32 bit uygulamalar, \ LARGEADDRESSAWARE anahtarıyla 64 bit pencerelerde 4 GB'ye erişebilir: http://support.microsoft.com/default.aspx?scid=889654 – EdChum

+1

Ve [AWE] ile 4 GB'den daha fazlasına erişebilirler (http: //msdn.microsoft.com/en-us/library/windows/desktop/aa366527(v=vs.85).aspx) – dyp

+1

Evet, her ikisi de doğru (iyi, "Sadece 4GB'ın altında", ama hepsi için niyet ve amaçlar 4GB). AWE size büyük bir bellek belleği vermez, ancak kod belleği kullanmak için çemberler arasından atlamak zorundadır, bu iyi bir çözüm değildir. –

6

En önemli usecase, gerçekten işleminiz için 2 gigabayttan fazla bellek tüketmek istediğiniz zamandır.

Şimdiki 16-bitlik uygulamalar artık görmeyeceğiniz gibi, 32-bit destek yavaş yavaş azalacak. Bu yavaş bir süreç olsa da. Şu anda Windows Server 2008'in varsayılan olarak 32 bit desteğine sahip olmayan bir sürümü var.

Ve nihayetinde bazen sadece 64 bit olmak zorundasınız - 64 bitlik bir tüketici işlemine yüklenen herhangi bir türden bir uzantı oluşturduğunuzda. 64 bitlik işlemler 32 bit kodu yükleyemediğinden, bunlar için 64 bitlik bir uzantı sağlamanız veya kodunuzu ayrı bir süreçte kullanabilmeniz için bir birlikte çalışma çözümü oluşturmanız gerekir - ikincisi her zaman mümkün değildir ve bazen çok verimsizdir.

+0

Sorduğum gibi basit cevabınız için teşekkür ederim. Bununla birlikte, 3. paragrafı anlayamadım. –

+0

@Cool_Coder: Tam olarak hangi şeyi anlamıyorsunuz? – sharptooth

+0

32 bit uygulamalar \ LARGEADDRESSAWARE anahtarı ile 64 bit pencerelerde 4GB'a erişebilir: http://support.microsoft.com/default.aspx?scid = 889654 – EdChum

4
  • Bir 32-bit sistem mimarisi ile doğrudan sadece 4 GB adres alanını adresleyebilir

fiziksel bellek. 64-bit bir Windows Server sürümü çalıştıran 64 bit sistem mimarisi, hem fiziksel hem de adreslenebilir belleğin 1.024 GB'sini destekleyebilir.

  • Daha paralel işlem 32-bit mimarisini kullanan bir sunucu 32 CPU (Windows OS) sınırlıdır

. Paralel işleme ve veriyolu mimarilerindeki iyileştirmeler, 64-bit ortamların 64 işlemciyi desteklemesini ve her ek işlemci ile neredeyse lineer ölçeklenebilirlik sağlamasını sağlar.

  • 64-bit mimarisi daha yüksek genel uygulama hızı katkıda bulunan daha fazla ve daha geniş genel amaçlı kayıtlar, içerir

hızlı veriyolu mimarisi. Daha fazla yazmaç olduğunda, kalıcı veriyi belleğe yazmak için daha az gereksinim vardır ve daha sonra birkaç yönergeyi daha sonra okumak zorundadır. İşlev çağrıları da 64 bitlik bir ortamda daha hızlıdır, çünkü bir defada dört argüman bir işleve yazmaçlardan geçirilebilir.

+0

Emmm ... 32-bit bir sunucu neden 32 CPU'larla sınırlı? – sharptooth

+1

Burada bulabilirim: http://technet.microsoft.com/en-us/library/dd630755%28v=office.12%29.aspx – duDE

+0

Bu, Windows'a özgü bazı sınırlamalardır. – sharptooth

1

Veri türlerinin boyutu otomatik olarak x64 ile iki katına çıkar, ancak işlemci boyutunun yaptığı gibi işlemcilerin boyutu kaydedilir.32 bit ile, 4294967295 byte belleğe (~ 4 Gb), bazı uygulamalar için (veritabanı yönetim sistemleri, ... gibi) yararlanamayan adresleri kullanabilirsiniz.

Firefox, uyumluluk sorunları nedeniyle yalnızca 32 bit'de kullanılabilir. X86 (32 bit) mimariler için kütüphaneler yazamaz ve x64 işlemcilerden çağrı yapamazsınız, çünkü işaretçileri uyumsuzdur (yukarıda açıklandığı gibi). Her ikisini de oluşturma: x64 ve x86 sürümleri, test masraflarını artırır. Uygulamanız nadiren 3,5 Gb'den fazla bellek kullanıyorsa, aslında x64 mimarisinden yararlanamaz.

Ayrıca 32 bit programlar yalnızca x64 mimarileri üzerinde çalışamaz. Windows'da bunun için Windows on Windows (WoW) veya x64/x86 arayüzleri için WoW64 adlı bir katman var. Çeşitli önbelleğe alma durumları sayesinde aynı zamanda bir x86 uygulamasının gerçek bir x64 uygulamasından daha hızlı bir şekilde WoW üzerinde çalıştığı da olabilir.

+0

Hey @Aschratt bu bilgi için teşekkürler, bunu bilmiyordum. Yani, Windows sadece 64 bit işletim sistemi üzerinde 32 bit uygulamalar çalıştıran bu uzmanlık alanı var mı? 64 bit Ubuntu varsayılan olarak 32 bit uygulamaları çalıştırmaz. Ben soruyorum çünkü bilmiyorum. –

+0

Linux'un (veya Ubuntu'nun) böyle bir soyutlama katmanına sahip olup olmadığını bilmiyorum. Temelde WoW64 bir x86 işlemciyi x86 işlemine "taklit eder". Bu çok zor değil çünkü çoğu opcodes aynı, tüm yapmanız gereken işaretçileri düzeltmektir. Bence Ubuntu için benzer bir şey var ama gerçekten bilmiyorum. – Carsten