Onur Dayıbaşı

CV
none

Non-Blocking I/O Nedir?

I/O nasıl çalışıyor ? Aşağıdaki resimde ortada Process/Thread yazan kısımda bir kişinin oturduğunu önünde ve arkasında bir kova olduğunu düşünelim.

Process/Thread Input → Output üretmesi

Öncelikle önündeki kovanın dolmasını bekliyor. Önündeki kova dolduktan sonra bu kovayı arkasındaki kovaya boşaltarak önündeki kovanın boşalmasını sağlıyor. Bu sırayı uzatarak arka arkaya başka kişiler ve kovalar ekleyerek bu süreci uzatabiliriz. Sonuçta kişi önündeki kovanın hızlı dolması durumunda az bekleyecek, uzun dolması durumunda çok bekleyecek.

Multiple Process

Sunucuların şekilde görüldüğü gibi çalıştığını düşünürsek. 20 istemci için 20 kişi kovaların dolmasını beklemesi gerekmektedir. Bunun yerine öndeki bir kişinin kovaların önünde gezmesi ve dolan kovaları arkadaki kovaları boşaltması 20 kişinin boşta çalışmasını önleyecektir.

Single Process

JVM üzerinde Non-Blocking I/O destekleyen MINA ve Netty gibi network kütüphaneleri bulunmaktadır . Bu network kütüphanelerini kullanan daha üst seviye Play(Akka), Vertx, Reactor, Finangle gibi framework’ler bulunmaktadır.

Servlet’ de bu yapıyı desteklemesi için Servlet 3’de NIO Blocking desteği eklenmiştir. İstekleri saklayabileceğiniz bir AsyncContext mevcuttur. Gelen istekler işleninceye kadar bellekteki kuyruğa atılır. Ve tanımladığınız Thread’ ler bu istekleri kuyruktan çekerek işler. Bu sayede istek ne kadar çok olursa olsun Thread sayınızı sabit tutmanız mümkündür.

Browser-Server-App

Bu konuda son dönemde popüler olan ortamlardan biriside Node.js dir. Chrome Browser Google tarafından Safari Webkit Engine forklanarak oluşturulmuş bir tarayıcıdır. Webkit Rendering engine iken, JS kodlarını işlemek için V8Engine kullanılmaktadır. V8 Engine JS kodlarını Event-Driven yönteminde, çok hızlı bir şekilde C++ kodlarına dönüştürerek farklı işletim ve donanımlar üzerinde çalışmasını sağlamaktadır.

Joyent firması’ da V8Engine JS motorunu tarayıcılarda değilde sunucularda kullanılabileceklerini düşünmüşler ve bunun üzerine sunucu kütüphaneleri Node.js ortamına taşıyarak Asenkron, Event-Driven ve Javascript ile kod yazılabilen bir ortam oluşturmuşlardır.

Node.js tüm yapı event ve callback ler üzerine kurgulanmıştır. Bir fonksiyon oluşturulup EventLoop atılır. Callback fonksiyonu çağrılması beklenir. Bundan dolayı normal senkron programlama yönteminden farklı bir şekilde düşünmeniz gerekmektedir. Çünkü bir alt satır çalıştığında üstteki satırın çalışıp çalışmadığı belli değildir.

Aşağıda görüldüğü gibi EventLoop yani işi yöneten kodunuzun ilerlediği kısım single thread çalışmakta ama diğer Worker iş atayıp, asenkron olarak işine devam edebiliyor. Bu sayede I/O bloklaması yaşamadan programı işletmeye devam ediyor.

Node.JS Processing Model

Referanslar