Saya sedang berlari Fedora 26
.
Ini untuk tugas yang sangat aneh yang diberikan oleh profesor algoritma saya. Tugas mengatakan:
Memori fragmentasi dalam C:
Desain, laksanakan, dan jalankan C-program yang melakukan hal berikut: Ini mengalokasikan memori untuk urutan3m
ukuran array 800.000 elemen masing-masing; kemudian secara eksplisit mendelokasi semua array genap dan mengalokasikan urutanm
array berukuran 900.000 elemen masing-masing. Ukur jumlah waktu yang dibutuhkan program Anda untuk alokasi urutan pertama dan untuk urutan kedua. Pilihm
untuk menguras hampir semua memori utama yang tersedia untuk program Anda. "
Tujuan keseluruhan dari ini adalah untuk memecah memori kemudian meminta sedikit lebih banyak daripada apa yang tersedia sebagai potongan yang berdekatan, memaksa sistem operasi untuk memadatkan atau mendefrag memori.
Di kelas saya bertanya bagaimana kita harus melakukan ini karena memori divisualisasikan dan tidak benar-benar berdekatan, yang dia jawab: "Yah, Anda harus mematikan [memori virtual]." Beberapa siswa lain bertanya di kelas bagaimana kita harus tahu kapan kita telah mencapai "pengumpulan sampah" ini, dan dia berkata bahwa: "Waktu untuk alokasi kedua harus lebih besar daripada yang pertama karena waktu yang diambil oleh pengumpulan sampah"
Setelah mencari-cari sedikit, hal terdekat yang dapat saya temukan untuk menonaktifkan memori virtual adalah dengan menonaktifkan swap memori swapoff -a
. Saya menonaktifkan lingkungan desktop saya dan mengkompilasi dan menjalankan program saya dari terminal asli (untuk menghindari kemungkinan gangguan dari proses lain, terutama yang berat seperti Lingkungan Desktop). Saya melakukan ini dan menjalankan program saya dengan peningkatan m
sampai saya mencapai titik di mana waktu untuk alokasi kedua lebih besar dari yang pertama.
Saya menjalankan program dengan peningkatan m
dan akhirnya menemukan titik di mana waktu untuk alokasi kedua lebih dari waktu untuk alokasi pertama. Namun dalam perjalanan saya mencapai titik di mana proses itu dibunuh sebelum alokasi kedua. Saya memeriksa dmesg
dan melihat bahwa itu dibunuh oleh oom
-killer. Saya menemukan dan membaca beberapa artikel tentang oom
-killer dan menemukan bahwa Anda dapat menonaktifkan alokasi memori oleh kernel.
Saya melakukan ini dan menjalankan program saya lagi, hanya saja kali ini saya tidak dapat menemukan m
sehingga waktu yang kedua lebih tinggi dari yang pertama. Akhirnya dengan m yang lebih besar dan lebih besar (meskipun jauh lebih kecil dari ketika keseluruhan alokasi diaktifkan) malloc akan gagal dan program saya akan berakhir.
Saya punya tiga pertanyaan, yang pertama tidak terlalu penting:
Apakah pengumpulan sampah adalah istilah yang benar untuk ini? Profesor saya sangat bersikeras mengatakan bahwa ini adalah pengumpulan sampah, tetapi saya berada di bawah asumsi bahwa pengumpulan sampah adalah sesuatu yang dilakukan oleh bahasa pemrograman dan bahwa ini akan dianggap lebih defragmenting.
Apakah pemadatan seperti yang diinginkannya mungkin pada sistem linux?
Mengapa saya bisa mencapai titik di mana waktu untuk alokasi kedua lebih tinggi daripada yang pertama ketika saya menonaktifkan swap tetapi masih memiliki keseluruhan memori yang diaktifkan? Apakah pemadatan benar-benar terjadi? Jika demikian mengapa saya tidak dapat mencapai titik di mana pemadatan terjadi setelah saya menonaktifkan keseluruhan memori?