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
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.
IO.flush
:IO
boşaltır de
ilgili yöntemler aramaya. Ayrıca Ruby kaynağına baktım ve
IO.flush
numaralı telefona çağrı da temel OSfflush()
. 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çinfflush()
çağrılır.IO.sync
: Geçerli eşitleme ayarını döndürür (true
veyafalse
).IO.fsync
: OS'deki Ruby buffers + çağrılarınıfsync()
temizler (destekliyorsa). Bu, fiziksel disk dosyasına tüm yolu temizleyecektir.IO.close
: RubyIO
'u kapatır ve beklemedeki verileri OS'ye yazar. Bununfsync()
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 birfsync()
ç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 OSwrite
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.
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.