Tôi đang chạy Fedora 26
.
Đây là một bài tập rất lạ được đưa ra bởi giáo sư thuật toán của tôi. Bài tập nói:
Phân mảnh bộ nhớ trong C:
Thiết kế, thực hiện và thực hiện chương trình C thực hiện như sau: Nó phân bổ bộ nhớ cho một chuỗi các3m
mảng có kích thước 800.000 phần tử mỗi phần; sau đó, nó giải quyết rõ ràng tất cả các mảng được đánh số chẵn và phân bổ một chuỗi cácm
mảng có kích thước 900.000 phần tử mỗi mảng. Đo lượng thời gian mà chương trình của bạn yêu cầu để phân bổ chuỗi đầu tiên và cho chuỗi thứ hai. Chọnm
làm cạn kiệt gần như tất cả bộ nhớ chính có sẵn cho chương trình của bạn. "
Mục tiêu tổng thể của việc này là phân mảnh bộ nhớ sau đó yêu cầu nhiều hơn một chút so với những gì có sẵn như một đoạn liền kề, buộc hệ điều hành phải thu gọn hoặc phân mảnh bộ nhớ.
Trong lớp tôi đã hỏi làm thế nào chúng ta nên làm điều này vì bộ nhớ được trực quan hóa và không thực sự tiếp giáp, anh ấy trả lời: "Chà, bạn sẽ phải tắt [bộ nhớ ảo]." Một số sinh viên khác hỏi trong lớp làm thế nào chúng ta nên biết khi nào chúng ta đạt được "bộ sưu tập rác" này và anh ta nói rằng: "Thời gian phân bổ thứ hai nên lớn hơn lần đầu tiên vì thời gian thu gom rác"
Sau khi tìm kiếm xung quanh một chút, điều gần nhất tôi có thể tìm thấy để vô hiệu hóa bộ nhớ ảo là vô hiệu hóa bộ nhớ trao đổi với swapoff -a
. Tôi đã vô hiệu hóa môi trường máy tính để bàn của mình và biên dịch và chạy chương trình của tôi từ thiết bị đầu cuối gốc (để tránh sự can thiệp có thể có từ các quá trình khác, đặc biệt là một môi trường nặng như Môi trường máy tính để bàn). Tôi đã làm điều này và chạy chương trình của mình với mức tăng m
cho đến khi tôi đạt đến điểm mà thời gian phân bổ thứ hai lớn hơn lần đầu tiên.
Tôi đã chạy chương trình với sự gia tăng m
và cuối cùng tìm thấy một điểm trong đó thời gian cho lần phân bổ thứ hai nhiều hơn thời gian cho lần phân bổ đầu tiên. Trên đường đi, tuy nhiên, tôi đã đạt được một điểm trong đó quy trình đã bị giết trước khi phân bổ thứ hai. Tôi đã kiểm tra dmesg
và thấy rằng nó đã bị giết bởi oom
-killer. Tôi đã tìm và đọc một số bài viết về oom
-killer và phát hiện ra rằng bạn có thể vô hiệu hóa việc cấp phát bộ nhớ cho kernel.
Tôi đã làm điều này và chạy chương trình của tôi một lần nữa, chỉ lần này tôi không thể tìm thấy m
sao cho thời gian của lần thứ hai cao hơn lần đầu tiên. Cuối cùng với m lớn hơn và lớn hơn (mặc dù nhỏ hơn nhiều so với khi bật tổng thể), malloc sẽ thất bại và chương trình của tôi sẽ chấm dứt.
Tôi có ba câu hỏi, câu hỏi đầu tiên không thực sự quan trọng:
Là thu gom rác là thuật ngữ chính xác cho điều này? Giáo sư của tôi rất kiên quyết khi nói rằng đây là bộ sưu tập rác, nhưng tôi đã giả định rằng bộ sưu tập rác là thứ được thực hiện bởi các ngôn ngữ lập trình và điều này sẽ được coi là phân mảnh hơn.
Là nén như anh ta muốn có thể trên một hệ thống linux?
Tại sao tôi có thể đạt đến điểm mà thời gian phân bổ thứ hai cao hơn lần đầu tiên khi tôi vô hiệu hóa trao đổi nhưng vẫn kích hoạt tổng thể bộ nhớ? Đã thực sự nén chặt? Nếu vậy tại sao tôi không thể đạt đến điểm mà sự nén xảy ra sau khi tôi vô hiệu hóa tổng thể bộ nhớ?