Eşzamansız G/Ç
Önceki XIII. Oylum - Düşük Seviyeli Girdi ve Çıktı Sonraki
Eşzamansız G/Ç
İçindekiler
1. Eşzamansız Okuma ve Yazma İşlemleri
2. Eşzamansız G/Ç İşlemlerinin Durumu  -  Eşzamansız G/Ç işlemlerinin durumunu öğrenilmesi
3. Eşzamansız G/Ç İşlemlerinin Eşzamanlanması  -  İstikrarlı duruma geçme.
4. Eşzamansız G/Ç İşlemlerinin İptal Edilmesi
5. Eşzamansız G/Ç İşlemlerinin Yapılandırılması  -  Eşzamansız G/Ç işlemleri nasıl eniyilenir
POSIX.1b standardı G/Ç işlemlerinde beklemelerden kaynaklanan zaman kaybını en aza indiren yeni bir G/Ç işlemleri kümesi tanımlar. Yeni işlevler bir yazılımın birden fazla G/Ç işlemini ilklendirmesini ve G/Ç işlemlerini birarada (paralel) gerçekleştirdikten hemen sonra yazılımın normal çalışmasına dönmesini mümkün kılar. Bu işlevsellik varsa unistd.h dosyasında _POSIX_ASYNCHRONOUS_IO sembolü tanımlıdır.
Bu işlevler, gerçek zamanlı işlevler içeren librt isimli kütüphanenin bir parçasıdır. Aslında libc kodunun parçası değildir. Bu işlevlerin gerçeklenmesi çekirdekteki destek (varsa) kullanılarak ya da kullanıcı seviyesinde evrelere tabanlanmış bir gerçekleme kullanılarak yapılabilir. Son durumda uygulamaları librt kütüphanesinden başka libpthread evre kütüphanesi ile de ilintilemek gerekir.
Tüm eşzamansız G/Ç işlemleri önceden açılmış dosyalar üzerinde yapılır. Bir dosya üzerinde keyfi manada çok sayıda işlem yapılıyor olabilir. Eşzamansız G/Ç işlemleri struct aiocb isimli ("AIO control block" kısaltması) bir veri yapısı kullanılarak denetlenir. struct aiocb yapısı aio.h başlık dosyasında tanımlıdır.
struct aiocb
veri türü
POSIX.1b standardı struct aiocb yapısının en azından aşağıdaki listede açıklanan üyelere sahip olmasını zorunlu kılar. Gerçekleme tarafından kullanılan daha fazla eleman olabilir, ancak bu elemanlara bağımlılık taşınabilir olmayacağından buna şiddetle karşı çıkılır.
int aio_fildes
Bu eleman işlem için kullanılan dosya tanıtıcıyı içerir. Geçerli bir tanıtıcı olmalıdır, aksi takdirde işlem başarısız olur.
Dosya üzerinde açılan aygıt konumlama işlemlerine izin vermelidir. Örneğin, lseek çağrılarının hataya yolaçtığı uçbirim benzeri aygıtlar üzerinde eşzamansız G/Ç işlemleri yapılması mümkün değildir.
off_t aio_offset
Dosyada işlem (girdi ya da çıktı) yapılacak dosya konumunu belirtir. İşlem keyfi sırada yapıldığından ve bir dosya tanıtıcı üzerinde birden fazla işlem başlatıldığından bunun dosya tanıtıcısının o anki okuma/yazma konumu olduğundan bahsedilemez.
volatile void *aio_buf
Verinin yazıldığı ya da okunan verinin saklandığı tampona göstericidir.
size_t aio_nbytes
aio_buf ile gösterilen tamponun uzunluğudur.
int aio_reqprio
Eğer platform _POSIX_PRIORITIZED_IO ve _POSIX_PRIORITY_SCHEDULING ile tanımlanmışsa, eşzamansız G/Ç istekleri o anki zamanlama önceliğine göre işlenir. aio_reqprio elemanı eşzamansız G/Ç işlemini daha düşük önceliğe ayarlamakta kullanılabilir.
struct sigevent aio_sigevent
Çağıran sürecin işlem sonlandığında nasıl uyarılacağını belirtir. sigev_notify elemanının değeri SIGEV_NONE ise uyarı gönderilmez. SIGEV_SIGNAL ise sigev_signo tarafından saptanan sinyal gönderilir. Aksi takdirde, sigev_notify elemanının değeri SIGEV_THREAD olmalıdır. Bu durumda, sigev_notify_function tarafından gösterilen işlev çalıştırılarak başlatılan bir evre oluşturulur.
int aio_lio_opcode
Bu eleman sadece lio_listio ve lio_listio64 işlevleri tarafından kullanılır. Bu işlevler bir kerede birden fazla keyfi işlemin başlatılmasını mümkün kıldığından ve her işlem bir girdi ya da bir çıktı (ya da hiçbir şey) olabildiğinden, bilgi denetim bloğunda saklanmalıdır. Olası değerler şunlardır:
LIO_READ
Bir okuma işlemi başlatır. Okuma aio_offset'deki konumdan başlar ve okunan ilk aio_nbytes bayt aio_buf ile gösterilen tamponda saklanır.
LIO_WRITE
Bir yazma işlemi başlatır. aio_buf'dan başlayan aio_nbytes bayt, dosyaya aio_offset konumdan itibaren yazılır.
LIO_NOP
Hiçbir şey yapılmaz. Bu değer struct aiocb dizisi delikler içerdiğinde kimi zaman kullanışlı olur; örneğin, dizinin tamamında elde edilememiş bazı değerlerle lio_listio çağrısı yapmak.
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu tür aslında struct aiocb64 yapısına karşılıktır. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
LFS'de tanımlı eşzamansız G/Ç işlevleri ile kullanmak amacıyla tanımlanmış benzer bir veri türü vardır. Bu yapının üyelerinin türleri daha geniş veri türleridir. Bunun dışında her iki yapının üyelerinin isimleri aynıdır.
struct aiocb64
veri türü
int aio_fildes
Bu eleman işlem için kullanılan dosya tanıtıcıyı içerir. Geçerli bir tanıtıcı olmalıdır, aksi takdirde işlem başarısız olur.
Dosya üzerinde açılan aygıt konumlama işlemlerine izin vermelidir. Örneğin, lseek çağrılarının hataya yolaçtığı uçbirim benzeri aygıtlar üzerinde eşzamansız G/Ç işlemleri yapılması mümkün değildir.
off64_t aio_offset
Dosyada işlem (girdi ya da çıktı) yapılacak dosya konumunu belirtir. İşlem keyfi sırada yapıldığından ve bir dosya tanıtıcı üzerinde birden fazla işlem başlatıldığından bunun dosya tanıtıcısının o anki okuma/yazma konumu olduğundan bahsedilemez.
volatile void *aio_buf
Verinin yazıldığı ya da okunan verinin saklandığı tampona göstericidir.
size_t aio_nbytes
aio_buf ile gösterilen tamponun uzunluğudur.
int aio_reqprio
_POSIX_PRIORITIZED_IO ve _POSIX_PRIORITY_SCHEDULING ile tanımlanmışsa, eşzamansız G/Ç istekleri o anki zamanlama önceliğine göre işlenir. aio_reqprio elemanı eşzamansız G/Ç işlemini daha düşük önceliğe ayarlamakta kullanılabilir.
struct sigevent aio_sigevent
Çağıran sürecin işlem sonlandığında nasıl uyarılacağını belirtir. sigev_notify elemanının değeri SIGEV_NONE ise uyarı gönderilmez. SIGEV_SIGNAL ise sigev_signo tarafından saptanan sinyal gönderilir. Aksi takdirde, sigev_notify elemanının değeri SIGEV_THREAD olmalıdır. Bu durumda, sigev_notify_function tarafından gösterilen işlev çalıştırılarak başlatılan bir evre oluşturulur.
int aio_lio_opcode
Bu eleman sadece lio_listio ve lio_listio64 işlevleri tarafından kullanılır. Bu işlevler bir kerede birden fazla keyfi işlemin başlatılmasını mümkün kıldığından ve her işlem bir girdi ya da bir çıktı (ya da hiçbir şey) olabildiğinden, bilgi denetim bloğunda saklanmalıdır. Olası değerlerin açıklamaları için struct aiocb yapısında bu üyenin açıklamasına bakınız.
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu türe struct aiocb ismiyle erişilir. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
Önceki Üst Ana Başlık Sonraki
G/Ç İşlemlerinin Eşzamanlanması Başlangıç Eşzamansız Okuma ve Yazma İşlemleri
Bir Linux Kitaplığı Sayfası