Thread overview
Fiber'ın Türkçesi
Apr 16, 2015
agora
Dec 09, 2017
Salih Dinçer
Dec 16, 2017
kerdemdemir
Jan 08, 2018
Salih Dinçer
April 10, 2015

Kitaba Fiber bölümünü ekliyorum. Türkçe'de yine Fiber mi diyeyim?

Konunun Wikipedia sayfası:

http://en.wikipedia.org/wiki/Fiber_%28computer_science%29

D'deki kullanımı:

http://dlang.org/phobos/core_thread.html#.Fiber

Ali

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

April 16, 2015

Hocam eklemediyseniz nerelerde kullanmaliyiz. Nasil bir is gorur. Aciklama sansiniz var mi?

Fiber olarak eklenmesi daha uygun bence.

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

April 16, 2015

Açıklamak isterdim ama şu sıralar fazla zaman bulamıyorum. Hem konuyu da biraz daha toparlamış olmak istiyorum.

Ama aslında çok basit bir konu: Normalde her iş parçacığı (thread) için tek adet bulunan çağrı yığıtından (call stack (ben "program yığıtı" da diyordum)) birden fazla bulunmasını sağlıyor.

Multi-threading (birden fazla iş parçacığı) ile değil, multi-tasking (birden fazla görev) ile ilgili.

Aşağıdaki programın tek ve ana iş parçacığı (yani, main() ile başlayan iş parçacığı) hangi noktada işlemekte olduğunu otomatik olarak yönetilen çağrı yığıtı sayesinde bilir:

void main()
{
   int a;
   int b;

   int c = foo(a, b);
}

int foo(int x, int y)
{
   bar(x + y);
   return 42;
}

void bar(int param)
{
   string[] arr;
   // ...
}

main foo'yu, foo da bar'ı çağırdığında çağrı yığıtında bu üç işlevin yerel bilgileri (yerel değişkenler, parametreler, vs. gibi yaşam süreçleri otomatik olarak yönetilen değişkenler) kavramsal olarak üst üste tutulur:
'
Çağrı yığıtı kavramsal olarak ▲ ▲
yukarıya doğru büyür. | |

        yığıtın üstü → +--------------+
                       | int param    | ← bar'ın yerel bilgisi
                       | string[] arr |
                       +--------------+
                       | int x        |
                       | int y        | ← foo'nun yerel bilgisi
                       | return value |
                       +--------------+
                       | int a        |
                       | int b        | ← main'in yerel bilgisi
                       | int c        |
        yığıtın dibi → +--------------+

'
bar'dan dönüldüğünde yığıt kısalır ve artık yalnızca main'in ve foo'nun bilgileri vardır.

Fiberler (fiber, coroutines, green threads, vs.) bundan birden fazla bulunmasını sağlar çünkü her fiber kendi çağrı yığıtı bulunan bir işçiktir :).

Kullanım örneklerinden en tanınmış olanı, same fringe problem olarak biliniyor: Elimizde iki adet sıralı ağaç (binary search tree) bulunsun. Bunların saçak elemanları (fringe'leri), yalnızca en dipteki elemanlardır; yani, ağacın üst tarafındaki düğümlerdeki elemanlarla ilgilenmiyoruz. Yalnızca en aşağıdaki ve kendilerinden başka dal çıkmayan elemanlara bakıyoruz. Eğer verilen iki ağacın saçak elemanları aynı sırada ve aynı değerde ise bunların aynı saçağa (same fringe) sahip olduğu söylenir.

Bu algoritmayı nasıl yazarsınız? Tabii, olabildiğince hızlı olmak da istiyoruz: Örneğin, her ağacı ayrı ayrı gezip saçakları bir dizide toplayıp sonra dizileri karşılaştırmak istemiyoruz çünkü o zaman N + M adet işlem yapmış oluruz. Oysa, belki de ilk saçak elemanlarının farklı olduğu bir durumdayızdır. O zaman hemen "saçakları eşit değil" diyebilmek isteriz.

Algoritmanın zorluğu, birden fazla ağacın aynı anda ilerlenmesinin gerekiyor olması. İşin garibi, tek ağacın saçaklarını gezmek çok kolay çünkü ağaçlar özyinelemeli veri yapıları olduklarından özyinelemeli algoritmalara çok uygundurlar. Örneğin, şu ağacın üye işlevlerinin güzelliğine bakın. :) ekle(), yazdır(), ve saçakları() hep özyinelemeli olarak yazılabilmişler:

(Program dmd 2.067 gerektiriyor çünkü std.algorithm.each'i kullandım: map gibidir ama her elemana karşılık yeni bir değer üretmek yerine her elemana karşılık bir yan etki üretmek için kullanılır.)

import std.stdio;
import std.string;
import std.conv;
import std.random;
import std.range;
import std.algorithm;

struct Düğüm
{
   int eleman;
   Düğüm * sol;    // Sol alt ağaç
   Düğüm * sağ;    // Sağ alt ağaç

   void ekle(int eleman)
   {
       if (eleman < this.eleman) {
           ekleVeyaKur(sol, eleman);

       } else if (eleman > this.eleman) {
           ekleVeyaKur(sağ, eleman);

       } else {
           throw new Exception(
               format("%s zaten mevcut", eleman));
       }
   }

   void yazdır() const
   {
       /* Önce sol alt ağaçtaki elemanlar */
       if (sol) {
           sol.yazdır();
           write(' ');
       }

       /* Sonra bu düğümün elemanı */
       write(eleman);

       /* En sonunda da sağ alt ağaçtaki elemanlar */
       if (sağ) {
           write(' ');
           sağ.yazdır();
       }
   }

   void saçaklarıEkle(ref int[] saçaklar) const
   {
       if (!sol && !sağ) {
           saçaklar ~= eleman;

       } else {
           if (sol) {
               sol.saçaklarıEkle(saçaklar);
           }

           if (sağ) {
               sağ.saçaklarıEkle(saçaklar);
           }
       }
   }
}

/* Elemanı bu alt ağaca ekler; 'null' ise düğümü ilkler. */
void ekleVeyaKur(ref Düğüm * düğüm, int eleman)
{
   if (düğüm is null) {
       /* Bu alt ağacın ilk elemanını ekliyoruz. */
       düğüm = new Düğüm(eleman);

   } else {
       düğüm.ekle(eleman);
   }
}

struct Ağaç
{
   Düğüm * kök;

   void ekle(int eleman)
   {
       ekleVeyaKur(kök, eleman);
   }

   void yazdır() const
   {
       if (kök) {
           kök.yazdır();
       }
   }

   int[] saçaklar() const
   {
       int[] saçaklar;

       if (kök) {
           kök.saçaklarıEkle(saçaklar);
       }

       return saçaklar;
   }
}

/* Ağacı (n * 2) adet sayı arasından seçilen 'n' adet rasgele
* elemanla doldurur. */
Ağaç rasgeleAğaç(size_t n)
{
   /* (n * 2) sayı arasından n adet seç. */
   auto sayılar = iota((n * 2).to!int)
                  .randomSample(n, Random(unpredictableSeed))
                  .array;

   /* Karıştır. */
   randomShuffle(sayılar);

   /* O sayıları içeren bir ağaç yap. */
   auto ağaç = Ağaç();
   sayılar.each!(e => ağaç.ekle(e));

   return ağaç;
}

void main()
{
   auto ağaç = rasgeleAğaç(10);
   ağaç.yazdır();
   writeln();

   auto saçaklar = ağaç.saçaklar();
   writefln("Saçakları: %s", saçaklar);
}

Şimdi iki ağaç yapın ve saçak elemanlarının aynı olup olmadıklarını olabildiği kadar kısa sürede bildirin. Örneğin, her iki ağacı ilk saçağa kadar ilerletin ve eşit değillerse işinizi bitirin.

Fiberlerin nasıl yararlı olduğunu sonra göstereceğim.

Ali

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

April 22, 2015

İngilizce kitabın Fibers bölümünün ilk taslağı hazır:

http://ddili.org/ders/d.en/fibers.html

O sayfa henüz hiçbir yere bağlı değil, tek başına duruyor.

Bitirince Türkçesini de paylaşacağım.

Ali

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

April 30, 2015

Türkçesi'nin de ilk taslağı hazır:

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

Dediğim gibi, henüz kitabın başka bölümlerine bağlı değil.

Ali

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

December 10, 2017

Bu olanak BitCoin algoritmalarında kullanılabilir mi?

Yoksa sadece SHA algoritması dolayısıyla işlemci gücü ile alakalı bir durum mudur?

http://www.trustnodes.com/wp-content/uploads/2017/10/some-random-algorithm-1175x500.png
Kaynak: http://www.trustnodes.com/2017/10/30/bitcoin-cash-adjust-difficulty-algorithm-two-weeks

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

December 10, 2017

İyi bilmiyorum ama sanırım işlem gücüyle ilgili. O yüzden fiberların özellikle yarar getireceğini sanmıyorum.

Ali

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

December 16, 2017

Selam Salih Hocam,

Mining işlerinde CPU değil GPU kullanılır. CPU ile mine yapmaya çalışırsanız ödeyiceğiniz elektrik parası mining'den kazanıcağınız miktarı geçer. Fiberlar CPU için tasarlanmıştır. Bu nedenle bitcoin mining işlemlerinde fiberların yeri olucağını düşünmüyorum.

Ben son 1-2 aydır ne yazıkki open-source yapamıyacağım bir digital para alım-satımı projesi üstünde çalışıyorum. Bol bol web-request'leri yapmam gerekiyor, vibe-d platformunu ve dolayısıyla bu platformda asenkronluğu sağlayan fiberları çok sık kullanıyorum. Ve çok başarılı buluyorum.

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

January 08, 2018

Evet, GPU'lar kullanıldığını Donanımcı Baba'dan öğrenmiştim. Ben de şu sıralar Bubble sistemi üzerine çalışıyorum. Bir ara Ali hocam bahsetmişti sanırım. Yani sıralama algoritması değil bir tür yazılım için haberleşme. Bubble Messaging mi desek ne :)

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