Menulis Alokasi Memori
Cuplikan untuk pengalokasi memori di c
Alokasi Memori 101 - Tulis Alokasi Memori Sederhana
void * malloc ( size_t size );
void free ( void * ptr );
Block * merge_blocks ( Block * block );
// the above three will be implemented first later calloc and realloc Tentukan struktur data : Anda akan memerlukan struktur data untuk melacak ukuran dan status alokasi setiap blok. Ini bisa menjadi struct sederhana dengan ukuran dan bendera yang menunjukkan apakah blok gratis atau tidak.
Inisialisasi tumpukan : Ketika program Anda dimulai, Anda harus menyisihkan sepotong memori untuk bertindak sebagai tumpukan Anda. Ini dapat dilakukan dengan menggunakan panggilan sistem mmap() .
Menerapkan malloc() : Fungsi ini harus menemukan blok gratis yang cukup besar untuk memenuhi permintaan. Jika tidak ada blok seperti itu, itu harus meningkatkan ukuran tumpukan. Setelah blok yang cocok ditemukan, itu harus ditandai sebagai dialokasikan dan alamatnya dikembalikan.
Menerapkan free() : Fungsi ini harus membawa pointer ke blok memori, tandai sebagai gratis, dan berpotensi mengurangi ukuran tumpukan jika blok yang dibebaskan ada di akhir.
Implement realloc() : Fungsi ini harus mengubah ukuran blok yang dialokasikan. Ini mungkin melibatkan menemukan blok baru dan menyalin data lama.
Tangani Fragmentasi : Seiring waktu, tumpukan dapat terfragmentasi dengan blok bebas yang tersebar di seluruh. Anda mungkin ingin menerapkan strategi untuk defragmenting tumpukan, seperti menyatukan blok bebas yang berdekatan.
Dalam konteks alokasi tumpukan, "blok" merujuk pada potongan memori di dalam tumpukan. Inilah mengapa Anda membutuhkannya dan cara kerjanya:
Mengapa Blok? : Ketika Anda mengelola memori, akan membantu untuk membaginya menjadi potongan yang dapat dikelola, atau "blok". Setiap blok dapat dialokasikan dan dialokasikan secara mandiri. Ini memungkinkan penggunaan memori yang efisien, karena Anda dapat mengalokasikan memori sebanyak yang Anda butuhkan, tidak lebih dan tidak kurang.
Struktur blok : Setiap blok biasanya berisi metadata tentang blok (seperti ukurannya dan apakah itu gratis atau dialokasikan) dan data aktual yang disimpan di blok. Metadata digunakan oleh alokasi untuk mengelola memori.
Alokasi : Ketika Anda memanggil malloc() , alokasi mencari blok gratis yang cukup besar untuk menahan jumlah data yang diminta. Jika menemukan satu, itu menandai blok itu sebagai dialokasikan dan mengembalikan pointer ke bagian data blok.
Deallocation : Saat Anda menelepon free() , alokasi menandai blok sebagai gratis, membuatnya tersedia untuk alokasi di masa depan. Jika blok yang dibebaskan berada di ujung tumpukan, alokasi juga dapat mengurangi ukuran tumpukan untuk membebaskan memori.
Fragmentasi : Seiring waktu, karena blok dialokasikan dan dialokasikan, tumpukan dapat menjadi terfragmentasi. Ini berarti bahwa memori bebas dibagi menjadi blok kecil yang tidak bersebelahan. Ini dapat membuat sulit untuk menemukan blok yang cukup besar untuk panggilan malloc() , bahkan jika ada cukup memori bebas total. Untuk menangani ini, alokasi sering menyertakan logika untuk defragment tumpukan, seperti menyatukan blok bebas yang berdekatan.