Olmaz Öyle Concurrency — 2

Selamlar. Bir önceki yazıda data race ve deadlock konularına değinmiştim.
Olmaz Öyle Concurrency — 1 ve Golang
Bu yazıda ise gündem livelock ve starvation konuları olacak. Umarım hatasızca bu konuyu size aktarabilirim. Bunlara ben de yeni çalışıyorum ancak anladıkça size aktarıyorum. Hadi başlayalım.
Livelock Nedir? Nasıl Oluşur ve Ne Yapmalıyız?

Livelock’ı anlamak için gerçek dünyadan bir örnek vererek konuya başlayabiliriz.
Acele bir şekilde kaldırımda yürüyen 2 insan düşünün. Bu 2 insan birbirlerinin yollarında gittiklerini fark ettikleri anda, birisi yolunu değiştirir ancak diğeri de değiştirir. Yani aslında hiçbir şey olmuyor fakat yine de bir şeyler yapmaya çalışıyorlar. Böylelikle, ne ilk insan ne de diğer insan bir yere gidemiyorlar.
Aslında olan şey bir deadlock’tan kaçış iken, livelock’a yani deadlock olmayan ancak bir şey de yapmayan bir durum.
Daha teknik örnek verecek olursak da iki ya da fazla process düşünelim. Bunlar p1 ve p2 olsunlar. p1 process’i, p2 process’inin state’ini değiştirirken, p2 process’i ise p1 process’inin state’ini değiştirir. Ve başka da bir şey yapamamış olurlar.
Bakıldığında deadlock ve livelock benzer olarak hiçbir şey yapmıyorlar. Ancak, deadlock yaşandığı anda processlerin tamamı takılır ve state dahil herhangi bir değişiklik gerçekleşmez. Livelock ise sürekli olarak birbirinin state’ini değiştiren process’leri bize sunar.
State değişikliği pozitif bir durum gibi karşımıza çıksa da, bu değişiklik herhangi bir ek işlem yapmayacağı için, boş yere harcanan kaynak harici bize bir süreç sunmaz. Bu kadar teorik bilgiyi bir de kod örneği ile anlamaya çalışalım. (Anlaşılabilmesi için çoğu şeyi Türkçe yazmaya çalıştım)
Yukarıdaki kodun çıktısı şöyle olacak ve sürekli şekilde devam edecektir.
Bir şeyler yanlış gidiyor gibi değil mi? Bu işlemi gelin şöyle çözmeye çalışalım.
- satırda yer alan deger1 ve deger2'yi doğru konumlandırır yani birbirlerinin yollarına çıkartmaz isek, sistemin doğru çalışmasını sağlarız.
Normalde sistem yukarıdaki gibi çalışırdı. İlk örnekteki hatalı koda bakarsak da sistem aslında hiçbir şey yapmıyor ancak yine de kaynak tüketiyordu. Böylelikle efektif bir kaynak kullanımını da sağlamış olduk.
Starvation Nedir, Nasıl Oluşur ve Nasıl Engelleriz?
Starvation, bir process’in ihtiyacı olduğu kaynaklara erişimemesi problemidir. Böyle düz bir anlatım sanıyorum çok açıklayıcı olmadı.
Priority scheduling algoritması problemlerinden birisidir. Eğer, doğru tasarlanan bir sistem yok ise düşük önceliğe sahip processler sürekli olarak tamamlanmayı bekler. Bunun nedeni yeni gelen yüksek öncelikli processlerin anında öne geçmesidir.
Örneğin bir devlet dairesinde işiniz var. Kuyruk varken önce müdürün, sonra genel müdürün, sonra bir bürokratın gelmesi ile sürekli geride kalmanız ve işlerinizi halledememeniz buna örnek gösterilebilir.
Starvation problemini aging uygulayarak aşabiliriz. Aging dediğimiz şey ise, belirli bir zaman geçiren processlerin, önceliklerinin arttırılmasıdır.
Starvation deadlock, livelock gibi birçok neden meydana gelebilir. Örnek olarak bir go kodunu şöyle paylaşalım.
Yukarıdaki kod örneği bize pek gerçek dünya örneği olmasa da fikir sunabilir. Bu kod çalıştığında ilk go routine benim makinemde 64 değerine ulaşırken, diğeri 22 değerine ulaşabildi. Örneğe göre ilk goroutine’imiz kaynağı lock ettiği için ve bu esnada ayrıca bir de sleep uyguladığı için, diğer goroutine’e ait işlemleri de blocklamış oluyor. Çözümü, daha adaletli kaynak kullanımını belki şöyle düşünebilirdik
Okuduğunuz için teşekkür ederim.
Bu yazıyla ilgili sorularınızı bana aşağıdaki kaynaklardan ulaşarak sorabilirsiniz;
Bonus
Kaynaklar
- https://www.guru99.com/what-is-livelock-example.html
- https://www.oreilly.com/library/view/concurrency-in-go/9781491941294/ch01.html#callout_an_introduction_to_concurrency_CO4-1
- https://www.baeldung.com/cs/deadlock-livelock-starvation
Wingie / Enuygun’un büyüyen ekibinin bir parçası olmak isterseniz buradan açık pozisyonlarımıza göz atabilirsiniz. Tech ekibimize başvurmak için ise CV’nizi kariyer@enuygun.com’a iletebilirsiniz.