Có một vấn đề lớn trong Linux trong trường hợp này nếu bạn tiếp cận với tình trạng hết bộ nhớ - bạn sẽ nhận thấy rằng toàn bộ hệ thống của bạn trở nên hoàn toàn không phản hồi vì nó bắt đầu hoán đổi rất nhiều. Ngay cả con trỏ chuột của bạn cũng có thể trở nên 'chậm' đến mức bạn không thể khởi động thiết bị đầu cuối và giết chết quá trình ăn bộ nhớ vi phạm theo cách thủ công. Điều này là do số lượng lớn các hoạt động đĩa.
Để tránh tình trạng này, cá nhân tôi thường vô hiệu hóa hoàn toàn trao đổi, vì vậy nhân Linux luôn phản ứng nhanh và trong trường hợp xấu nhất, kẻ giết người hết bộ nhớ (OOM) sẽ giết chết một số tiến trình. Logic của quá trình bị giết bởi OOM phụ thuộc vào phiên bản kernel.
Vì vậy, câu trả lời là không - không cho phép phân bổ trao đổi động. Bạn sẽ phải đối mặt với máy treo.
Thật dễ dàng để dùng thử với chương trình liên tục phân bổ một số bộ nhớ trong một vòng lặp. Lưu chương trình này vào một tệp văn bản , memeater.c
:
#include <stdlib.h>
int main() {
for (;;) {char* mem=malloc(4096); mem[0]=1;};
}
Sau đó biên dịch nó:
$ gcc memeater.c -o memeater
và chạy:
$ ./memeater
Hãy thử với hoán đổi, không trao đổi và với phân bổ trao đổi động của bạn.
Ngoài ra, hãy nhớ rằng trong hầu hết các trường hợp, tình trạng OOM này xảy ra do lỗi phần mềm (rò rỉ bộ nhớ) hoặc bạn đã làm gì đó sai như 'tải tệp 10 GB này trong trình chỉnh sửa' hoặc 'chạy quá nhiều tệp đồ họa thay đổi kích thước song song' và làm kết luận: Bạn có cần trao đổi hay không?