Có lý do chính đáng để chạy phần mềm 32 bit thay vì 64 bit trên máy 64 bit không?


56

Có lý do chính đáng nào để cung cấp phiên bản 32 bit cùng với phiên bản 64 bit của bất kỳ phần mềm nào nhắm vào các máy tính để bàn hiện đại, chạy hệ điều hành 64 bit hiện đại trên phần cứng 64 bit không?

Có vẻ như phần mềm 64 bit sẽ hiệu quả hơn, cho phép sử dụng bộ nhớ cao hơn nếu cần, v.v. Apple thậm chí còn sử dụng bộ xử lý 64 bit cho điện thoại của họ, mặc dù chúng chỉ có 1-2 GB RAM, thấp hơn 4 GB giới hạn cho CPU 32 bit.


16
Không phải mọi máy hiện đại đều chạy HĐH 64 bit
Bálint

4
bạn có bất kì ví dụ nào không?
Filip Haglund

8
Hỏi khách hàng của bạn.
Murphy

22
Câu hỏi tu từ: có lý do để cung cấp phiên bản 64 bit của bất kỳ phần mềm nào không vì hầu hết các hệ điều hành 64 bit hiện đại cũng cho phép chạy các ứng dụng 32 bit và 64 bit?
Doc Brown

2
Không phải là một bản sao @gnat. Câu hỏi đó là về việc điều chỉnh dấu thời gian và id nhà phát triển trong mã lỗi được trả về khi chương trình thoát.
Filip Haglund

Câu trả lời:


80

Lợi ích của phần mềm 32 bit trong môi trường 64 bit

  • Dung lượng bộ nhớ thấp hơn, đặc biệt là trong các ứng dụng nặng con trỏ, 64 bit so với 32 bit có thể dễ dàng nhân đôi yêu cầu bộ nhớ.
  • Các tệp đối tượng cũng nhỏ hơn.
  • Khả năng tương thích với môi trường 32 bit.
  • Rò rỉ bộ nhớ được giới hạn ở mức 2 GB, 3 GB hoặc 4 GB và sẽ không tràn ngập toàn bộ hệ thống.

Hạn chế của phần mềm 32 bit trong môi trường 64 bit

  • Giới hạn bộ nhớ 2 GB, 3 GB hoặc 4 GB cho mỗi quá trình. (Chỉ trên mỗi quy trình, tổng cộng nhiều quy trình 32 bit có thể sử dụng bộ nhớ hệ thống có sẵn đầy đủ.)
  • Không sử dụng các thanh ghi bổ sung và phần mở rộng tập lệnh tùy thuộc vào x64. Đây là trình biên dịch cao và CPU cụ thể.
  • Có thể yêu cầu các phiên bản 32 bit của tất cả (hầu hết các bản phân phối Linux) hoặc thư viện không phổ biến (hầu hết các phiên bản Windows) và chạy môi trường thời gian. Nếu phiên bản 32 bit của thư viện dùng chung được tải riêng cho ứng dụng của bạn và số đó sẽ được tính vào dấu chân của bạn. Không có sự khác biệt nào nếu bạn đang liên kết tĩnh.

Những khía cạnh khác

  • Trình điều khiển thường không phải là một vấn đề. Chỉ các thư viện không gian người dùng nên khác nhau giữa 32 bit và 64 bit, không phải API của các mô-đun hạt nhân.
  • Cảnh giác với các độ rộng mặc định khác nhau cho các kiểu dữ liệu số nguyên, cần thử nghiệm bổ sung.
  • Kiến trúc CPU 64 bit thậm chí có thể không hỗ trợ 32 bit.
  • Một số kỹ thuật như ASLR và các kỹ thuật khác tùy thuộc vào không gian địa chỉ lớn hơn nhiều so với bộ nhớ vật lý sẽ không hoạt động tốt (hoặc hoàn toàn) trong chế độ thực thi 32 bit.

Trừ khi so sánh một kiến ​​trúc CPU, hệ điều hành và cơ sở hạ tầng thư viện rất cụ thể ở đây, tôi sẽ không thể đi sâu vào chi tiết hơn.


8
"Kiến trúc CPU 64 bit thậm chí có thể không hỗ trợ 32 bit." Đây có phải là một mối quan tâm lý thuyết, hoặc điều này tồn tại trên thế giới?
mucaho

10
@mucaho Chắc chắn đã có các kiến trúc CPU chỉ có 64 bit, như Alpha và IA64. Cả hai đều là moribund, mặc dù. Tôi không biết trên đỉnh đầu của mình liệu có bất kỳ kiến trúc 64-bit nào hiện đang được sản xuất - AArch64, có thể không? Có ai biết liệu ARM 32-bit có phải là thành phần bắt buộc không?
zwol

10
@zwol Không, 32-bit không bắt buộc đối với ARM và cũng không phải là 64-bit. Có các CPU ARM chỉ 64 bit, trong khi các CPU khác hỗ trợ cả quá trình 32 bit và 64 bit.
Ext3h

3
Có một lợi ích bổ sung khi chỉ cần chọn một kiến ​​trúc và gắn bó với nó: phát triển và thử nghiệm đơn giản hơn.
jl6

7
@Joshua Luôn tồn tại? Các pharaoh có biết điều này không?
candied_orange

7

Sự khác biệt giữa phần mềm 32 bit và phần mềm 64 bit là kích thước của các con trỏ và có thể là kích thước của các thanh ghi số nguyên. Đó là nó.

Điều đó có nghĩa là tất cả các con trỏ trong chương trình của bạn có kích thước gấp đôi. Và (ít nhất là trên kiến ​​trúc ILP32 / LP64) long, kích thước của bạn cũng gấp đôi. Điều này thường làm tăng khoảng 30% kích thước mã đối tượng. Điều này có nghĩa rằng …

  • mã đối tượng của bạn sẽ mất ~ 30% lâu hơn để tải từ đĩa vào RAM
  • mã đối tượng của bạn sẽ chiếm thêm ~ 30% dung lượng trong bộ nhớ
  • bạn đã giảm băng thông bộ nhớ một cách hiệu quả (đối với mã đối tượng) xuống ~ 20%
  • bạn đã giảm đáng kể kích thước của bộ đệm hướng dẫn xuống ~ 20%

Điều này có ảnh hưởng tiêu cực không đáng kể đến hiệu suất.

Làm điều này chỉ có ý nghĩa nếu bạn có thể "mua lại" những chi phí hiệu suất bằng cách nào đó. Về cơ bản, có hai cách để làm điều này: bạn thực hiện rất nhiều phép toán số nguyên 64 bit hoặc bạn cần nhiều hơn 4 bộ nhớ ánh xạ GiByte. Nếu một hoặc cả hai điều đó là đúng, thì nên sử dụng phần mềm 64 bit, nếu không thì không.

Lưu ý: có một số kiến ​​trúc không có biến thể 32 hoặc 64 bit tương ứng. Trong trường hợp đó, câu hỏi rõ ràng không có ý nghĩa. Nổi tiếng nhất là IA64, chỉ 64 bit và không có biến thể 32 bit, và x86 / AMD64, mặc dù có liên quan chặt chẽ, các kiến trúc khác nhau , x86 chỉ 32 bit, AMD64 chỉ 64 bit.

Trên thực tế, tuyên bố sau đó không còn đúng 100% nữa. Linux gần đây đã thêm x32 ABI, cho phép bạn chạy mã AMD64 với các con trỏ 32 bit, do đó, mặc dù đó không phải là kiến ​​trúc CPU "phù hợp", nhưng đó là cách sử dụng kiến ​​trúc AMD64 theo cách như thể nó có nguồn gốc Biến thể 32 bit. Điều này được thực hiện chính xác bởi vì chi phí hiệu năng mà tôi đã đề cập ở trên đã gây ra các vấn đề thực sự có thể đo lường được, có thể định lượng được cho người dùng trong thế giới thực chạy mã thế giới thực trong các hệ thống trong thế giới thực.


8
Điều gì về các thanh ghi và hướng dẫn thêm trong amd64 so với x86? Điều đó cải thiện hiệu suất bao nhiêu?
Filip Haglund

2
Google cho "con trỏ được gắn thẻ" được sử dụng trong Objective-C trên MacOS X và iOS. Một lượng rất lớn các đối tượng không có bộ nhớ được phân bổ bất cứ thứ gì nhưng toàn bộ đối tượng được làm giả trong con trỏ trên các hệ thống 64 bit. (Tôi nghe nói Java làm điều gì đó tương tự). Trong C ++, std :: string trên 64 bit thường chứa tối đa 22 ký tự trong chính đối tượng mà không cần phân bổ bộ nhớ. Tiết kiệm bộ nhớ đáng kể và cải thiện tốc độ.
gnasher729

3
Kích thước của con trỏ và số nguyên là nó? Điều gì về không gian địa chỉ lớn hơn và các thanh ghi bổ sung trong hầu hết các kiến ​​trúc 64 bit?

1
"bạn đã [giảm] instruction cache bởi ~ 20%" là tranh luận từ các tập lệnh là hoàn toàn khác nhau (và thường hiệu quả hơn)
BlueRaja - Danny Pflughoeft

3
"Điều này có ảnh hưởng tiêu cực không đáng kể đến hiệu suất." Mặc dù tuyên bố này là đúng theo nghĩa tuyệt đối, nhưng nó bỏ qua thực tế là phần lớn các nút thắt hiệu suất của phần lớn ứng dụng không nằm trong thời gian tải, hoặc sử dụng bộ nhớ / băng thông hoặc số lượng lệnh trong bộ đệm.
Ian Kemp

6

Nếu phần mềm cần giao tiếp trực tiếp với các hệ thống, trình điều khiển hoặc thư viện cũ, thì bạn có thể cần cung cấp phiên bản 32 bit, vì AFAIK nói chung HĐH (chắc chắn là Windows và Linux AFAIK) không cho phép trộn lẫn 64 bit và 32 mã -bit trong một quy trình.

Ví dụ: nếu phần mềm của bạn cần truy cập vào phần cứng đặc biệt, việc khách hàng vận hành các mô hình cũ hơn chỉ có trình điều khiển 32 bit là không phổ biến.

Là một tài tài, hay nói, qua, qua, qua một khác, qua giữ, qua, qua một khác, qua, qua, qua, khi khác mới, khác mới, khi khác mới đăng, mới, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng, mới đăng cam cam


2
Bạn có thể kết hợp 32 bit và 64 bit trong cùng một quy trình trong cả Windows và Linux: stackoverflow.com/q/12716419/703382
Navin

1
@Navin: Nhưng nó có thực tế không? Bạn có thể sử dụng thành phần COM trong ứng dụng Windows 64 bit (ví dụ: ứng dụng .NET được đánh dấu là Bất kỳ CPU nào chạy trên phiên bản Windows 64 bit) không?
Peter Mortensen

3

Nếu phần mềm của bạn là DLL, bạn PHẢI cung cấp cả phiên bản 32 bit và 64 bit. Bạn không biết khách hàng sẽ sử dụng phần mềm 32 bit hay 64 bit để nói chuyện với DLL và DLL phải sử dụng cùng độ dài bit như ứng dụng. Điều này là không thể thương lượng.

Nếu phần mềm của bạn là một tệp thực thi độc lập, thì nó sẽ không rõ ràng. Nếu bạn không cần phần mềm của mình để chạy trên các hệ điều hành cũ hơn, bạn có thể không cần cung cấp phiên bản 32 bit. Chỉ cần bám vào 64 bit, xác định rằng nó yêu cầu HĐH 64 bit và hoàn thành công việc.

Tuy nhiên, nếu bạn cần phần mềm của mình để chạy trên các hệ điều hành cũ hơn thì bạn có thể chủ động KHÔNG muốn cung cấp phiên bản 64 bit. Nếu bạn có hai phiên bản thì bạn đã tăng gấp đôi thử nghiệm và phần mềm kiểm tra đúng trên một loạt các phiên bản và ngôn ngữ hệ điều hành không phải là một quá trình nhanh chóng. Do phần mềm 32 bit chạy hoàn toàn hạnh phúc trên nền tảng 64 bit, nên phần mềm vẫn chỉ được phát hành dưới dạng 32 bit, đặc biệt là bởi các nhà phát triển nhỏ hơn.

Cũng lưu ý rằng hầu hết các điện thoại di động là 32 bit. Có thể một số cao cấp hiện nay là 64 bit, nhưng có rất ít lý do thuyết phục để thực hiện bước đó. Vì vậy, nếu bạn đang phát triển đa nền tảng và có thể muốn mã của mình cũng chạy trên Android, thì ở lại 32 bit là một lựa chọn an toàn.


Tôi sẽ tranh luận chống lại vị trí của bạn về thử nghiệm giảm. Thay vào đó, tôi sẽ tranh luận để kiểm tra trên nhiều nền tảng, đặc biệt là không chỉ với các kích cỡ đăng ký khác nhau mà với các đơn đặt hàng byte khác nhau cũng giống như một cách dễ dàng để tăng kiểm tra và bắt lỗi tinh vi. Ngoài ra, tôi cũng sẽ thử nghiệm trên các máy tính không đáp ứng các yêu cầu phần cứng tối thiểu được đề xuất của bạn vì điều đó cũng sẽ phơi bày các vấn đề bổ sung có thể không hiển thị nếu không có ngoại trừ các tập dữ liệu rất lớn.
hildred

@hildred Với tài nguyên thử nghiệm không giới hạn, tôi đồng ý. Trong thực tế, nếu bạn kiểm soát nhiều hơn mục tiêu của mình thì bạn có thể không cần thực hiện kiểm tra này ngay lập tức. Đây hoàn toàn không phải là một "cách dễ dàng" - chắc chắn bạn có thể mô phỏng một số nền tảng này trong VM, nhưng nếu bạn cần thiết lập phần cứng vật lý thì điều này liên quan đến một lượng lớn công việc thủ công (không thể tự động). Nó có thể giúp bạn tiết kiệm từ việc viết khai thác thử nghiệm để kiểm tra điều này một cách rõ ràng, nhưng nó không miễn phí bằng bất kỳ phương tiện nào.
Graham

1
Không miễn phí, nhưng hết sức rẻ. Nếu bạn giới hạn kiểm tra nền tảng của mình ở các kiểm tra tự động, kiểm tra ngốc thỉnh thoảng, phần cứng được sử dụng Ngoài thiết lập của bạn, chi phí cho các kiểm tra thành công sau khi thiết lập ban đầu của bạn sẽ bị giới hạn về năng lượng và khoảng 7 phút cho mỗi lần kiểm tra. Tất nhiên, chi phí cho các bài kiểm tra thất bại sẽ cao hơn, nhưng những bài kiểm tra đó thường có giá trị cao hơn (luôn có lỗi phần cứng). Kiểu thiết lập này đặc biệt hữu ích cho các lập trình viên c vì nó dễ dàng phơi bày một loại vấn đề con trỏ nhất định mà khó theo dõi.
hildred
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.