Forum: Ders Arası RSS
Çöp toplayıcı hakkında
zafer #1
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Çöp toplayıcı hakkında
Merhaba,

Şu çöp toplayıcı olayına takıldım, bilmiyorum belkide hiç anlamadım. Öncelikle bu çöp toplayıcı nerededir, ne zaman ve nasıl çalışır, Kim ve niçin çalıştırır. D ortamı kurulu olmayan bir sistemde D ile oluşturduğumuz program çalıştığında çöp toplayıcıyı kim nereden çağırır, nerede nasıl kurar ??

Kısaca bu çöp toplayıcının hayat döngüsü nedir?
https://github.com/zafer06 - depo
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
zafer:
Öncelikle bu çöp toplayıcı nerededir

Çöp toplayıcı her D programa otomatik olarak bağlanan ve "D runtime" denen çalışma zamanı ortamının parçasıdır. D'de kullandığımız ve açıkça new ile oluşturmadığımız nesneler druntime tarafından otomatik olarak oluşturulurlar.

    int[] d = [ 1, 2, 3 ];

O dizinin elemanları çöp toplayıcıya aittirler. Ama tabii d dizisi yaşadığı sürece onlar yok olmazlar.

ne zaman ve nasıl çalışır, Kim ve niçin çalıştırır.

Onun algoritmasının ayrıntılarını bilmiyorum ama genelde çöp toplayıcının belleğı azalmaya başlayınca (veya belirli aralıklarla) "bir temizlik yapalım" denir ve artık referansı bulunmayan bellek bölgelerindeki nesneler sonlandırılırlar ve yaşadıkları bellekler daha sonradan başka nesneler için kullanılmak üzere geri alınır.

Bu C++'tan gelenlere çok garip gelen bir durumdur. (Bakınız ben! :)) C++'ta sonlandırıcı işlevin hangi an işletileceği bellidir. D'de ise ileride belirsiz bir zamanda işletilir. Hatta işletileceğinin garantisi bile yoktur.

D ortamı kurulu olmayan bir sistemde D ile oluşturduğumuz program çalıştığında çöp toplayıcıyı kim nereden çağırır, nerede nasıl kurar ??

D, Java veya .Net gibi bir ortamla gelmez. Aslında çalışma ortamı var diyoruz ama öteki diller gibi bir sanal makine değildir. Yani her programın çöp toplayıcısı kendi içindedir.

Aslında D kurulduğunda da yalnızca dmd ve yan programları kuruluyor. Sürekli işleyen bir ortam yok. dmd'nin işi bittiğinde program işlemeye hazırdır. (Tabii .so veya .dll kütüphaneleri kullanıyorsa o zaman onların da mevcut olmaları gerekir.)

Kısaca bu çöp toplayıcının hayat döngüsü nedir?

Şurada biraz bilgi var:

  http://ddili.org/ders/d/bellek_yonetimi.html

Hataları ve eksikleri bildiriniz! :)

Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Çöp toplayıcı defragment yapıyor mu?

Yani uzun süre çalışan bir uygulama düşünün. Zaman zaman yeni sınıflar meydana getirilip işleri bitince imha ediliyor. Elbette çöp toplayıcı her zaman değil, gerektiği zaman artık kullanılmayan belleği OS'e emanet ediyor.

İşte bu aşamada kim yapıyorsa belleğin parçalanması işletim sisteminin sorumluluğunda mı? Yoksa GC, bir sınıf bellek talep ettiğinde, toplam talep edilen kapasite kadar bellekte boş bir alan mı arıyor? Belki de arama işlemini GC yapmıyor, OS'a bırakılıyor olabilir mi?

Son biri soru...

Belleği daha verimli kullanmak için, örneğin bir dizinin elemanlarını boş olan yerler ile mi ilişkilendirlir. Yoksa işlemciyi daha etkin kullanmak için dizi boyutu kadar bir boş yer mi aranır?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Çöp toplayıcı defragment yapıyor mu?

D bu konuda bir kısıtlama getirmiyor. Kullanılan çöp toplayıcıya bağlı bir konu. dmd'nin çöp toplayıcısı Java'nın ilk zamanlarındakine benzeyen ilkel bir çöp toplayıcı ama DConf 2013'te çöp toplayıcı üzerine iki konuşma var:

  http://dconf.org/talks/lucarella.html

  http://dconf.org/talks/schuetze.html

Yakında bu konuda gelişme bekleyebiliriz.

İşte bu aşamada kim yapıyorsa belleğin parçalanması işletim sisteminin sorumluluğunda mı? Yoksa GC, bir sınıf bellek talep ettiğinde, toplam talep edilen kapasite kadar bellekte boş bir alan mı arıyor?

Tam emin değilim ama bildiğim kadarıyla şöyle: Programın çöp toplayıcısı işletim sisteminden bir miktar bellek istiyor ve alıyor. O noktadan sonra işletim sisteminin o bellekle hiçbir işi kalmıyor. Çöp toplayıcı orayı istediği gibi kullanıyor. Pool allocator'ların yaptığı gibi, o belleğin bölümlerini nesne büyüklüklerine göre kullanabilir: En küçük olanlar şuraya, biraz daha büyük olanlar buraya, vs.

Belki de arama işlemini GC yapmıyor, OS'a bırakılıyor olabilir mi?

Her ikisi de arama yapıyor. İşletim sistemi çöp toplayıcının istediği kocaman alanı arıyor; çöp toplayıcı da programın istediği büyüklükler için o bellekte kendisi arıyor.

Belleği daha verimli kullanmak için, örneğin bir dizinin elemanlarını boş olan yerler ile mi ilişkilendirlir. Yoksa işlemciyi daha etkin kullanmak için dizi boyutu kadar bir boş yer mi aranır?

Soruyu anlamadım ama şu gerçek bozulamaz: Bir dizinin elemanları bellekte yan yana bulunmak zorundadırlar: Onuncu eleman, birinci elemanın adresinden 10 eleman ötededir. Buna göre, dizinin boyu büyüdükçe bütün elemanların sığacağı kadar yeni bir yer edinilir ve elemanlar oraya kopyalanır. Bu aşamanın tam olarak nasıl işlediğini biliyoruz:

  http://ddili.org/makale/d_dilimleri.html

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-19, 07:59:16 (UTC -08:00)