Asenkron Giriş/Çıkış İşlemleri

Senkron ve Asenkron I/O

smnszr
İyi Programlama
4 min readAug 26, 2020

--

I/O işlemleri bir dosya tanımlayıcı üzerinden, Senkron ve Asenkron olarak iki şekilde gerçekleştirilebilir.

Senkron I/O işlemleri; I/O işlemi sürerken CPU çalışmasının durdurulduğu ve işlemin tamamlanmasının beklendiği çalışma şeklidir. Biraz açacak olursak bir I/O çağrısı/isteği gerçekleştiğinde I/O işlemi tamamlanana kadar çağrıyı yapan process bekler. Yani bir sonraki komuta geçildiğinde işlem başarılı yada başarısız şekilde tamamlanmıştır.

Asenkron I/O işlemleri; I/O işleminin CPU çalışmasıyla eş zamanlı olarak devam ettiği çalışma şeklidir. Yani bir I/O çağrısı yapıldığında, işlemin tamamlanması beklenmeden bir sonraki komuta geçilir. Bu noktada I/O işlemi başarılı veya başarısız bir şekilde tamamlanmış, daha tamamlanmamış yada sadece sıraya alınmış olabilir.

Senkron ve Asenkron işlemler sırasında process durumları

Bir çok işletim sistemi I/O işlemilerimi senkron olarak gerçekleştirir. Ancak senkron işlemlerde bekleme süresi belirsizdir. Genel amaçlı sistemlerde (General Purpose Systems) bu model sezgisel ve yeterlidir. Gerçek zamanlı bir ortamda ise I/O işlemi tamamlanana kadar bir process’in askıya alınması Öngörülemezliğe neden olacaktır.Bu durum da determinizmi bozar.

Asenkron I/O

Gerçek zamanlı gereksinimlerini karşılamak, I/O donanımlarını paralel bir şekilde kullanmak, birden fazla I/O işlemini paralel olarak gerçekleştirerek sistem performansını artırmak amacıyla Asenkron I/O işlemleri kullanılabilir. Bunlara ek olarak yoğun bilgi işleme gerektiren işlemlerde, düşük öncelikli günlük kayıt gerektiren uygulamalarda, yüksek hacimli yada yüksek hız gerektiren veri işlemlerinde asenkron özellik kullanışlı olmaktadır.

Posix bu işlemleri gerçekleyebilmek için P1003.1b kapsamında bir dizi fonksiyon ve yapı tanımlamıştır. (P1003.1b gerçek zamanlı uygulamalar için kullanılan fonksiyonların bir kümesi olarak düşünülebilir.) Bu bağlamda P1003.1b asenkron I/O fonksiyonları Posix uygulamalarında I/O işlemleri için gerçek zamanlılık gereksinimini karşılamaya yardımcı olacaktır.

Asenkron I/O işlemleri açık bir dosya tanımlayıcısı üzerinden gerçekleştirilir.

Asenkron I/O Veri Yapısı

Posix uygulamalarında tüm asenkron I/O işlemleri asynchronous I/O control block (aiocb) veri yapısı kullanılarak gerçekleştirilir. Bu yapı içerisinde aşağıdaki değişkenleri taşımaktadır.

Konum Belirleme

aio_read yada aio_write fonksiyonlarından birini çağrıyorsak; yazılacak yada okunacak verinin konumunun belirlenmesi gerekir. Bunun için aşağıdaki değişkenler kullanılır.

  • aio_offset: başlangıç noktası
  • aio_nbytes: verinin boyutu
  • aio_buf: okunan yada yazılacak verinin bellekteki konumu

Yeni bir dosya üzerinde aio_write işlemi yapıyorsa veriler sıfır boyutlu dosyanın sonuna yazılır.

Sonraki yazma işlemlerinde O_APPEND bayrağı ayarlanmışsa aio_write işlevlerine yapılan çağrılarla aynı sırada dosyaya eklenir.

O_APPEND bayrağı ayarlanmamış ise aio_offset ile gösterilen yere eklenir.

aio_read fonksiyonu ise okuma işlemini aio_offset ile gösterilen yerden yapar.

O_APPEND tanımlı bir dosya üzerindeki başarılı bir asenkron yazma (yada sıraya ekleme) veya asenkron okuma (yada sıraya koyma) işlemleri tamamlandıktan sonra dosyanın offset değeri dinamik olarak değiştirilmez. Güncellenmesi gerekmektedir. (lseek)

Okuma yada yazma işleminin başarılı olduğunu belirlemek için aio_error fonksiyonu çağrılmalıdır. İşlem başarılı olduysa her başarılı okuma veya yazma işleminden sonra aio_offset değerinin güncellenmesi için aio_return işmeli çağırılır.

Asenkron I/O Fonksiyonları

Asenkron I/O fonksiyonları aşağıdaki özellikleri taşımaktadır.

  • Hem normal hem de özel dosyalar üzerinden I/O istekleri işlenebilir.
  • Bir dosya tanımlayıcısı üzerinden birden fazla okuma yazma işlemi gerçekleştirilebilir.
  • Birden çok açık dosya tanımlayıcısına birden fazla okuma yazma işlemi verilebilir.
  • Hem sıralı hem de rastgele erişimli cihazlar I/O isteklerini işleyebilir.
  • Tamamlanmamış I/O istekleri iptal edilebilir.
  • Process I/O işleminin tamamlanması için askıya alınabilir.
  • I/O istekleri sıraya alındıklarında, devam ediyorlarken ve tamamlandıklarında izlenebilirler.

Fonksiyonlar ve işlevleri ise aşağıdaki gibidir.

  1. aio_cancel: dosya tanımlayıcısında bekleyen bir veya daha fazla isteği iptal eder.
  2. aio_error: belirli bir işlemin hata durumunu döndürür.
  3. aio_fsync: belirtilen dosyaya ait tüm asenkron giriş çıkış işlemlerini senkron olmaya zorlar.
  4. aio_read: belirtilen dosya tanımlayıcısı üzerinde bir okuma isteği başlatır.
  5. aio_return: tamamlanmış bir işlemin durumunu döndürür. (aio_offset değerini günceller)
  6. aio_suspend: belirlenen bir istek tamamlanana dek process’i askıya alır.
  7. aio_write: belirtilen dosya tanımlayıcısı üzerinde bir yazma isteği başlatır.
  8. lio_listio: birden fazla istekten oluşan bir istek listesi başlatır.

Asenkron Okuma Yazma İşlemi

Standart bir asenkron okuma yazma işlemi aşağıda ifade edildiği şekilde yapılır.

  1. Asenkron I/O kontrol bloğu yarat. (aiocb)
  2. Uygun bayrakları kullanarak dosya aç. (open)
  3. Eğer sinyal kullanılacaksa Signal Handler oluştur.
  4. Asenkron okuma yada yazma işlemini gerçekleştir. (aio_read / aio_write / aio_fsync)
  5. * Eğer işlemin tamamlanmasını beklemek gerekiyorsa process’i askıya al (aio_suspend), *Kontrol ederek yürütmeye devam edilecekse aio_error kullanarak işlemin durumunu sorgulayarak devam et. (aio_error ), *Sinyal kullanılıyor ve işlem tamamlandığında işlenecekse yürütmeye devam et.
  6. İşlem tamamlandığında veriyi almak ve aio_offset değerini güncellemek için aio_return fonksiyonunu kullan. (aio_return)
  7. Dosyayı kapat. (close) Bu fonksiyon dosyayı kapatmadan önce dosya ile ilişkili tüm asenkron I/O işlemlerini bekleyecektir.

Listeli Asenkron I/O İşlemleri Oluşturma

Genelde lio_listio fonksiyonu aşağıdaki şekilde kullanılır.

  1. Asenkron I/O kontrol blokları (listesi) yarat. (aiocb)
  2. Uygun bayrakları kullanarak dosya aç. (open)
  3. Eğer sinyal kullanılıyorsa, *Listedeki her bir istek gerçekleştikçe sinyalleri yakalayan bir Signal Handler, *Ve tüm listedeki tüm işlemler bittikten sonra döndürülen sinyali yakalayan başka bir Signal Handler oluştur.
  4. lio_listio fonksiyonunu çağır. (lio_listio) *LIO_NOWAIT bayrağı kullanılırsa işlemin bittiğini belirlemek için sinyal mekanizması kullanılır. *LIO_WAIT bayrağı kullanılırsa işlem bitene kadar process askıya alınacaktır. Bu durumda Sinyal mekanizmasına ihtiyaç yoktur.
  5. Dosyayı kapat. (close) Bu fonksiyon dosyayı kapatmadan önce dosya ile ilişkili tüm I/O işlemlerini bekleyecektir.

Kaynakça:

  1. Galvin, P. B., Gagne, G., & Silberschatz, A. (2003). Operating system concepts. John Wiley & Sons.
  2. Zurawski, R. (2009). Embedded systems design and verification. CRC.
  3. The Open Group Base Specifications Issue 7, 2018 edition IEEE Std 1003.1–2017
  4. https://www.tutorialspoint.com/operating_system/os_io_hardware.htm
  5. https://www3.physnet.uni-hamburg.de/physnet/Tru64-Unix/HTML/APS33DTE/DOCU_008.HTM
  6. https://www.cs.auckland.ac.nz/references/unix/digital/APS33DTE/DOCU_002.HTM

--

--