Apakah ada alasan bagus untuk menjalankan perangkat lunak 32-bit alih-alih 64-bit pada mesin 64-bit?

56

Apakah ada alasan bagus untuk memasok versi 32-bit bersama dengan versi 64-bit perangkat lunak yang ditargetkan pada mesin desktop modern, menjalankan sistem operasi 64-bit modern pada perangkat keras 64-bit?

Tampaknya perangkat lunak 64-bit akan lebih efisien, memungkinkan penggunaan memori yang lebih tinggi jika diperlukan, dll. Apple bahkan menggunakan prosesor 64-bit untuk ponsel mereka, meskipun mereka hanya memiliki 1-2 GB RAM, jauh di bawah 4 GB batas untuk CPU 32-bit.

Filip Haglund
sumber
16
Tidak setiap mesin modern menjalankan OS 64 bit
Bálint
4
Apakah Anda punya contoh?
Filip Haglund
8
Tanyakan pelanggan Anda.
Murphy
22
Pertanyaan retoris: apakah ada alasan untuk menyediakan versi 64 bit dari perangkat lunak apa pun karena sebagian besar sistem operasi 64bit modern memungkinkan untuk menjalankan aplikasi 32bit dan 64bit juga?
Doc Brown
2
Bukan duplikat @gnat. Pertanyaan itu adalah tentang pemasangan timestamp, dan id pengembang dalam kode kesalahan dikembalikan ketika sebuah program keluar.
Filip Haglund

Jawaban:

80

Manfaat perangkat lunak 32-bit di lingkungan 64-bit

  • Jejak memori yang lebih rendah, terutama dalam aplikasi pointer-berat, 64-bit vs 32-bit dapat dengan mudah menggandakan persyaratan memori.
  • File objek juga lebih kecil.
  • Kompatibilitas dengan lingkungan 32-bit.
  • Kebocoran memori dibatasi hingga 2 GB, 3 GB, atau 4 GB dan tidak akan membanjiri seluruh sistem.

Kerugian dari perangkat lunak 32-bit di lingkungan 64-bit

  • Batas memori 2 GB, 3 GB, atau 4 GB per proses. (Hanya per proses, jumlah proses 32-bit dapat menggunakan memori sistem penuh yang tersedia.)
  • Tidak menggunakan register tambahan dan ekstensi set instruksi tergantung pada x64. Ini sangat kompiler dan CPU spesifik.
  • Mungkin memerlukan versi 32-bit dari semua (kebanyakan distribusi Linux) atau pustaka yang tidak umum (sebagian besar versi Windows) dan lingkungan waktu berjalan. Jika versi 32-bit dari pustaka bersama dimuat secara eksklusif untuk aplikasi Anda, dan itu diperhitungkan dalam jejak kaki Anda. Tidak ada perbedaan sama sekali jika Anda menautkan secara statis.

Aspek lainnya

  • Driver biasanya tidak menjadi masalah. Hanya pustaka ruang-pengguna yang harus berbeda antara 32-bit dan 64-bit, bukan API modul kernel.
  • Waspadalah terhadap lebar default yang berbeda untuk tipe data integer, diperlukan pengujian tambahan.
  • Arsitektur CPU 64-bit bahkan mungkin tidak mendukung 32-bit sama sekali.
  • Teknik tertentu seperti ASLR dan lainnya tergantung pada ruang alamat yang jauh lebih besar daripada memori fisik tidak akan berfungsi dengan baik (atau sama sekali) dalam mode eksekusi 32-bit.

Kecuali jika membandingkan arsitektur CPU yang sangat spesifik, sistem operasi dan infrastruktur perpustakaan di sini, saya tidak akan dapat membahas lebih detail.

Ext3h
sumber
8
"Arsitektur CPU 64bit mungkin bahkan tidak mendukung 32bit sama sekali." Apakah ini lebih merupakan perhatian teoretis, atau apakah ini ada di dunia?
mucaho
10
@mucaho Sudah pasti ada arsitektur CPU hanya 64-bit, seperti Alpha dan IA64. Kedua hal itu hampir mati. Saya tidak tahu dari atas kepala saya apakah ada arsitektur 64-bit yang hanya diproduksi saat ini - AArch64, mungkin? Apakah ada yang tahu apakah 32-bit ARM adalah komponen wajib itu?
zwol
10
@ zwol Tidak, 32-bit tidak wajib untuk ARM, dan 64-bit juga tidak. Hanya ada 64-bit ARM CPU, sementara yang lain mendukung proses 32-bit dan 64-bit.
Ext3h
3
Ada manfaat tambahan untuk hanya memilih satu arsitektur dan berpegang teguh pada itu: pengembangan dan pengujian yang lebih sederhana.
jl6
7
@ Yosua Selalu ada? Apakah firaun tahu ini?
candied_orange
7

Perbedaan antara perangkat lunak 32 bit dan perangkat lunak 64 bit adalah ukuran pointer, dan mungkin ukuran register integer. Itu dia.

Itu berarti semua petunjuk dalam program Anda berukuran dua kali lipat. Dan (setidaknya pada arsitektur ILP32 / LP64) ukuran Anda longjuga dua kali lipat. Ini biasanya berhasil sekitar 30% peningkatan dalam ukuran kode objek. Ini berarti bahwa ...

  • kode objek Anda akan memakan waktu ~ 30% lebih lama untuk memuat dari disk ke RAM
  • kode objek Anda akan memakan ~ 30% lebih banyak ruang dalam memori
  • Anda telah secara efektif menurunkan bandwidth memori Anda (untuk kode objek) sebesar ~ 20%
  • Anda telah secara efektif menurunkan ukuran cache instruksi hingga ~ 20%

Ini memiliki efek negatif yang tidak dapat diabaikan pada kinerja.

Melakukan ini hanya masuk akal jika Anda dapat "membeli kembali" biaya kinerja itu entah bagaimana. Pada dasarnya, ada dua cara untuk melakukan ini: Anda melakukan banyak matematika integer 64 bit, atau Anda membutuhkan lebih dari 4 GiByte memetakan memori. Jika salah satu atau keduanya benar, masuk akal untuk menggunakan perangkat lunak 64 bit, sebaliknya tidak.

Catatan: ada beberapa arsitektur di mana tidak ada varian 32 atau 64 bit yang sesuai. Kalau begitu, pertanyaannya jelas tidak masuk akal. Yang paling terkenal adalah IA64, yang hanya 64 bit dan tidak memiliki varian 32 bit, dan x86 / AMD64 yang, meskipun berkaitan erat, arsitektur yang berbeda , x86 menjadi 32 bit saja, AMD64 menjadi 64 bit saja.

Sebenarnya, pernyataan terakhir itu tidak 100% benar lagi. Linux baru-baru ini menambahkan ABI x32, yang memungkinkan Anda untuk menjalankan kode AMD64 dengan pointer 32 bit, jadi meskipun itu bukan arsitektur CPU yang "tepat", itu adalah cara menggunakan arsitektur AMD64 sedemikian rupa seolah-olah itu asli Varian 32 bit. Hal ini dilakukan justru karena kinerja overhead yang saya sebutkan di atas menyebabkan nyata terukur, masalah kuantitatif bagi pengguna dunia nyata menjalankan kode dunia nyata dalam sistem dunia nyata.

Jörg W Mittag
sumber
8
Bagaimana dengan register dan instruksi tambahan di amd64 dibandingkan dengan x86? Berapa banyak yang meningkatkan kinerja?
Filip Haglund
2
Google untuk "tagged pointer" yang digunakan dalam Objective-C pada MacOS X dan iOS. Jumlah objek yang sangat besar tidak memiliki memori yang dialokasikan, tetapi seluruh objek dipalsukan dalam pointer pada sistem 64 bit. (Saya mendengar Java melakukan hal serupa). Dalam C ++, std :: string pada 64 bit sering berisi hingga 22 karakter dalam objek itu sendiri tanpa alokasi memori. Penghematan memori substansial dan peningkatan kecepatan.
gnasher729
3
Ukuran pointer dan bilangan bulat bukan? Bagaimana dengan ruang alamat yang lebih besar dan register tambahan di sebagian besar arsitektur 64 bit?
1
"Anda [mengurangi] cache instruksi hingga ~ 20%" diperdebatkan karena set instruksi benar-benar berbeda (dan seringkali lebih efisien)
BlueRaja - Danny Pflughoeft
3
"Ini memiliki efek negatif yang tidak dapat diabaikan pada kinerja." Meskipun pernyataan ini benar dalam arti absolut, pernyataan ini mengabaikan fakta bahwa sebagian besar, hambatan kinerja aplikasi tidak dalam waktu buka, atau penggunaan memori / bandwidth, atau jumlah instruksi dalam cache.
Ian Kemp
6

Jika perangkat lunak perlu berinteraksi langsung dengan sistem lama, driver atau perpustakaan, maka Anda mungkin perlu menyediakan versi 32-bit, karena AFAIK OS umumnya (pasti Windows dan Linux AFAIK) tidak memungkinkan pencampuran 64-bit dan 32 -bit kode dalam suatu proses.

Misalnya, jika perangkat lunak Anda perlu mengakses perangkat keras khusus, itu tidak biasa bagi pelanggan untuk mengoperasikan model lama yang hanya tersedia driver 32-bit.

Michael Borgwardt
sumber
2
Anda dapat mencampur 32 bit dan 64 bit dalam proses yang sama di Windows dan Linux: stackoverflow.com/q/12716419/703382
Navin
1
@Navin: Tapi apakah ini praktis? Bisakah Anda menggunakan komponen COM dalam aplikasi Windows 64-bit (mis. Aplikasi .NET ditandai dengan CPU apa saja yang berjalan pada Windows versi 64-bit)?
Peter Mortensen
3

Jika perangkat lunak Anda adalah DLL, Anda HARUS memberikan versi 32-bit dan 64-bit. Anda tidak tahu apakah pelanggan akan menggunakan perangkat lunak 32-bit atau 64-bit untuk berbicara dengan DLL, dan DLL harus menggunakan bit-length yang sama dengan aplikasi. Ini tidak bisa dinegosiasikan.

Jika perangkat lunak Anda dapat dieksekusi sendiri, itu kurang jelas. Jika Anda tidak memerlukan perangkat lunak untuk dijalankan pada OS yang lebih lama, Anda mungkin tidak perlu menyediakan versi 32-bit. Tetaplah pada 64-bit, tentukan bahwa itu membutuhkan OS 64-bit, dan pekerjaan sudah selesai.

Namun, jika Anda benar-benar memerlukan perangkat lunak Anda untuk berjalan pada OS yang lebih lama, maka Anda mungkin secara aktif TIDAK ingin memberikan versi 64-bit. Jika Anda memiliki dua versi maka Anda harus menggandakan pengujian, dan menguji perangkat lunak dengan benar di berbagai versi OS dan bahasa bukanlah proses yang cepat. Karena perangkat lunak 32-bit berjalan dengan sangat bahagia di platform 64-bit, itu masih cukup umum untuk perangkat lunak yang dirilis hanya sebagai 32-bit, terutama oleh pengembang yang lebih kecil.

Perhatikan juga bahwa sebagian besar ponsel berukuran 32-bit. Mungkin beberapa yang canggih sudah 64-bit sekarang, tetapi ada sedikit alasan kuat untuk membuat langkah itu. Jadi, jika Anda mengembangkan lintas-platform dan mungkin ingin kode Anda berjalan di Android juga, tetap 32-bit adalah pilihan yang aman.

Graham
sumber
Saya akan menentang posisi Anda pada pengujian yang dikurangi. Saya lebih suka berdebat untuk menguji pada beberapa platform terutama dengan tidak hanya ukuran register yang berbeda tetapi dengan pesanan byte yang berbeda hanya sebagai cara mudah untuk meningkatkan pengujian dan menangkap kesalahan halus. Selain itu saya juga akan melakukan pengujian pada komputer yang tidak memenuhi persyaratan perangkat keras minimum yang disarankan karena juga akan memaparkan masalah tambahan yang mungkin tidak muncul sebaliknya kecuali dengan set data yang sangat besar.
Hildred
@hildred Dengan sumber daya pengujian tidak terbatas, saya setuju. Namun dalam praktiknya, jika Anda memiliki kendali lebih besar atas target Anda, maka Anda mungkin tidak perlu melakukan pengujian ini segera. Ini sama sekali bukan "cara mudah" baik - pasti Anda dapat mensimulasikan beberapa platform ini dalam VM, tetapi jika Anda memerlukan perangkat keras fisik diatur maka ini melibatkan sejumlah besar pekerjaan manual (non-otomatable). Mungkin menyelamatkan Anda dari menulis test harness untuk menguji ini secara eksplisit, tetapi tidak gratis dengan cara apa pun.
Graham
1
Tidak gratis, tetapi sangat murah. Jika Anda membatasi pengujian di luar platform Anda untuk pengujian otomatis, tes idiot sesekali, perangkat keras bekas Selain pengaturan Anda, biaya Anda untuk pengujian yang berhasil setelah pengaturan awal Anda akan terbatas pada daya dan sekitar 7 menit manusia per test pass. Biaya untuk tes gagal tentu saja akan lebih tinggi, tetapi biasanya akan lebih bernilai (selalu ada kegagalan perangkat keras). Jenis pengaturan ini sangat berguna bagi programmer, karena dengan mudah memunculkan kelas tertentu dari masalah pointer yang sulit dilacak.
Hildred