• modern isletim sistemleri hafiza yonetimini paging denen yontemle yapar. bunda hafiza 4kb'lik page'lere bolunuktur, page'ler arka arkaya olsa bile fiziksel hafizada alakasiz yerlere denk gelebilirler. guzel tarafi birden fazla page, fiziksel hafizanin ayni kismini gosterebilir.

    bu avantaj sayesinde isletim sistemleri ayni kod page'i (exe, dll gibin) birden fazla process arasinda paylasiliyorsa tekrar tekrar ayni seyi yukleyecegi yerde page'leri ayni yere gosterecek sekilde ayarlar.

    ama kod denen sey kendini modifiye edebilen ya da yetkisi olan baska kodlar tarafindan modifiye edilebilen bir alet oldugundan bir process'teki kod degistigi anda oldugu yerdeki page veya page'lerin kopyasi cikartilir, yeni kopyaya degisiklikler yazilir, eskisi aynen birakilir. boylece kodun birden fazla kopyasi "ancak" kod kendini degistirirse hafizada olur. o da sadece degisen bolgelerinde olur, geri kalan kisimlari paylasilmaya devam edilir misler gibi.

    "peki isletim sistemi kodun kendini nasil degistirdigini nasil anliyor?" diye sordugunuzu duyar gibi oluyorum. efendim bu page'ler baslangicta read only olarak yuklenir. herhangi bir yazma islemi exception'a sebep olur, isletim sistemi bu exception'i alir vay sen misin oraya yazan der gider kopya cikartir falan isler yapar, page'i read/write'a cevirir sonra hicbir sey olmamis gibi geri doner.

    windows, solaris, linux, mac os x, freebsd bunlarin hepsi bu isi becerir gayet guzel. caktirmazlar.

    (bkz: memory usage)
    (bkz: vm size)
  • upx benzeri programlarla siki$tirilmi$ executable'larda i$e cali$mayan ozellik (malum kod daha ba$ta degi$tiginden).
  • (bkz: btrfs)
  • genel bir kavram olarak "read only" bir bilesen degistirilmeye calistiginda bir kopyasinin alinip degisikligin onun uzerinde yapilmasina verilen isimdir.
  • bunun bir degisik versiyonu daha var. teknik olarak copy-on-read diye bir kavram olmasa da unix tabanlı sistemlerde benzer bir olay mevcut.

    kocaman bir allocation yapıldıgında kernel bu yeni allocate edilmis bellegin bir bolumunu *template* diyebilecegimiz page'lere map ediyor. eger ki kullanıcı os'in "belki kullanılmaz" diye template page'leri map ettigi bu bolgeye erismeye calısırsa exception tetikleniyor ve template page'ler unmap edilip bildigimiz allocation islemi yapılıyor.

    boylece bellek israfından kacınıyoruz ve ayrıca initial allocation template page'ler ile yapılacagı icin kullanıcıya sınırsız allocation yapabilecegi izlenimini veriyoruz.
hesabın var mı? giriş yap