Eşzamansız G/Ç İşlemlerinin Eşzamanlanması
Önceki Eşzamansız G/Ç Sonraki
Eşzamansız G/Ç İşlemlerinin Eşzamanlanması
Eşzamansız işlemlerle çalışırken kimi zaman istikrarlı duruma geçmek gerekir. Bu, eşzamansız G/Ç işlemlerinde belli bir isteğin ya da belli bir istek grubunun işlenip işlenmediğinin bilinmesinin istendiği anlamına gelir. Bu, işlem sonlandıktan sonra sistem tarafından gönderilecek bir uyarı beklenerek de yapılabilirdi, fakat bu kimi zaman özkaynakların kirlenmesi anlamına gelir (özellikle hesaplama sırasında). Bunun yerine istikrar gerektiren çoğu durumda yardımcı olmak üzere POSIX.1b iki işlev tanımlamıştır.
aio_fsync ve aio_fsync64 işlevleri sadece unistd.h dosyasında _POSIX_SYNCHRONIZED_IO sembolü tanımlıysa kullanılabilir.
int aio_fsync
(int           kip,
 struct aiocb *aiocbp)
işlev
Bu işlev çağrıldığında aiocbp->aio_fildes tanıtıcısı üzerinde işlev çağrısının çalışması esnasında kuyruktaki tüm G/Ç işlemleri eşzamanlı G/Ç tamamlama durumuna (bkz. G/Ç İşlemlerinin Eşzamanlanması) sokulmaya zorlanır. aio_fsync işlevi beklemeden hemen döner ancak, aiocbp->aio_sigevent ile belirtilen yöntem üzerinden uyarı sadece dosya tanıtıcısı sonlandığında ve dosya eşzamanlandığında verilir. Bu ayrıca, eşzamanlama isteğinden sonra aynı dosya tanıtıcısı için yapılan bu isteklerin etkili olmadığı anlamına gelir.
kip değeri O_DSYNC ise eşzamanlama bir fdatasync çağrısı olarak, O_SYNC ise bir fsync çağrısı olarak gerçekleştirilir.
Eşzamanlama oluşmadığı sürece, aiocbp ile gösterilen nesne ile yapılan aio_error çağrıları EINPROGRESS ile döner. Eşzamanlama oluştuktan sonra yapılan bir aio_error çağrısı eşzamanlama gerçekleşmişse sıfır ile döner; aksi takdirde, fsync ya da fdatasync çağrılarının hata durumunda errno değişkenine atadıkları değer ile döner. Bu durumda dosya tanıtıcısına veri yazmada istikrar anlamında hiçbir şey yapılmamış olabilir.
İstek başarıyla kuyruğa alınmışsa bu işlevin dönüş değeri sıfır olur. Aksi takdirde -1 ile döner ve errno değişkenine şu değerlerden biri atanır:
EAGAIN
İstek, özkaynakların geçici yokluğundan dolayı kuyruğa alınmadı
EBADF
aiocbp->aio_fildes tanıtıcı ya geçersiz ya da yazmak için açılmamış
EINVAL
Ya gerçekleme G/Ç eşzamanlamasını gerçeklemiyor ya da kip değeri O_DSYNC veya O_SYNC değil
ENOSYS
İşlev desteklenmiyor
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu işlev aslında aio_fsync64 işlevine karşılıktır. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
int aio_fsync64
(int             kip,
 struct aiocb64 *aiocbp)
işlev
Bu işlev, argümanının struct aiocb64 türünde bir değişken olması dışında aio_fsync işlevine benzer.
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu işleve aio_fsync ismiyle erişilir. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
Başka bir eşzamanlama yöntemi de bir ya da daha fazla istekten oluşan belli bir küme sonlanana kadar beklemektir. Bu, sonlanma hakkında işlemi başlatan sürecin uyarılmasında aio_* işlevleri kullanılmasıyla mümkün olsa da bazı durumlarda bu ideal bir çözüm değildir. Sunucuya bağlı istemcileri sürekli güncel tutan bir yazılımda bazı bağlantıların yavaş bağlantılar olması nedeniyle istemcileri sırayla taranması da en iyi çözüm olmaz. Diğer taraftan, bir istemci güncellenmeden bir uyarı alan süreç yeni istemciye geçemeyeceğinden bir aio_* işlevinden bir uyarı ile işlemin durdurulması birşey ifade etmeyeceğinden bu da iyi bir çözüm olmaz. Bu gibi durumlar için aio_suspend kullanılmalıdır.
int aio_suspend
(const struct aiocb *const liste[],
 int                       isteksayısı,
 const struct timespec    *süre)
işlev
Bu işlev çağrıldığında, liste dizisinin isteksayısı elemanı tarafından yapılan isteklerden en az biri tamamlanana kadar çağıran evre bekletilir. aio_suspend çağrısı sırasında zaten tamamlanmış bir istek varsa işlev beklemeksizin döner. Bir isteğin sonlanıp sonlanmadığı isteğin hata durumunun EINPROGRESS olup olmamasına bağlıdır. liste'nin NULL bir elemanı varsa bu girdi yoksayılır.
Tamamlanan bir istek yoksa, çağıran süreç beklemeye alınır. süre argümanında NULL belirtilmişse, bir istek tamamlanana kadar süreç ilerlemez. süre argümanında NULL belirtilmemişse, belirtilen süre kadar süreç bekletilir. Bu durumda aio_suspend bir hata ile döner.
liste'deki elemanlardan en az biri sonlanmışsa işlev sıfır değeri ile döner. Aksi takdirde -1 ile döner, bu durumda errno değişkeninde şu durumlardan biri olabilir:
EAGAIN
liste'deki elemanlardan hiçbiri belirtilen süre'de tamamlanmadı
EINTR
aio_suspend işlevini bir sinyal durdurdu. Bu sinyal eşzamansız G/Ç gerçeklemesi tarafından isteklerden birinin sonlanması sinyallenirken de gönderilmiş olabilir.
ENOSYS
aio_suspend işlevi desteklenmiyor
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu işlev aslında aio_suspend64 işlevine karşılıktır. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
int aio_suspend64
(const struct aiocb64 *const liste[],
 int                         isteksayısı,
 const struct timespec      *süre)
işlev
Bu işlev, argümanının struct aiocb64 türünde bir değişken olması dışında aio_suspend işlevine benzer.
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu işleve aio_suspend ismiyle erişilir. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
Önceki Üst Ana Başlık Sonraki
Eşzamansız G/Ç İşlemlerinin Durumu Başlangıç Eşzamansız G/Ç İşlemlerinin İptal Edilmesi
Bir Linux Kitaplığı Sayfası