08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

DİNAMİK BELLEK YÖNETİMİ<br />

Dinamik Bellek Yönetimi Nedir<br />

Çalıştırılabilen bir program bir bellek alanını kullanır. Nesneler programın kullandığı bellek<br />

alanındaki bloklardır. Bir ya da birden fazla nesnenin programın çalışma zamanında<br />

kaplayacağı yer iki ayrı biçimde elde edilebilir:<br />

1. Nesne(ler) için derleyici derleme zamanında bellekte bir yer ayarlar.<br />

2. Nesne(ler) için yer programın çalışma zamanında elde edilir.<br />

Programın çalışma zamanı sırasında belli bir büyüklükte bitişik (contigous) bir bellek<br />

alanının çalışan program tarafından ayrılmasına , böyle bir alanın istenildiği zaman<br />

sisteme geri verilmesine olanak sağlayan yöntemlere "dinamik bellek yönetimi" (dynamic<br />

memory management) denir.<br />

C dilinde bir değişken ya da bir dizi tanımlandığı zaman, bu değişken ya da dizinin<br />

programın çalışma zamanında kaplayacağı yer, derleme zamanında derleyici tarafından<br />

ayrılır:<br />

int a[100];<br />

Derleme sırasında yukarıdaki gibi bir dizi tanımı ile karşılaşan derleyici bellekte -eğer<br />

kullanılan sistemde int türü uzunluğunun 2 byte olduğu varsayılırsa- toplam 200 byte yer<br />

ayırır. Programın çalışması sırasında bir dizinin uzunluğunu değiştirmek mümkün değildir.<br />

Eğer bu dizi yerel ise otomatik ömürlüdür. Yani içinde tanımlanmış olduğu bloğun<br />

kodunun yürütülmesi süresince hayatını sürdürür. Dizi global ise statik ömürlüdür. Yani<br />

dizi, programın çalışma süresi boyunca bellekteki yerini korur.<br />

Dinamik bellek yönetimi araçları kullanılarak bir ya da birden fazla nesnenin programın<br />

çalışma zamanında kaplayacağı yerin elde edilmesi derleme zamanından, çalışma<br />

zamanına geciktirilebilir.<br />

Kullanılacak bellek bloğunun elde edilmesi neden derleme zamanından çalışma zamanına<br />

kaydırılsın? Bunun önemli bazı nedenleri vardır. İlerleyen sayfalarda bu nedenlerin<br />

çoğuna değinilecek.<br />

Bellek alanının programın çalışma zamanında elde edilmesinin en önemli nedenlerinden<br />

biri gereksinim duyulan bellek bloğunun büyüklüğünün programın çalışma zamanında<br />

belli olmasıdır.<br />

Dizi tanımlamalarında dizi boyutunu gösteren ifade yani köşeli ayracın içindeki ifade,<br />

değişmez ifadesi olmalıdır. Bu ifade değişken içeremez. Çünkü derleyicinin dizi için<br />

bellekte yer ayırabilmesi için, dizi boyutunu derleme zamanında bilmesi gerekir. Oysa<br />

birçok uygulamada kullanılması gereken dizinin boyutu programın çalışma zamanında<br />

belirlenir. Bir dizindeki dosyaların isimlerinin küçükten büyüğe doğru sıralanmak amacıyla<br />

geçici olarak bir dizide saklanması gerektiğini düşünün. Bu amaçla kullanılacak dizinin<br />

boyutu ne olmalıdır? Bu başlangıçta belli değildir. Çünkü dizin içinde kaç dosya olduğu<br />

belli değildir. Bu tip durumlara özellikle veri tabanı uygulamalarında sık rastlanır. Bazı<br />

uygulamalarda dizilerin gerçek uzunluğu programın çalışması sırasında, ancak birtakım<br />

olaylar sonucunda kesin olarak belirlenebilir. Bu durumda dizilerle çalışan programcı<br />

herhangi bir gösterici hatasıyla karşılaşmamak için dizileri en kötü olasılığı göz önünde<br />

bulundurarak mümkün olduğunca büyük tanımlamak zorundadır. Bu da belleğin verimsiz<br />

kullanılması anlamına gelir. Üstelik tanımlanan diziler yerel ise tanımlandıkları bloğun<br />

sonuna kadar, tanımlanan diziler global ise programın çalışmasının sonuna kadar bellekte<br />

tutulur. Oysa dizi ile ilgili işlem biter bitmez, dizi için ayrılan bellek bölgesinin boşaltılması<br />

verimli bellek kullanımı için gereklidir.<br />

Belleğin kontrolu işletim sistemindedir. İşletim sistemlerinin başka bir amaçla<br />

kullanılmayan bir bellek alanını kullanıma sunmasına yarayan sistem işlevleri vardır.<br />

Şüphesiz bu işlevler doğrudan çağrılabilir. Ancak uygulamalarda çoğunlukla standart C<br />

323

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!