Điều gì xảy ra trong UNIX / Linux khi một chương trình lớn hơn kích thước bộ nhớ?


7

Tôi đã tự hỏi làm thế nào các hệ thống nhúng có thể chạy các chương trình lớn hơn kích thước của bộ nhớ. Nếu tôi có 1 GB bộ nhớ và chương trình là 1,5 GB, chương trình có tải không? Có những hệ thống chỉ sử dụng bộ nhớ khả dụng?


1
Đây là lý do tại sao bạn có trao đổi, do đó, mã theo nghĩa đen có thể được hoán đổi trong và ngoài bộ nhớ để đảm bảo chỉ những bit cần thiết có trong bộ nhớ.
Burhan Khalid

Vì Burhan Said Swap là bộ nhớ ảo, Nó sẽ được các ứng dụng sử dụng khi bộ nhớ vật lý (RAM) Tải trọng mục tiêu, Nếu có 8GB RAM trong máy, chúng ta cần gán 16GB Swap nghĩa là luôn nhân đôi RAM, Hầu hết nếu máy tính để bàn có dung lượng RAM lớn hơn, chúng tôi không cần phải cấu hình hoán đổi, nếu đó là máy chủ Chắc chắn phải có không gian hoán đổi, nếu bạn cần trao đổi để tạo, bạn có thể tạo nó bằng lệnh, nhưng bạn cần không gian trống Đĩa.
Babin Lonston

1
ypu không cần trao đổi gấp đôi RAM. đó đơn giản chỉ là một quy tắc và ngày càng tệ hơn khi RAM trở nên rẻ hơn.
strugee

Tôi cho rằng các hệ thống nhúng sẽ không chương trình nào lớn như vậy.
evilsoup

@Lonston, bạn nên định cấu hình RAM để bạn có đủ cho khối lượng công việc bình thường (hoặc mức sử dụng cao nhất dự kiến) và thêm trao đổi để xử lý bất kỳ yêu cầu đặc biệt nào ở trên. Nhưng điều đó thật khó để ước tính, và vì trong lịch sử, RAM rất đắt và đĩa rẻ, các quy tắc thô sơ như 2 lần RAM đã xuất hiện. Một số hạt nhân SunOS ban đầu phải có hoán đổi ít nhất bằng RAM để có thể sử dụng nó, điều này phục vụ cho việc này.
vonbrand

Câu trả lời:


6

1. Bộ nhớ ảo
Hệ thống sẽ đảm bảo rằng các quy trình sẽ nhận được lượng bộ nhớ được yêu cầu mặc dù lớn hơn bộ nhớ vật lý. Bằng cách này, kernel phân bổ một không gian bộ nhớ ảo có kích thước bộ nhớ vật lý tối đa mà nó có thể xử lý. Ví dụ, trên máy 32 bit, kernel sẽ phân bổ tổng cộng 2 ^ 32 tức là 4GB địa chỉ ảo cho mọi quy trình theo mặc định.
2. Quá mức
Ngoài ra còn có một thứ gọi là overcommit trong Linux, trong đó kernel đáp ứng các yêu cầu cấp phát bộ nhớ lớn hơn bộ nhớ vật lý có sẵn. Quá mức sẽ làm cho kernel cấp phát bộ nhớ ảo mà không có bất kỳ sự đảm bảo nào về việc cấp phát bộ nhớ vật lý tương ứng.
3. Hoán đổi không gian
Vì quá trình cần nhiều bộ nhớ bắt đầuTrên thực tế sử dụng phần lớn bộ nhớ đó, kernel bắt đầu quét các trang bộ nhớ không sử dụng, cũng như các trang bộ nhớ của các quá trình có mức độ ưu tiên thấp hơn hoặc hiện không chạy. Nó hoán đổi dữ liệu này sang không gian trao đổi trên thiết bị lưu trữ thứ cấp và giải phóng các trang đó cho quy trình của bạn. Điều này được gọi là ăn cắp trang.

Bằng cách liên tục lặp lại bước 3, tức là hoán đổi các trang vào và ra, hạt nhân quản lý để hiển thị quá trình ảo ảnh của bộ nhớ mà nó yêu cầu, có thể lớn hơn bộ nhớ có sẵn về mặt vật lý. Bây giờ khi bạn đề cập đến một hệ thống nhúng, chúng tôi phải xem xét liệu trao đổi có được bật trên hệ thống hay không. Nếu có, 3 điểm trên áp dụng. Nếu không, 3 điểm trên vẫn được áp dụng, nhưng điều duy nhất là quá trình của bạn có thể sẽ bị sập hoặc có thể bị giết bởi kẻ giết người OOM (Out-Of-Memory). Cũng có khả năng hạt nhân sử dụng trình diệt OOM để tiêu diệt các tiến trình khác để giải phóng nhiều trang hơn cho các quy trình của bạn nếu thấy phù hợp. Tuy nhiên, Điều này sẽ chỉ xảy ra nếu không có không gian hoán đổi.


2
Bộ nhớ ảo và bộ nhớ quá mức không giống nhau.
jlliagre

Cũng xem xét rằng bất cứ điều gì không thay đổi từ tệp chương trình / thư viện trên đĩa không bao giờ được trao đổi, nó sẽ được đọc lại từ đó khi cần thiết.
vonbrand

@jlliagre - Tôi đồng ý, tôi cần cơ cấu lại một chút, điều mà tôi đã làm. Cảm ơn.
Stark07

1
Bạn vẫn hơi không đúng với định nghĩa của bạn về overcommising. Giới hạn (không bị hạn chế) không phải là bộ nhớ vật lý khả dụng mà là bộ nhớ ảo (tức là vật lý + trao đổi) có sẵn. Nếu có đủ không gian trống trong khu vực trao đổi để sao lưu bộ nhớ, HĐH sẽ không quá dư thừa.
jlliagre

1
Bạn đang định nghĩa Quá mức với câu này: "Quá mức là phân bổ bộ nhớ ảo mà không có bất kỳ sự đảm bảo nào về phân bổ bộ nhớ vật lý tương ứng." Các hệ điều hành không quá tải sẽ phân bổ bộ nhớ ảo một cách an toàn mà không đảm bảo phân bổ bộ nhớ vật lý miễn là có đủ trao đổi miễn phí.
jlliagre

4

Không có gì đặc biệt sẽ xảy ra, giống như với bất kỳ quá trình.

Mặc dù có niềm tin phổ biến, mã chương trình và dữ liệu không được tải toàn bộ khi chương trình được bắt đầu. Chỉ có một tập hợp con nhỏ, về cơ bản là điểm vào của nó (bảng elf, hàm chính, ngăn xếp ban đầu) được tải và mọi thứ khác được tải theo yêu cầu, tức là được phân trang. Điều này sẽ xảy ra khi mã hoặc dữ liệu được truy cập không có trong một trang hiện tại trong bộ nhớ vật lý.

Tương tự, khi có áp lực lên RAM, các trang ít sử dụng sẽ được chuyển sang đĩa để giải phóng không gian.

Nếu kích thước của RAM khả dụng cộng với kích thước của vùng trao đổi xảy ra quá nhỏ để tất cả các trang chương trình đang chạy phù hợp, thì hành vi phụ thuộc vào HĐH:

  • Linux và các hệ điều hành khác có bộ nhớ ảo quá mức sẽ ít nhiều ngẫu nhiên giết chết một số tiến trình để giải phóng không gian.

  • Các hệ điều hành không quá phức tạp như Solaris sẽ không cho phép các quy trình mới bắt đầu và sẽ từ chối việc đặt trước bộ nhớ mới (malloc) từ các quy trình hiện có.


0

Không. Hầu hết các trang không được sử dụng sẽ chuyển sang trao đổi. Nếu không có trao đổi (hoặc không đủ), nó sẽ bị giết và bạn nhận được cảnh báo kernel.

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.