• i/o tabanlı (disk, ağ vs) işlemleri yaparken tek bir thread'in o işlemin sonucunu beklemekle uğraşmadan başka işler yapmasını sağlayan programlama modelidir.

    paralel programlamadan farklıdır. paralel programlama i/o mi/o ayırdetmeden her şeyi paralel çalıştırmaya çalışır. bu yüzden de paralel yapılacak işler için fazladan thread gerekir. işlemcide thread sayısına yetecek kadar çekirdek yoksa bu sefer aynı çekirdek birden fazla thread arasında geçiş yapmak zorunda kalır performansı olumsuz etkiler.

    asenkron programlama ise i/o'nun en güzel özelliği olan "aygıtın zaten o sırada işi kendi başlına yapması" mantığından istifade eder. mesela siz diskten bişey okuyacaksınız, bir kere diske "abi şuraları bana oku" dersiniz sonra disk ilgili içeriği dma üzerinden hafızaya kendisi taşır, işi bitince sana bir interrupt yollar. ağdan bir şey okumak da aynı şekilde. ethernet kartı tcp bağlantısını kurar buffer'ları verdiğin yerlere yerleştirir, tcp stack gelen interrupt'ları değerlendirir o kadar.

    yani en çok zaman harcanan kısım olan ağdan ya da diskten bir şeyler okuyup yazma esnasında aslında bir cpu'ya ihtiyaç neredeyse hiç yoktur. asenkron programlama da bundan istifade eder ve der ki "abi sen onu oku, bittiğinde benim kodun kalanını çalıştırırsın o arada benim bu thread'e ihtiyacım yok" mesajını verir. alt tarafta da işletim sistemi başka işlemleri aynı thread'i kullanarak çalıştırabilme şansı elde eder.

    böylece sizin ağdan 10 tane isteği aynı anda yollayıp sonuçlarını aynı anda çekmek için 10 tane thread'e ihtiyacınız olmaz. tek bir thread bütün istekleri tcp stack'e iletir, tcp stack paketleri yollar, sonuçları gelene kadar beklemek gereken kısımda sizin thread'inizi başka işler çalıştırmak için kullanır.

    özellikle sunucu tarafındaki yazılımlarda veritabanı erişimi ya disk ya da ağ üzerinden transfer gerektirdiğinden web sunucularındaki performansa katkısı harikuladedir. tek thread'li web server bile yaparsın o derece.

    modern işletim sistemlerinin tamamı bu programlama modelini destekler ama her çağrı için yeni callback function belirlemek gibi hammaliyesi olduğundan külfetlidir. c# 5.0 ve javascript'teki promises gibi yeni standartlar asenkron programlayı kolaylaştıran yapılar sunarlar.

    (bkz: asenkron i/o)
14 entry daha
hesabın var mı? giriş yap