Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Go çalışma zamanı kanal işlemlerini dahili olarak nasıl yönetir?


Go çalışma zamanı kanal işlemlerini dahili olarak nasıl yönetir?


Go çalışma zamanı, goroutinler arasındaki veri akışını yönetmek için veri yapıları ve algoritmaların bir kombinasyonunu kullanarak kanal işlemlerini dahili olarak yönetir. Go çalışma zamanının kanal işlemlerini nasıl yönettiğine ilişkin üst düzey bir genel bakış burada verilmiştir:

1. Kanal Oluşturma:

- Arabelleğe Alınmış Kanallar: Arabelleğe alınmış bir kanal oluşturulduğunda Go çalışma zamanı, verileri depolamak için bir arabellek ayırır. Tampon boyutu kanalın kapasitesine göre belirlenir.
- Arabelleğe Alınmamış Kanallar: Arabelleğe alınmamış bir kanal oluşturulduğunda, Go çalışma zamanı bir arabellek ayırmaz. Bunun yerine, veri akışını yönetmek için "gönderme kuyruğu" adı verilen özel bir veri yapısı kullanır.

2. Gönderme İşlemleri:

- Gönderme Kuyruğu: Bir goroutine arabelleksiz bir kanala veri gönderdiğinde, Go çalışma zamanı verileri gönderme kuyruğuna ekler.
- Arabelleğe Alınmış Kanallar: Bir goroutine, ara belleğe alınmış bir kanala veri gönderdiğinde, Go çalışma zamanı, verileri ara belleğe ekler.

3. Alma İşlemleri:

- Alma Kuyruğu: Bir goroutine arabelleğe alınmamış bir kanaldan veri aldığında, Go çalışma zamanı, verileri gönderme kuyruğundan kaldırır ve alma kuyruğuna ekler.
- Arabelleğe Alınmış Kanallar: Bir goroutine ara belleğe alınmış bir kanaldan veri aldığında Go çalışma zamanı, verileri arabellekten kaldırır.

4. Kanal Kapanışı:

- Kanalın Kapatılması: Bir kanal kapatıldığında Go çalışma zamanı, kanalın kapalı olduğunu belirten bir işaret ayarlar.
- Kapalı Kanaldan Alma: Bir goroutine kapalı bir kanaldan veri aldığında Go çalışma zamanı, kanalın türü için "sıfır değeri" adı verilen özel bir değer döndürür.

5. Kanal Ara Bellek Yönetimi:

- Arabellek Yönetimi: Go çalışma zamanı, gerektiğinde belleği ayırıp serbest bırakarak ara belleğe alınmış bir kanalın arabelleğini yönetir.
- Arabellek Büyümesi: Arabelleğe alınmış bir kanalın arabelleği dolduğunda, Go çalışma zamanı arabellek boyutunu artırmak için daha fazla bellek ayırır.

6. Kanal Seçimi:

- Seçim İfadesi: Go çalışma zamanı, select ifadesini yönetmek için "seçim kuyruğu" adı verilen özel bir veri yapısı kullanır.
- Seçme İşlemi: Bir goroutine bir seçme ifadesini yürüttüğünde, Go çalışma zamanı hangi kanaldan alınacağını belirlemek için seçme kuyruğunu kontrol eder.

7. Kanal Zaman Aşımı:

- Zaman Aşımı: Go çalışma zamanı, zaman aşımı işlemini yönetmek için "zaman aşımı kuyruğu" adı verilen özel bir veri yapısı kullanır.
- Zaman Aşımı İşlemi: Bir goroutine bir zaman aşımı işlemi yürüttüğünde, Go çalışma zamanı, zaman aşımının oluşup oluşmadığını belirlemek için zaman aşımı kuyruğunu kontrol eder.

8. Kanal Hatalarının Giderilmesi:

- Hata İşleme: Go çalışma zamanı, hata işleme işlemini yönetmek için "hata kuyruğu" adı verilen özel bir veri yapısı kullanır.
- Hata İşlemi: Bir goroutine bir hata işlemi yürüttüğünde Go çalışma zamanı, bir hatanın oluşup oluşmadığını belirlemek için hata kuyruğunu kontrol eder.

Bunlar Go çalışma zamanının kanal işlemlerini dahili olarak yürütmesinin ana yollarıdır. Go çalışma zamanı, goroutinler arasındaki veri akışını yönetmek için veri yapıları ve algoritmaların bir kombinasyonunu kullanarak goroutinler arasında verimli ve güvenli iletişim sağlar.

Alıntılar:
[1] https://www.freecodecamp.org/news/how-to-handle-concurrency-in-go/
[2] https://www.bradcypert.com/go-channels/
[3] https://blog.devtrovert.com/p/go-channels-explained-more-than-just
[4] https://github.com/golang/go/blob/master/src/runtime/chan.go
[5] https://go101.org/article/channel.html