Düzenleme: Ağustos 2017'de en son Windows sonuçlarıyla güncellendi.
Eşzamansız bir dosya sistemi ve dosya i / o C ++ kitaplığı uygulayan önerilen Boost.AFIO'nun yazarı olarak test koduna ve sonuçlarına bağlantılar içeren bir cevap vereceğim .
İlk olarak, Windows'ta O_APPEND veya eşdeğer FILE_APPEND_DATA, maksimum dosya kapsamındaki artışların (dosya "uzunluğu") eşzamanlı yazarlar için atomik olduğu anlamına gelir . Bu, POSIX tarafından garanti edilir ve Linux, FreeBSD, OS X ve Windows'un tümü bunu doğru bir şekilde uygular. Samba da bunu doğru bir şekilde uygular, v5'ten önceki NFS, atomik olarak ekleme yapma yeteneğinden yoksun olduğu için bunu yapmaz. Bu nedenle, dosyanızı yalnızca ek olarak açarsanız, NFS dahil olmadıkça , herhangi bir büyük işletim sisteminde eşzamanlı yazma işlemleri birbirine göre yırtılmaz .
Ancak eşzamanlı okur atom ekler için olabilir yırtılmış yazma sistemi dosyalama, OS bağlı olarak görmek ve neler bayrakları size dosyayı açtı - maksimum dosya ölçüde olduğu atom artımı, bunlarla ilgili yazma görünürlük okur veya olmayabilir atomik ol. İşte bayraklar, işletim sistemi ve dosyalama sistemine göre hızlı bir özet:
O_DIRECT / FILE_FLAG_NO_BUFFERING yok:
NTFS ile Microsoft Windows 10: 10.0.10240'a kadar ve 10.0.10240'a kadar atomicity = 1 bayt, 10.0.14393'ten en az 1Mb, muhtemelen sonsuz (*) güncelleyin.
Ext4 ile Linux 4.2.6: güncelleme atomikliği = 1 bayt
FreeBSD 10.2, ZFS ile: güncelleme atomikliği = en az 1Mb, muhtemelen sonsuz (*)
O_DIRECT / FILE_FLAG_NO_BUFFERING:
NTFS ile Microsoft Windows 10: atomicity = 10.0.10240'a kadar ve dahil olmak üzere 4096 bayta kadar yalnızca sayfa hizalandığında, aksi takdirde FILE_FLAG_WRITE_THROUGH kapalıysa 512 bayt, diğer 64 bayt güncelleyin. Bu atomikliğin muhtemelen tasarlanmaktan çok PCIe DMA'nın bir özelliği olduğuna dikkat edin. 10.0.14393'ten beri, en az 1Mb, muhtemelen sonsuz (*).
Ext4 ile Linux 4.2.6: güncelleme atomikliği = en az 1Mb, muhtemelen sonsuz (*). Ext4'e sahip eski Linux'ların kesinlikle 4096 baytı aşmadığını, XFS'in kesinlikle özel kilitlemeye sahip olduğunu ancak son Linux'un sonunda bunu düzelttiği görülüyor.
FreeBSD 10.2, ZFS ile: güncelleme atomikliği = en az 1Mb, muhtemelen sonsuz (*)
Ham deneysel test sonuçlarını https://github.com/ned14/afio/tree/master/programs/fs-probe adresinde görebilirsiniz . Sadece 512 baytlık katlarda yırtılmış ofsetleri test ettiğimize dikkat edin, bu nedenle 512 bayt sektörün kısmi güncellemesinin okuma-değiştirme-yazma döngüsü sırasında yırtılacağını söyleyemem.
Dolayısıyla, OP'nin sorusunu yanıtlamak için, O_APPEND yazmaları birbirini etkilemeyecektir, ancak O_APPEND ile eşzamanlı okuma yazma işlemleri, muhtemelen O_DIRECT açık olmadıkça, Linux'ta ext4 ile yırtık yazmalar görecek, bunun üzerine O_APPEND yazmalarınızın sektör boyutu katları olması gerekecektir.
(*) "Muhtemelen sonsuz", POSIX spesifikasyonundaki şu maddelerden kaynaklanmaktadır:
Aşağıdaki işlevlerin tümü, normal dosyalar veya sembolik bağlantılar üzerinde çalıştıklarında POSIX.1-2008'de belirtilen efektlerde birbirine göre atomik olacaktır ... [birçok işlev] ... oku () ... yaz ( ) ... İki iş parçacığının her biri bu işlevlerden birini çağırırsa, her çağrı ya diğer çağrının belirtilen tüm etkilerini görecek ya da hiçbirini görmeyecektir. [Kaynak]
ve
Yazılar, diğer okuma ve yazmalara göre serileştirilebilir. Bir dosya verisinin () okunmasının () bir verinin yazılmasından () sonra gerçekleştiği kanıtlanabiliyorsa, çağrılar farklı işlemlerle yapılsa bile bu write () öğesini yansıtmalıdır. [Kaynak]
ama tersine:
Bu POSIX.1-2008 cilt, bir dosyaya birden çok işlemden eşzamanlı yazma davranışını belirtmez. Uygulamalar bir tür eşzamanlılık denetimi kullanmalıdır. [Kaynak]
Bunların anlamı hakkında daha fazla bilgiyi bu cevapta okuyabilirsiniz.
fsync(2)
olduğu kadar garanti verirsync(2)
ve performans üzerinde o kadar büyük bir etkisi yoktur.