Tulisan dengan ukuran di bawah 'PIPE_BUF' seharusnya bersifat atom. Itu setidaknya harus 512 byte, meskipun bisa dengan mudah lebih besar (linux tampaknya telah mengaturnya ke 4096).
Ini mengasumsikan bahwa Anda membicarakan semua komponen yang sepenuhnya sesuai dengan POSIX. Misalnya, ini tidak benar di NFS.
Tetapi dengan asumsi Anda menulis ke file log yang Anda buka dalam mode 'O_APPEND' dan mempertahankan baris Anda (termasuk baris baru) di bawah byte 'PIPE_BUF', Anda seharusnya dapat memiliki beberapa penulis ke file log tanpa masalah korupsi. Setiap interupsi akan tiba sebelum atau sesudah penulisan, bukan di tengah. Jika Anda ingin integritas file bertahan saat reboot, Anda juga harus meneleponfsync(2)
setelah setiap penulisan, tetapi itu buruk untuk kinerja.
Klarifikasi : baca komentar dan jawaban Oz Solomon . Saya tidak yakin yang O_APPEND
seharusnya memiliki PIPE_BUF
atomicity sebesar itu. Sangat mungkin bahwa itu hanya bagaimana Linux diimplementasikan write()
, atau mungkin karena ukuran blok sistem file yang mendasarinya.
fsync(2)
memberikan jaminan sebanyak yang diberikansync(2)
, dan tidak memiliki banyak pengaruh besar pada kinerja.PIPE_BUF
pada halaman itu hanya berlaku untuk pipa dan FIFO, bukan file biasa.Edit: Diperbarui Agustus 2017 dengan hasil Windows terbaru.
Saya akan memberi Anda jawaban dengan tautan untuk menguji kode dan hasil sebagai penulis Boost.AFIO yang diusulkan yang mengimplementasikan sistem file asinkron dan pustaka file i / o C ++.
Pertama, O_APPEND atau FILE_APPEND_DATA yang setara di Windows berarti bahwa kenaikan tingkat file maksimum ("panjang" file) bersifat atomic di bawah penulis bersamaan. Ini dijamin oleh POSIX, dan Linux, FreeBSD, OS X dan Windows semuanya menerapkannya dengan benar. Samba juga mengimplementasikannya dengan benar, NFS sebelum v5 tidak karena tidak memiliki kemampuan format kabel untuk ditambahkan secara atomik. Jadi jika Anda membuka file dengan append-only, penulisan bersamaan tidak akan robek satu sama lain di OS utama mana pun kecuali NFS terlibat.
Namun, pembacaan bersamaan ke atomic appends dapat melihat penulisan yang robek tergantung pada OS, sistem pengarsipan, dan flag apa yang Anda gunakan untuk membuka file - penambahan luas file maksimum bersifat atomic, tetapi visibilitas penulisan sehubungan dengan pembacaan mungkin atau mungkin tidak menjadi atom. Berikut ringkasan singkat berdasarkan bendera, OS, dan sistem pengarsipan:
Tidak ada O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 dengan NTFS: perbarui atomicity = 1 byte hingga dan termasuk 10.0.10240, dari 10.0.14393 setidaknya 1Mb, mungkin tak terbatas (*).
Linux 4.2.6 dengan ext4: memperbarui atomicity = 1 byte
FreeBSD 10.2 dengan ZFS: perbarui atomicity = setidaknya 1Mb, mungkin tak terbatas (*)
O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 dengan NTFS: perbarui atomicity = hingga dan termasuk 10.0.10240 hingga 4096 byte hanya jika halaman sejajar, sebaliknya 512 byte jika FILE_FLAG_WRITE_THROUGH nonaktif, 64 byte lainnya. Perhatikan bahwa atomicity ini mungkin merupakan fitur PCIe DMA daripada yang dirancang. Sejak 10.0.14393, setidaknya 1Mb, mungkin tak terbatas (*).
Linux 4.2.6 dengan ext4: memperbarui atomicity = setidaknya 1Mb, mungkin tak terbatas (*). Perhatikan bahwa Linux sebelumnya dengan ext4 pasti tidak melebihi 4096 byte, XFS tentu saja memiliki penguncian khusus tetapi sepertinya Linux baru-baru ini akhirnya memperbaikinya.
FreeBSD 10.2 dengan ZFS: perbarui atomicity = setidaknya 1Mb, mungkin tak terbatas (*)
Anda dapat melihat hasil uji empiris mentah di https://github.com/ned14/afio/tree/master/programs/fs-probe . Perhatikan bahwa kami menguji robekan offset hanya pada kelipatan 512 byte, jadi saya tidak dapat mengatakan jika pembaruan sebagian dari sektor 512 byte akan robek selama siklus baca-ubah-tulis.
Jadi, untuk menjawab pertanyaan OP, penulisan O_APPEND tidak akan mengganggu satu sama lain, tetapi penulisan O_APPEND yang bersamaan dengan O_APPEND mungkin akan melihat penulisan yang robek di Linux dengan ext4 kecuali O_DIRECT aktif, di mana penulisan O_APPEND Anda harus berupa beberapa sektor berukuran sektor.
(*) "Probably infinite" berasal dari klausa berikut di spek POSIX:
dan
tapi sebaliknya:
Anda dapat membaca lebih lanjut tentang artinya di jawaban ini
sumber
Saya menulis skrip untuk menguji secara empiris ukuran pelengkap atom maksimum. Skrip, yang ditulis dalam bash, memunculkan banyak proses pekerja yang semuanya menulis tanda tangan khusus pekerja ke file yang sama. Ia kemudian membaca file tersebut, mencari tanda tangan yang tumpang tindih atau rusak. Anda dapat melihat sumber skrip di posting blog ini .
Ukuran penambahan atomik maksimum sebenarnya bervariasi tidak hanya menurut OS, tetapi menurut sistem file.
Di Linux + ext3 ukurannya adalah 4096, dan di Windows + NTFS ukurannya 1024. Lihat komentar di bawah untuk mengetahui ukuran lainnya.
sumber
echo $line >> $OUTPUT_FILE
akan menghasilkan satu panggilan kewrite
berapa pun ukurannya$line
.Inilah yang dikatakan standar: http://www.opengroup.org/onlinepubs/009695399/functions/pwrite.html .
sumber