Bu yazıda; Türkçemize Wikipedia‘da “Makarna yiyen düşünürler sorunu”, E-bergi‘de ise “Yemek Yiyen Filozoflar Problemi” olarak çevrilen, fakat bence adı “Yemek Yiyemeyen Filozoflar Sorunu” olması gerektiğini düşündüğüm; “Dining philosophers problem” adındaki sorundan bahsedeceğiz.
Bilgisayar mühendisliğinde, bu problem paralellik, eşzamanlılık ve proseslerle ilgili klasik bir sorundur. 1965 yılında, Edsger Dijkstra tarafından önerilmiştir. Ayrıca, kısıtlı kaynakları kullanan işlemlerin birbirini kilitleme riskini gayet güzel anlatan problemdir.
Kısaca sevgili filozoflarımızın sorunu şu: Resimde de görüldüğü gibi, beş tane filozofumuz var. Bu filozoflar ya makarna yiyorlar ya da düşünüyorlar. İki işi aynı anda yapamıyorlar. Masada filozof sayısı kadar tabak ve tabakların arasında birer çatal var. Filozoflar makarnayı tek çatalla yemek zor olduğu için 2 çatalla yiyebiliyorlar. Maalesef her filozofa bir çatal düşüyor ve yemeğe hepsi aynı anda başlıyorlar. Bu yüzden hepsinin elinde birer tane çatal olmasına rağmen, hepsi diğer çatalı bekliyor ve hiçbiri yemek yiyemiyor. Böylece sonsuza kadar aç kalıyorlar!
Önerilen çözümlere bakalım, onlar da şöyle:
Conductor solution
Bu problem masanın yanına bir garson koymakla çözülür. Filozoflar her makarna yemek istediklerinde garsona danışırlar. Garson onlara “Dur bakalım yanındaki yemek yiyor onu bekle!” diye uyarı verir. Böylece garson herkesin eşit bir şekilde yemek yemesini sağlar. Filozoflara bebek muamelesi yapmak gibi bir şey, dadı tutarız hepsine o yedirir.
Resource hierarchy solution
Problemi çatallara numara vererek çözeriz. Filozoflar her zaman düşük numaralı çatalı kullanırlar. En son çatal boş kalır. Böylece sondan bir önceki kişi karnını doyurur ve çatalları yere bırakır. İşte Deathlock’tan korunmuş olduk.
Monitor solution
Probleme başka bir çözüm ise; filozoflar hangi çatal erişilebilir onu monitor aracılığıyla takip ederler. Bu çözüm çatallarla ilgili değildir, burda filozofların makarna yemek ya da düşünmek üzere 2 olayı vardır. Bir filozof komşusu aç iken çatalları almaz. Herkes komşusunun karnını doyurmasını bekler. Unutmayın komşusu aç iken yemek yiyen bizden değildir…
Chandy / Misra solution
1984′te, K. Mani Chandy ve J. Misra bu probleme farklı bir çözüm sunmuşlar. Burda işin içine bir de kirli/temiz çatallar girmiş. Yok filozoflar kullandıkları çatalları önce yıkayıp sonra yanındakilere verecekmiş vs. vs. Sonuçta açlık problemini çözmüşler mi evet!
Bunlar da işte önerilen çözümlerdi. Bu ise benim çözümüm:
Masaya oturan tüm filozofların ilk başta aç olduğunu düşünürsek, ilk önce yaşlıya hürmet gösterip içlerindeki en yaşlı filozof çatalları alıp yemek yemeye başlar. Diğer filozoflarda sağındaki ve solundaki çatalların varlığını kontrol ederek, iki çatalında masada olduğu anda yemek yemeye başlayabilir. Sonuçta en yaşlı filozofta bir şekilde doymak zorunda. Doyan filozoflar çatalları masaya bırakarak diğer filozofların yemek yemeye başlaması için olanak sağlarlar. Bu durumda olayı tek kilitleyecek nokta bir filozofun yanında oturan diğer filozofların aynı anda acıkıp, aynı anda yemek yemeye başlaması olur ki bunda da çatallardan birisinin bırakılması durumunda yemek yiyecek olan filozofun çatallardan birini eline alarak diğerini beklemek olacaktır. Böylece yemek yiyen ve yemek yemeyip düşünen filozoflarımız olacaktır.
Ama sorun şurdaki, gel gelelim filozoflar aç kalmaya devam ediyorlar. Konfiçyüs açlıktan ölmüş diyorlardı doğru mu acaba?
Fakat konu filozoflar yerine yazılımcılar olsaydı… Yemek Yiyen Yazılımcılar Sorunu: Eğer 5 yazılımcı yuvarlak bir masanın etrafında hep beraber kod yazıyor ve yemek yemek istiyorlarsa; pizza veya burgerking sipariş ederler. Al işte problem çözüldü.
O değil de canım makarna çekti ya…