Birçok kişi belleği boşalttığınızda, anında işletim sistemine geri döndüğü ve diğer programlar tarafından kullanılabileceği izlenimi altında görünüyor.
Bu doğru değil. İşletim sistemleri genellikle 4KiB sayfalarındaki belleği yönetir. malloc
ve diğer bellek yönetimi sayfalarını işletim sisteminden alır ve uygun gördükleri şekilde alt yönetir. Oldukça olasılıklar söz konusudur free()
olacak değil Programınız sonra daha fazla bellek malloc'dan olacağı varsayımıyla, işletim sistemine sayfaları getirir.
Bunu söylemiyorum free()
hiçbir zaman işletim sistemine bellek döndürmediğini . Bu, özellikle büyük miktarda bellek boşaltıyorsanız, olabilir. Ama garanti yok.
Önemli gerçek: Artık ihtiyaç duymadığınız belleği boşaltmazsanız, daha fazla mallokun daha fazla tüketmesi garanti edilir bellek . Ama önce boşta kalırsanız, malloc serbest belleği yeniden kullanabilir.
Bu pratikte ne anlama geliyor? Bu, programınızın bundan sonra daha fazla bellek gerektirmeyeceğini biliyorsanız (örneğin, temizleme aşamasındadır), belleği boşaltmak o kadar önemli değildir. Ancak, program daha sonra daha fazla bellek ayırabilirse, bellek sızıntılarından kaçınmalısınız - özellikle de tekrar tekrar meydana gelebilecek olanlardan.
Ayrıca bu yoruma bakın , sonlandırmadan hemen önce belleği boşaltmanın neden kötü olduğu hakkında daha fazla ayrıntı için .
Bir yorumcu aramanın free()
diğer programların serbest bırakılmış belleği kullanmasına otomatik olarak izin vermediğini . Ama bu cevabın bütün mesele bu!
Yani, insanları ikna etmek için, free () 'in çok az işe yaradığı bir örnek göstereceğim. Matematiği takip etmeyi kolaylaştırmak için, işletim sisteminin 4000 baytlık sayfalarda belleği yönettiğini iddia edeceğim.
On bin 100 baytlık blok tahsis ettiğinizi varsayalım (basitlik için bu tahsisleri yönetmek için gereken ekstra belleği göz ardı edeceğim). Bu 1MB veya 250 sayfa tüketir. Daha sonra bu blokların 9000'ini rastgele serbest bırakırsanız, sadece 1000 blokla kalırsınız - ancak her yere dağılmışlardır. İstatistiksel olarak, sayfaların yaklaşık 5'i boş olacaktır. Diğer 245'ün her birinde en az bir ayrılmış blok bulunur. Bu, yalnızca 100KB tahsis edilmiş olsanız bile, işletim sistemi tarafından geri alınamayan 980KB bellek demektir!
Öte yandan, artık programınızın bağladığı bellek miktarını artırmadan 9000 blok daha malloc () edebilirsiniz.
Bile free()
olabilir teknik olarak OS hafızayı dönmek, bunu yapmak olmayabilir. free()
hızlı çalışma ve bellek tasarrufu arasında bir denge kurması gerekir. Ayrıca, çok fazla bellek ayıran ve daha sonra serbest bırakan bir programın bunu tekrar yapması muhtemeldir. Bir web sunucusunun istek sonrasında istek sonrasında işlem yapması gerekir - işletim sisteminden her zaman bellek istemeniz gerekmez.