G/Ç'yı Hızlı Dağıtıp Toplama
Önceki XIII. Oylum - Düşük Seviyeli Girdi ve Çıktı Sonraki
G/Ç'yı Hızlı Dağıtıp Toplama
Bazı uygulamalarda bellekte ayrı yerlerde duran çok sayıda tampona yazmak ya da okumak gerekebilir. Bu işlem çok sayıda read ve write çağrısı ile kolayca yapılabildiği halde, her çekirdek çağrısının sabit bir maliyeti olduğundan bu verimli olmaz.
Bunun yerine, çoğu platformada tek bir çekirdek çağrısında her iki işlemi birlikte yapan yüksek hızlı özel ilkeller vardır. GNU C kütüphanesi bu ilkellerin her sistemde benzetilmesini sağlayarak bunların taşınabilirliğe konu olmamasını sağlamıştır. Bu ilkeller sys/uio.h başlık dosyasında tanımlıdır.
Bu işlevler, her tamponun boyutunun ve konumunun belirtildiği iovec yapılarından oluşan bir diziyle çalışırlar.
struct iovec
veri türü
iovec yapısı bir tampon ile ilgili bilgileri içerir. İki alanı vardır:
void *iov_base
Tamponun adresidir
size_t iov_len
Tamponun uzunluğudur.
ssize_t readv
(int                 dosyatanıtıcı,
 const struct iovec *vektör,
 int                 sayı)
işlev
readv işlevi veriyi dosyatanıtıcı tanıtıcısından okuyup sayı yapılık vektör dizisindeki tamponlara bir tampon dolduktan sonra diğerine geçerek dağıtır.
readv işlevinin tamponların tümünü dolduracağı garanti edilmemiştir. read işlevinde olduğu gibi aynı sebeplerle işlem bir noktada durabilir.
Normal dönüş değeri okunan (tamponlara yazılan değil) baytları sayısıdır. 0 değeri dosya sonunu belirtir. -1 değeri ise bir hata saptandığını gösterir. Olası hatalar read işlevindekilerle aynıdır.
ssize_t writev
(int                 dosyatanıtıcı,
 const struct iovec *vektör,
 int                 sayı)
işlev
writev işlevi veriyi sayı yapılık vektör dizisindeki tamponlardan onları sırayla okuyarak toplayıp dosyatanıtıcı tanıtıcısına yazar.
readv gibi, writev işlevi de write işlevindeki aynı koşullarda işlemin ortasında durabilir.
Normal dönüş değeri yazılan baytların sayısıdır. -1 değeri hata saptandığını belirtir. Olası hatalar write işlevindekilerle aynıdır.
Bu tamponların küçük (1kB'ın altında) olması halinde yüksek seviyeli akımların bu işlevlerden daha hızlı olacaklarını unutmayın. Bununla birlikte, readv ve writev işlevleri tamponların büyük olması (toplam çıktının değil) durumunda daha verimlidir. Bu durumda bir yüksek seviyeli akımın veriyi verimli olarak arabelleklemesi mümkün olmazdı.
Önceki Üst Ana Başlık Sonraki
Akımların Temizlenmesi Başlangıç Bellek Eşlemli G/Ç
Bir Linux Kitaplığı Sayfası