[linux-programlama] Re: Segfault..

---------

From: Serdar Koylu (serdarkoylu@fisek.com.tr)
Date: Tue 16 Sep 2003 - 12:02:48 EDT

  • Next message: Erdinc Taskin: "[linux-programlama] Re: Segfault.."

    Selamlar..

    Bilmiyorum neyin cevirisi ama, biraz Linux'tan ziyade DOS/Win teknigi gibi gorundu bana.. Bu teknik bu sistemlerde elzemdir ama Linux icinde tavsiye edilir.

    Preallocated Buffer uzerinde allocation yapmak eski ve bilinen bir yontemdir. Bilhassa chunk'larin kucuk artislarla birer ikiser bayt buyutulmesi gerekiyorsa.

    Konunun teknik detayi su sekilde. malloc ile aldiginiz 100 bayti realloc ile buyuturseniz, 102 bayt yaparsaniz mesela, bazen o 100 baytin sonunda 2 bayt bos yer olmayabilir. realloc gider 102 baytlik yeni bir bolge acar ve eski 100 bayti oraya tasir. Bu alloc memcpy dongusunu koyar ki bariz bir performans kaybi soz konusu olur. Bu genel olarak tum mimari ve OS 'lar icin gecerlidir. Win/DOS gibi sistemlerde ise bu memory fragmentation sebebidir. Bu su anlama gelir; bu sistemlerde alloc ile cagirabileceginiz en buyuk bellek boyutu o anda serbest olan en buyuk chunk boyutu kadar olabilir. Simdi arabellegi 100 bayt yaptiniz. 101'e cikarinca 100 baytlik bir bos bolge kalir, 102'ye cikarinca 100 ve 101 baytlik iki bos chunk'unuz olur. Eger 150 bayt isterseniz sistem size en fazla 101 bayt saglayabilir.

    Fakat Linux free edilen bellek bolgelerini kendisi otomatikman birlestirir. Yani Linux'ta memory fragmentation sorunu yasanmaz.

    Bellek yonetiminde (Linux icin) en iyi yontem, alloc cagrilarini mimarinin bellek sayfasi boyu ve katlari seklinde yapmaktir. Bu performansi belirgin sekilde artirir. x86'larin sayfa buyuklugu 4K (4096 byte). Demekki eger prealloc edilmis 4k ve katlarinda bellek kullanirsak en iyi performansi elde ederiz.

    Kisacasi, bahsedilen yontem "tehlikeli" denemez. Elbette iyi bir kullanicinin elinde. Bilhassa stringleri 1 bayt artirip 2 bayt yazmak cok yapilan Ama tavsiye de edilen bir yontem degildir.

    Genel kaide olarak programlarin bir tur garbage collector ve bellek yoneticisi icerecek sekilde yazilmasi en iyisidir. Dahasi bu kolayca her zaman kullanilacak sekilde bir kez yazilabilir.

    Bir kac husus atlaniyor gordugum kadariyla. Kod ici fonksiyonlar ve sonradan eklenen fonksiyonlar arasinda interoperability..

    Eger bir deger programiniza disaridan girmisse, onun dogrulugunu boyunu posunu vs. denetlemek sizin ilk isiniz olmalidir. Bir kutuphane icinde olacak fonksiyon icin aldigi parametreler disaridan alinan bilgilerdir. Bunlarin ASSERT vs. yontemleri ile mutlak kontrolu elzemdir. Ama kendi kodunuz icinde bir fonksiyona deger gecirirseniz ? Bu durumda ya gecirecegeniz degeri alir almaz bir iyice kontrol edeceksiniz, yada en iyisi fonksiyon sanki bir kutuphane fonksiyonu gibi kullanacak, fonksiyon icinde gerekli kontrolleri aksatmayacaksiniz.

    Yapmazsaniz, basiniz cok daha fazla agriyabilir. Kodu yazarken bu kontrolleri yapmak zahmetli gibi gorunebilir. Ama bocek ayiklamanin dikenli yollari cok daha uzun ve diktir vesselam..

    Saygi ve sevgiler..
     
    15 Sep 2003 23:38 EEST tarihinde yazmışsınız:

    > Selam,
    >
    > Tam da libc kılavuzunun yeni çevirdiğim bir konusuna rastgeldiniz.
    > malloc kullanmayın, çok tehlikeli.


  • Next message: Erdinc Taskin: "[linux-programlama] Re: Segfault.."

    ---------

    Bu arsiv hypermail 2.1.6 tarafindan uretilmistir.