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?
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?
Câu trả lời:
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.
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ó.
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.