Thread overview
D & Garbage Collector
Dec 16, 2020
elina
Dec 16, 2020
elina
Dec 16, 2020
elina
December 16, 2020

Merhaba, D dilini araştırırken sahip olduğu GC üzerine çok fazla eleştiri aldığını okudum, GC hakkında aklıma takılan bazı şeyler var. Sorularım saçma olabilir, ne kadar araştırdıysam da pek anlayamadım.

  1. D Dili'ndeki GC ne durumda? Güvenilir midir?
  2. D Dili'nde standart kütüphaneler GC ile bağlantılı mı çalışıyor?
  3. D Dili'nde yazdığım bir uygulamada GC'nin ne zaman çalışıp, çalışmadığını nasıl öğrenebilirim? Eğer GC kendiliğinden çalışıyorsa fonksiyonlarda @nogc kullanmadan, GC'yi etkisiz hale getirmenin bir yolu var mıdır?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 16, 2020

Hoşbulduk, Ali hocam. :-)

Alıntı:

>

D'nin GC'si yalnızca bellek ayırırken ve eğer gerek görürse işler:

new anahtar sözcüğü

Dizilerin ~ ve ~= işleçleri

Eşleme tablolarına eleman ekleme

vs.

Bunlar dışında kalan, stdc kütphanesi altında bulunan malloc, calloc, vs. fonksiyonlarını kullandığımızda GC devreye girmeyecektir o zaman, değil mi?

Yanıtlarınız için teşekkür ederim. :-) Bu konuda cidden Google'da ne kadar araştırsam da bir netliğe kavuşturamamıştım. Mike Parker yazılarını okumuştum ancak DConf'u dili biraz daha kavradığımda tamamen izlemeyi düşünüyorum. :-)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 16, 2020

Alıntı:

>

(C'nin malloc ve calloc'unu da kullanabiliyoruz; onların GC ile ilgisi yoktur.)

Alıntı:

>

Kesinlikle kaçınılması gerekiyorsa, en kolayı nogc. :)

Çok teşekkür ederim. :-)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 16, 2020

Hoşgeldin, elina! :)

Alıntı (elina):

>

Merhaba, D dilini araştırırken sahip olduğu GC üzerine çok fazla eleştiri aldığını okudum

Çöp toplayıcı geleneksel olarak performansla ilgili belirsizlik sunar. D'nin yakın olduğu dillerden C ve C++ bu yüzden çöp toplayıcıdan uzak dururlar ve hatta onu kötülerler. :) (Öte yandan, "boehm collector" C ve C++'çı Hans Böhm tarafından yazılmıştır.)

C ve C++ nesnelerin belirli zamanlarda sonlandırılmalarının doğru olduğunu savunur (deterministic destruction) ama bazı karşılaştırmalar çöp toplayıcının daha hızlı olabildiğini göstermiştir. (Bartosz Milewski'nin yazıları bu konuya değinir ama şimdi kaynak aramıyorum. :) Örneğin, belirli bir anda sonlandırılan bir C++ nesnesi her elemanı binlerce elemana sahip binlerce elemanlı vector olabilir ve bir sürü temizlik işlemi ve belleğin tek tek geri verilmesi çöp toplayıcının toplam işleminden yavaş olabilir.)

D'nin benzetildiği Java ve C# çöp toplayıcı kullanırlar ve çöp toplayıcıdan pek şikayet etmezler. Python ve başka bir sürü dil de mutlu mutlu çöp toplayıcı kullanır.

Burada önemli olan, çöp toplayıcının gerçekten yavaşlık getirdiği durumlarda D programcısının bir şey yapıp yapamadığıdır:

  • Senin de söylediğin gibi, nogc çöp toplayıcının kullanılmadığını garanti eder.
  • Gerektiğinde malloc vs. ile kendi bellek yönetimimizi sağlayabiliriz.
  • vs.

Bunlara rağmen, D'nin çöp toplayıcısı başka dillerinkiyle karşılaştırıldığında düşük nitelikli olarak kabul edilir. Örneğin, "generational" değildir. Buna rağmen, D runtime bir çöp toplayıcı arayüzü sunar ve kullanıcının kendi çöp toplayıcısını getirmesine izin verir. (Bundan yararlanan proje olduğunu duymadım.)

Yine de, sürekli iyileştiriliyor. Örneğin, bellek tarama işlemi bir iki sene önce "multi-threaded" yapıldı.

Alıntı:

>

Sorularım saçma olabilir

Saçma soru yok. Sohbete devam... :)

Alıntı:

>
  1. D Dili'ndeki GC ne durumda? Güvenilir midir?

Doğru çalışma olarak anlıyorum; evet, bildiğim hatası yok.

Alıntı:

>
  1. D Dili'nde standart kütüphaneler GC ile bağlantılı mı çalışıyor?

Ne yazık ki gereğinden fazla algoritma GC'den yararlanıyor. Bunların sayısı yavaş yavaş azaltılıyor.

Alıntı:

>
  1. D Dili'nde yazdığım bir uygulamada GC'nin ne zaman çalışıp, çalışmadığını nasıl öğrenebilirim?

D'nin GC'si yalnızca bellek ayırırken ve eğer gerek görürse işler:

  • new anahtar sözcüğü
  • Dizilerin ~ ve ~= işleçleri
  • Eşleme tablolarına eleman ekleme
  • vs.

Alıntı:

>

Eğer GC kendiliğinden çalışıyorsa fonksiyonlarda @nogc kullanmadan, GC'yi etkisiz hale getirmenin bir yolu var mıdır?

GC'nin istenmeyen taraflarından birisi, bir insanla etkileşirken programın "tutukluk yaptığının" hissedilmesidir. Bunun önüne geçmek için iki seçeneğimiz var:

  • Çöp toplayıcı programın bazı noktalarında GC.disable ve GC.enable ile etkisizleştirilebilir ve tekrar etkinleştirilebilir.

  • GC.collect, çöp toplayıcıyı işletir ve izleyen işlemler sırasında kendi kafasına göre devreye girme olasılığını azaltır.

Ben işimde kullandığım programlarda bellek ayırmanın yavaşlığından haberli olmak dışında pek özel bir şey yapmıyorum. İki programın çöp toplama için ne kadar zaman harcadıklarını şurada gösterdim:

https://youtu.be/dRORNQIB2wA?t=672

Benim programımda kabaca en fazla 50ms...

Mike Parker'ın GC yazı dizisi bu konuda yararlı olabilir:

https://dlang.org/blog/the-gc-series/

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 16, 2020

malloc/calloc karışıklığa neden olabilir çünkü aynı isimdeki işlevleri hem C'den biliyoruz hem de GC'den: https://dlang.org/library/core/memory/gc.html sayfasındaki malloc ve calloc GC'yi kullanır. (C'nin malloc ve calloc'unu da kullanabiliyoruz; onların GC ile ilgisi yoktur.)

Kesinlikle kaçınılması gerekiyorsa, en kolayı nogc. :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]