2011-07-14 12 views
26

IO arabelleği Ruby'de nasıl çalışır? IO ve File sınıflarını kullanırken veriler hangi sıklıkla temel akışa akıtılır? Bu, OS arabellekleme ile nasıl karşılaştırılır? Verilerin güvenli bir şekilde işleme koyulmadan önce diske yazıldığını garanti etmek için ne yapılması gerekir?Ruby ve OS I/O arabelleğini anlama

cevap

48

Yakut IO belgeleri bu tamponlama nasıl çalıştığı hakkında% 100 net değil, ama bu belgelere ayıklayabileceği geçerli:

  • Yakut IO Buna ek olarak, kendi iç tampon
  • sahiptir Altta yatan işletim sistemi, daha fazla tampon verisi olabilir veya olmayabilir.

    ilgili yöntemler aramaya. Ayrıca Ruby kaynağına baktım ve IO.flush numaralı telefona çağrı da temel OS fflush(). Bu, önbelleğe alınan dosyayı almak için yeterli olmalı, ancak diske fiziksel verileri garanti etmez.

  • IO.sync=: true olarak ayarlanmışsa, Ruby dahili arabelleği yapılmaz. Her şey doğru bir şekilde OS'ye gönderilir ve her yazma için fflush() çağrılır.
  • IO.sync: Geçerli eşitleme ayarını döndürür (true veya false).
  • IO.fsync: OS'deki Ruby buffers + çağrılarını fsync() temizler (destekliyorsa). Bu, fiziksel disk dosyasına tüm yolu temizleyecektir.
  • IO.close: Ruby IO'u kapatır ve beklemedeki verileri OS'ye yazar. Bunun fsync() anlamına gelmediğini unutmayın. close() üzerindeki POSIX belgeleri, verilerin fiziksel olarak dosyaya yazılmasını garanti ETMEZ. Yani bunun için açık bir fsync() çağrı kullanmanız gerekir.

Sonuç: başka bir işlem veya operasyonla tamamen okunabilir şekilde flush ve/veya close dosya önbelleğe almak için yeterli olmalıdır. Dosyayı kesin olarak fiziksel ortama taşımak için IO.fsync numaralı telefonu aramanız gerekir.

Diğer ilgili yöntemleri:

  • IO.syswrite: Baypas Yakut iç tamponlar ve düz OS write yapmak. Bunu kullanırsanız, IO.read/write ile karıştırmayın.
  • IO.sysread: Yukarıdaki ile aynıdır, ancak okumak için.
1

Ruby, dahili belleğini işletim sisteminin üstüne getirir. Dosyayı açtığınızda Ruby, dahili arabelleğini temizler. Dosyanın diske yazıldığından emin olmak için file.fsync dosyasını yapmanız gerekir. Ancak sonuçta dosyanın diske yazıldığından emin olamazsınız, bu işletim sistemine, hdd denetleyicisine ve hdd'ye bağlıdır.