Middle+
Goroutine'ler nasıl yapılandırılmıştır ve yığın içinde ne kadar bellek kaplarlar?
sobes.tech yapay zeka
AI'dan gelen yanıt
Goroutine, Go çalışma ortamı tarafından yönetilen hafif bir yürütme akışıdır. İşletim sistemi ipliklerinden farklı olarak, goroutine'ler daha az sayıda işletim sistemi ipliğine çoklanır. Bu, daha iyi ölçeklenebilirlik sağlar.
Anahtar noktalar:
- Planlayıcı (Scheduler): Go çalışma ortamı kendi planlayıcısına (M:N planlayıcı) sahiptir ve goroutine'leri (M) sınırlı sayıda işletim sistemi ipliği (N) üzerinde yönetir.
- Bellek Yöneticisi (Memory Manager): Goroutine'lerin yığınlarını ve büyüme/küçülme işlemlerini yönetir.
- İletişim: Goroutine'ler kanallar aracılığıyla iletişim kurar, bu da çoğu durumda kilitlenmeler/mutual excluder olmadan güvenli veri alışverişi sağlar.
Goroutine'un yığını:
- Başlangıçta, goroutine'lerin yığınları küçüktür, genellikle 2 KB (Go 1.4 öncesinde 4 KB).
- Yığın büyüyen ve küçülen dinamik bir yapıya sahiptir. Taşma durumunda otomatik genişler, serbest bırakıldığında küçülür.
- Bu dinamik yığın yönetimi, işletim sistemi ipliklerine göre daha düşük maliyet sağlar.
Yığında kullanılan bellek:
- Bir goroutine oluşturulduğunda, genellikle 2 KB bellek kullanır.
- Bellek kullanımı, fonksiyon çağrılarıyla dinamik olarak artabilir ve geri dönüşle azalabilir.
- Maksimum yığın boyutu sınırlıdır, ancak çoğu görev için yeterince büyüktür (genellikle birkaç MB).
package main
import (
"fmt"
"runtime"
"time"
)
func sayHello() {
fmt.Println("Goroutine'den merhaba!")
}
func main() {
// Goroutine oluşturmanın gösterimi
go sayHello()
// Goroutine'nin çalışmasını gözlemlemek için
time.Sleep(100 * time.Millisecond)
fmt.Printf("Goroutine sayısı: %d\n", runtime.NumGoroutine())
}
Bu örnekte, sayHello ayrı bir goroutine olarak çalıştırılır. runtime.NumGoroutine() aktif goroutine sayısını (ana goroutine dahil) gösterir.