แก้ไข:อัปเดตเมื่อสิงหาคม 2017 พร้อมผลลัพธ์ล่าสุดของ Windows
ฉันจะให้คำตอบพร้อมลิงก์สำหรับทดสอบโค้ดและผลลัพธ์ในฐานะผู้เขียนBoost.AFIO ที่เสนอซึ่งใช้ระบบไฟล์แบบอะซิงโครนัสและไลบรารีไฟล์ i / o C ++
ประการแรก O_APPEND หรือ FILE_APPEND_DATA ที่เทียบเท่าบน Windows หมายความว่าการเพิ่มขึ้นของขอบเขตไฟล์สูงสุด (ไฟล์ "ความยาว") เป็นแบบปรมาณูภายใต้การเขียนพร้อมกัน สิ่งนี้รับประกันโดย POSIX และ Linux, FreeBSD, OS X และ Windows ทั้งหมดใช้งานได้อย่างถูกต้อง Samba ยังดำเนินการอย่างถูกต้อง NFS ก่อน v5 ไม่ได้เนื่องจากไม่มีความสามารถในการจัดรูปแบบลวดในการผนวกอะตอม ดังนั้นหากคุณเปิดไฟล์ของคุณด้วยการผนวกเท่านั้นการเขียนพร้อมกันจะไม่ฉีกขาดซึ่งกันและกันในระบบปฏิบัติการหลักใด ๆเว้นแต่จะมี NFS เกี่ยวข้อง
อย่างไรก็ตามการอ่านพร้อมกันไปยังส่วนต่อท้ายของอะตอมอาจเห็นการเขียนขาด ๆ หาย ๆ ขึ้นอยู่กับระบบปฏิบัติการระบบการจัดเก็บข้อมูลและแฟล็กที่คุณเปิดไฟล์ด้วย - การเพิ่มขอบเขตไฟล์สูงสุดเป็นแบบอะตอม แต่การมองเห็นการเขียนที่เกี่ยวกับการอ่านอาจหรือไม่ก็ได้ เป็นปรมาณู นี่คือสรุปโดยย่อตามแฟล็กระบบปฏิบัติการและระบบการจัดเก็บ:
ไม่มี O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 พร้อม NTFS: อัปเดต atomicity = 1 ไบต์จนถึงและรวม 10.0.10240 จาก 10.0.14393 อย่างน้อย 1Mb อาจไม่มีที่สิ้นสุด (*)
Linux 4.2.6 พร้อม ext4: อัปเดต atomicity = 1 ไบต์
FreeBSD 10.2 พร้อม ZFS: อัปเดต atomicity = อย่างน้อย 1Mb อาจไม่มีที่สิ้นสุด (*)
O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 พร้อม NTFS: อัปเดต atomicity = จนถึงและรวม 10.0.10240 ได้ถึง 4096 ไบต์เฉพาะเมื่อจัดหน้าเท่านั้นมิฉะนั้น 512 ไบต์หากปิด FILE_FLAG_WRITE_THROUGH อื่น 64 ไบต์ โปรดทราบว่า atomicity นี้น่าจะเป็นคุณลักษณะของ PCIe DMA มากกว่าที่ออกแบบมาตั้งแต่ 10.0.14393 อย่างน้อย 1Mb อาจไม่มีที่สิ้นสุด (*)
Linux 4.2.6 พร้อม ext4: อัปเดต atomicity = อย่างน้อย 1Mb อาจไม่มีที่สิ้นสุด (*) โปรดทราบว่า Linux รุ่นก่อนหน้านี้ที่มี ext4 ไม่เกิน 4096 ไบต์แน่นอน XFS เคยมีการล็อกแบบกำหนดเอง แต่ดูเหมือนว่า Linux ล่าสุดได้แก้ไขสิ่งนี้แล้วในที่สุด
FreeBSD 10.2 พร้อม ZFS: อัปเดต atomicity = อย่างน้อย 1Mb อาจไม่มีที่สิ้นสุด (*)
ท่านสามารถเข้าดูผลการทดสอบเชิงประจักษ์ดิบที่https://github.com/ned14/afio/tree/master/programs/fs-probe โปรดทราบว่าเราทดสอบการฉีกขาดเฉพาะกับ 512 ไบต์ทวีคูณดังนั้นฉันไม่สามารถบอกได้ว่าการอัปเดตบางส่วนของภาค 512 ไบต์จะฉีกขาดในระหว่างรอบการอ่านแก้ไข - เขียน
ดังนั้นเพื่อตอบคำถามของ OP O_APPEND การเขียนจะไม่รบกวนกันและกัน แต่การอ่าน O_APPEND พร้อมกันอาจจะเห็นการเขียนแบบขาด ๆ หาย ๆ บน Linux ด้วย ext4 เว้นแต่ว่า O_DIRECT จะเปิดอยู่ซึ่งการเขียน O_APPEND ของคุณจะต้องมีขนาดเซกเตอร์หลายขนาด
(*) "อาจไม่มีที่สิ้นสุด" เกิดจากอนุประโยคเหล่านี้ในข้อมูลจำเพาะ POSIX:
ฟังก์ชันทั้งหมดต่อไปนี้จะเป็นแบบ atomic ซึ่งกันและกันในเอฟเฟกต์ที่ระบุใน POSIX.1-2008 เมื่อทำงานกับไฟล์ปกติหรือลิงก์สัญลักษณ์ ... [หลายฟังก์ชัน] ... read () ... write ( ) ... ถ้าสองเธรดแต่ละชุดเรียกใช้ฟังก์ชันเหล่านี้อย่างใดอย่างหนึ่งการเรียกแต่ละครั้งจะเห็นผลที่ระบุทั้งหมดของการเรียกอื่นหรือไม่มีเลย [ที่มา]
และ
การเขียนสามารถจัดลำดับตามการอ่านและเขียนอื่น ๆ หากข้อมูลไฟล์ read () สามารถพิสูจน์ได้ (ด้วยวิธีการใด ๆ ) ที่จะเกิดขึ้นหลังจากการ write () ของข้อมูลข้อมูลนั้นจะต้องแสดงถึง write () นั้นแม้ว่าจะมีการเรียกใช้โดยกระบวนการที่แตกต่างกันก็ตาม [ที่มา]
แต่ตรงกันข้าม:
ปริมาณ POSIX.1-2008 นี้ไม่ได้ระบุลักษณะการทำงานของการเขียนพร้อมกันไปยังไฟล์จากหลายกระบวนการ แอปพลิเคชันควรใช้รูปแบบการควบคุมการทำงานพร้อมกันบางรูปแบบ [ที่มา]
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับความหมายของสิ่งเหล่านี้ได้ในคำตอบนี้
fsync(2)
ให้การรับประกันมากพอ ๆ กับที่sync(2)
ทำและไม่มีผลกระทบต่อประสิทธิภาพของค้อนขนาดใหญ่มากเท่า