Mari kita pertimbangkan segmen memori (yang ukurannya dapat tumbuh atau menyusut, seperti file, bila diperlukan) di mana Anda dapat melakukan dua operasi alokasi memori dasar yang melibatkan blok ukuran tetap:
- alokasi satu blok
- membebaskan blok yang sebelumnya dialokasikan yang tidak digunakan lagi.
Selain itu, sebagai persyaratan, sistem manajemen memori tidak diperbolehkan untuk bergerak di sekitar blok yang saat ini dialokasikan: indeks / alamatnya harus tetap tidak berubah.
Algoritme manajemen memori yang paling naif akan menambah penghitung global (dengan nilai awal 0) dan menggunakan nilai barunya sebagai alamat untuk alokasi selanjutnya. Namun ini tidak akan pernah memungkinkan untuk mempersingkat segmen ketika hanya beberapa blok yang dialokasikan tetap.
Pendekatan yang lebih baik: Pertahankan penghitung, tetapi pertahankan daftar blok yang tidak dapat dialokasikan (yang dapat dilakukan dalam waktu konstan) dan gunakan sebagai sumber untuk alokasi baru selama tidak kosong.
Apa selanjutnya? Adakah sesuatu yang pintar yang dapat dilakukan, masih dengan kendala alokasi waktu dan deallokasi yang konstan, yang akan membuat segmen memori sesingkat mungkin?
(Tujuannya mungkin untuk melacak blok yang saat ini tidak dialokasikan dengan alamat terkecil, tetapi tampaknya tidak layak dalam waktu yang konstan ...)
sumber
Jawaban:
Dengan blok ukuran tetap, apa yang telah Anda gambarkan adalah daftar gratis . Ini adalah teknik yang sangat umum, dengan twist berikut: daftar blok gratis disimpan di blok gratis sendiri. Dalam kode C, akan terlihat seperti ini:
Ini bekerja dengan baik selama semua blok yang dialokasikan memiliki ukuran yang sama, dan ukuran itu adalah kelipatan dari ukuran pointer, sehingga pelurusan dipertahankan. Alokasi dan deallokasi adalah waktu-konstan (yaitu, sebagai waktu-konstan ketika akses memori dan penambahan-penambahan elementer - dalam komputer modern, akses memori dapat melibatkan kehilangan cache dan bahkan memori virtual, karenanya disk mengakses, sehingga "waktu konstan" bisa sangat besar). Tidak ada memori overhead (tidak ada pointer per-blok tambahan atau hal-hal seperti itu; blok yang dialokasikan berdekatan). Juga, penunjuk alokasi mencapai titik tertentu hanya jika, pada satu waktu, bahwa banyak blok harus dialokasikan: karena alokasi lebih suka menggunakan daftar bebas, penunjuk alokasi ditingkatkan hanya jika ruang di bawah penunjuk saat ini adalah jam penuh. Dalam pengertian itu, teknik.
Menurunpenunjuk alokasi setelah rilis dapat menjadi lebih kompleks, karena blok gratis hanya dapat diidentifikasi secara andal dengan mengikuti daftar gratis, yang melewati mereka dalam urutan yang tidak terduga. Jika mengurangi ukuran segmen besar bila mungkin penting bagi Anda, Anda dapat menggunakan teknik alternatif, dengan overhead yang lebih banyak: di antara dua blok yang dialokasikan, Anda meletakkan "lubang". Lubang-lubang tersebut dihubungkan bersama dengan daftar yang terhubung ganda, dalam urutan memori. Anda memerlukan format data untuk lubang sehingga Anda dapat menemukan alamat mulai lubang dengan mengetahui di mana ujungnya, dan juga ukuran lubang jika Anda tahu di mana lubang dimulai di memori. Kemudian, ketika Anda melepaskan blok, Anda membuat lubang yang Anda gabungkan dengan lubang berikutnya dan sebelumnya, membangun kembali (masih dalam waktu yang konstan) daftar semua lubang yang dipesan. Overhead kemudian sekitar dua kata berukuran pointer per blok yang dialokasikan; tetapi, pada harga itu, Anda dapat dengan andal mendeteksi terjadinya "lubang terakhir", yaitu kesempatan untuk mengurangi ukuran segmen besar.
Ada banyak variasi yang memungkinkan. Makalah pengantar yang baik adalah Dynamic Storage Allocation: A Survey and Critical Review oleh Wilson et al.
sumber
Jawaban ini adalah tentang teknik manajemen memori generik. Saya melewatkan pertanyaan tentang kasus di mana semua blok memiliki ukuran yang sama (dan disejajarkan).
Strategi dasar yang harus Anda ketahui adalah kecocokan pertama, kecocokan berikutnya, kecocokan terbaik, dan sistem pertemanan . Saya menulis ringkasan singkat sekali untuk kursus yang saya ajarkan, saya harap ini bisa dibaca. Saya menunjuk ke sana untuk survei yang cukup lengkap .
Dalam praktiknya Anda akan melihat berbagai modifikasi dari strategi dasar ini. Tapi tidak ada yang benar-benar konstan! Saya tidak berpikir itu mungkin dalam kasus terburuk, saat menggunakan jumlah memori yang terbatas.
sumber
Anda mungkin ingin melihat analisis diamortisasi dan khususnya array dinamis. Bahkan jika operasi tidak benar-benar dilakukan dalam waktu yang konstan di setiap langkah, dalam jangka panjang kelihatannya seperti itu terjadi.
sumber