2015-10-29 11 views
5

Tôi đã xem một số hiện tượng kỳ lạ trong lập trình trong một thời gian, vì quá tải được bật theo mặc định trên các hệ thống Linux. Dường như với tôi rằng khá nhiều ứng dụng cấp cao (ví dụ: ứng dụng viết bằng ngôn ngữ lập trình bậc cao như Java, Python hoặc C# bao gồm một số ứng dụng máy tính để bàn được viết bằng C++ sử dụng các thư viện lớn như Qt) bộ nhớ hoạt động ảo. Ví dụ, nó là bình thường cho trình duyệt web để phân bổ 20GB ram trong khi chỉ sử dụng 300MB của nó. Hoặc cho một môi trường dektop, máy chủ mysql, khá nhiều mỗi ứng dụng java hoặc mono và như vậy, để phân bổ hàng chục GB RAM.Tại sao có quá nhiều ứng dụng phân bổ số lượng bộ nhớ ảo vô cùng lớn trong khi không sử dụng bất kỳ bộ nhớ nào?

Tại sao điều đó lại xảy ra? Điểm là gì? Có lợi ích gì trong việc này không?

Tôi nhận thấy rằng khi tôi tắt quá tải trong linux, trong trường hợp hệ thống máy tính để bàn thực sự chạy rất nhiều ứng dụng này, hệ thống sẽ trở nên không sử dụng được vì nó thậm chí không khởi động đúng cách.

Trả lời

3

Các ngôn ngữ chạy mã của chúng bên trong các máy ảo (như Java (*), C# hoặc Python) thường chỉ định một lượng lớn (bộ nhớ ảo) ngay khi khởi động. Một phần của điều này là cần thiết cho chính máy ảo, một phần được phân bổ trước cho bưu kiện cho ứng dụng bên trong máy ảo.

Với ngôn ngữ thực hiện dưới sự kiểm soát trực tiếp hệ điều hành (như C hay C++), đây không phải là cần thiết . Bạn có thể viết các ứng dụng chỉ sử dụng động lượng bộ nhớ mà chúng thực sự yêu cầu. Tuy nhiên, một số ứng dụng/khung công tác vẫn được thiết kế theo cách mà chúng yêu cầu một bộ nhớ lớn từ hệ điều hành một lần và sau đó tự quản lý bộ nhớ, với hy vọng hiệu quả hơn so với hệ điều hành.

Có những vấn đề với điều này:

  • Nó không phải là thiết nhanh hơn. Hầu hết các hệ điều hành đã khá thông minh về cách họ quản lý bộ nhớ của họ. Quy tắc số 1 về tối ưu hóa, đo lường, tối ưu hóa, đo lường.

  • Không phải tất cả hệ điều hành đều có bộ nhớ ảo. Có một số những người khá có khả năng ra khỏi đó mà không thể chạy các ứng dụng như vậy là "bất cẩn" trong giả định rằng bạn có thể phân bổ rất nhiều & rất nhiều bộ nhớ "không thực sự" mà không có vấn đề.

  • Bạn đã phát hiện ra rằng nếu bạn biến hệ điều hành của bạn từ "hào phóng" thành "nghiêm ngặt", những chú heo này sẽ bị rơi phẳng trên mũi của chúng. ;-)


(*) Java, ví dụ, có thể không mở rộng VM của nó khi nó được bắt đầu.Bạn phải cung cấp kích thước tối đa của VM làm thông số (-Xmxn). Suy nghĩ "an toàn hơn xin lỗi" dẫn đến sự tổng quát nghiêm trọng của một số người/ứng dụng nhất định.

+0

Ok, nhưng java không chỉ được sử dụng trên Linux. Có quá tải được bật trên mọi hệ điều hành trong những ngày này không? Nếu nó không (và tôi nghi ngờ nó sẽ là) làm thế nào là nó có thể cho các hệ điều hành để chạy các chương trình này là tốt, trong khi nó không có vẻ là có thể trên linux với overcommit vô hiệu hóa (tôi nghĩa đen thậm chí không thể khởi động hệ điều hành khi Tôi vô hiệu hóa việc overcommit, các yêu cầu bộ nhớ chỉ là rất lớn). – Petr

+0

@Petr: "Overcommit" - chuyển nhiều bộ nhớ ảo hơn bộ nhớ vật lý - thực sự là mặc định trên Windows và Linux. Và điều đó là đủ để khiến nhiều nhà phát triển không thực sự bận tâm về phần còn lại của thế giới điện toán. Một trong những hệ điều hành không "làm" bộ nhớ ảo, ví dụ, Amiga OS 3.x - và một hệ điều hành không bao giờ "làm" Java. – DevSolar

1

Các ứng dụng này thường có phương pháp quản lý bộ nhớ riêng, được tối ưu hóa để sử dụng riêng và hiệu quả hơn quản lý bộ nhớ mặc định do hệ thống cung cấp. Vì vậy, họ phân bổ khối bộ nhớ lớn, để bỏ qua hoặc giảm thiểu hiệu quả của việc quản lý bộ nhớ được cung cấp bởi hệ thống hoặc libc.

Các vấn đề liên quan