Sync/Async Programlama
Bir arayan bir alıcıya mesaj gönderir ve yanıt beklerse, başka bir şey yapabilir mi? Bu çağrılar her yerde olduğu için sunucu/istemci yerine arayan/alıcı diyorum. Tasarım gereği, bilgi işlemi ilk kurduğumuzda her şey senkronizeydi. Bu, arayanın ve sunucunun senkronize veya aynı ritimde olduğu bir sinüs dalgası olarak görülebilir. Asenkron, senkronize olmadıkları anlamına gelir.
Eşzamanlı G/Ç
Arayan, talebi alıcıya gönderir ve ardından bloke eder. Bu, arayanın engellendiği, hiçbir şey yapmadığı ve dolayısıyla toplam zaman kaybı olduğu zamandır. Eski günlerde CPU, sadece engellendiğini düşünerek işlemi işlemciden çıkardı ve engellenmemiş yeni bir işlem ekledi (Bağlam değiştirme). Bu nedenle, arayan kişi bu arada yürütülemez. Son olarak, alıcı yanıt verdiğinde, İşletim sistemi işlemi işlemciye geri koyabilir. Bu nedenle arayanın engellemesi kaldırılır. Bu, istemci ve sunucunun nasıl tamamen senkronize olduğunu gösterir.
İşletim Sistemi Eşzamanlı G/Ç Örneği:
1. Program, CPU'dan diskten bir dosya okumasını ister.
2. Programın ana iş parçacığı CPU'dan çıkarılır.
3. Okuma tamamlanır ve program yeniden çalışmaya başlar.
// A simple Js example
// Program starts
// Programs uses CPU to execute work.
SampleFunction();
// Program reads from the disk
// Program can't do anything until file loads
readfile("SyncExample.dat")
// Program resumes
Özellikle NodeJ'ler açısından konuşursak, Linux'ta epoll kullanır ve pencereler söz konusu olduğunda tamamlayıcı bir yığın kullanır. NodeJ'lerin yaptığı başka bir şey, bir şeyin engelleme işlemi gerektirmesi durumunda bloke eden yeni bir iş parçacığını döndürmektir. Varsayılan olarak, Nodejs libuv kitaplığında G/Ç işlemleri için kullandığı 4 çalışan iş parçacığına sahiptir, ancak yapılandırılabilir.
OS eşzamansız arama örneği (NodeJS)
a) Program ikincil bir iş parçacığını döndürür
b) İkincil iş parçacığı diskten okur. Açıkçası, işletim sistemi mevcut işlemciden kaldırır
c) Ana program hala çalışır ve yürütülür.
d) İş parçacığı biter ve ana iş parçacığını çağırır.
// A simple Javascript example
// Program starts
// Programs uses CPU to execute work.
SampleFunction();
// Program reads from the disk
// Program hapilly moves on to the samplefunction2
readfile("SyncExample.dat", onReadFinish(console.log))
//file is not probably read yet
SampleFunction2();
//onReadFinish function called
// executing it
Şimdi tamamen bir istemci ve sunucu (arka uç) algısından bahsedeceğiz.
Dolayısıyla eşzamanlılık, bekleyebileceği veya ilerleyebileceği bir istemci özelliği olarak da bilinir. Günümüzde hiçbir istemci senkronize değildir ve çoğu kitaplık senkronize değildir. Çoğunlukla müşteri isteği gönderir ve bir yanıt alır ve yanıt yürütülürken bir miktar geri arama yapılır. Bu nedenle, özellikle Node.js'de, yanıtı kontrol eden bir olay döngüsü ana döngüsü vardır.
Bu kafa karıştırıcı olabilir, çünkü birisi bunu gerçek hayattan bu güzel örnekle açıkladığında benim için her zaman olduğu gibi, eşzamanlılığın sunucu yanıt verirse toplantının devam edeceği bir toplantıda soru sormak gibidir. Eşzamansız, bir e-postada, alıcının zamanı geldiğinde yanıtlanabilecek bir soru sormak gibidir.
Eşzamansız arka uç İşleme
Bir arka uç mühendisi olarak, arka ucu eşzamansız yapmaktan bahsetmezsem haksızlık olur. Birçok kod/havuzda, istemci birincil olarak eşzamansızdır, ancak arka uç onu hala bekletmektedir. Bu nedenle, bir müşteri bazı verileri zorlamak istediğinde, diyelim ki bir veritabanı çağrısı yapmak için, çoğu kez arka uçtan yanıt beklemesi istenir, bu da işlemden sonra bir durum 200 yanıtı döndürür. Şimdi, merceği arka uca taşırsak, ön uç asenkrondur, ancak arka uç hala senkronizedir. Peki nasıl anında yanıt veririz?
Çözümlerden biri, kuyruk adı verilen bu güzel veri yapısını kullanmaktır. Bir müşteri bir istek gönderirse, bunu hemen yürütme sözü vermeyeceğiz, ancak onu kuyruğa atacağız. Bunun nedeni, arka uç önceki istekleri tamamlıyor olabilir ve istemci artık engellenmez; isteği kuyruğa aldığımız yanıtını gönderebiliriz ve işte bir söz/JobID. Daha fazla bilgi için mesaj kuyrukları hakkında okuyabilirsiniz .
Kullanım durumuna bağlı olarak bunun dışında çok popüler çözümler var.
Eşzamansız iş yükünün gerçek dünyadan bir örneği:
a) Postgres'te eşzamansız taahhütler ↗ .
b) Linux'ta eşzamansız G/Ç (io-uring).
c) Eşzamansız G/Ç fsync (fs-cache): Herhangi bir dosyaya bir şey yazdığımızda, doğrudan diske değil, dosya sistemi önbelleğine yazılır. İşletim sisteminde bir önbellek vardır ve yazmalar sayfalara gider. Ardından, işletim sistemi tüm sayfaları tek seferde temizler.
Her şeyi şu şekilde özetleyebiliriz:
a) Eşzamanlı programlama yaklaşımı, görevleri sıralı olarak yürütür. Her görev, kendisinden önceki herhangi bir görevin bitmesini bekledikten sonra gerçekleştirilir.
b) Asenkron programlama modelinde bir görev çalıştırıldığında bir öncekinin bitmesini beklemeden diğerine geçebiliriz.
Okuduğunuz için teşekkürler; Umarım yardımcı olmuştur. Herhangi bir şüpheniz olması durumunda, LinkedIn / Instagram
üzerinden bağlantı kurmaktan çekinmeyin .

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































