संपादित करें: नवीनतम विंडोज परिणामों के साथ अगस्त 2017 को अपडेट किया गया।
मैं आपको प्रस्तावित Boost.AFIO के लेखक के रूप में परीक्षण कोड और परिणामों के लिंक के साथ एक उत्तर देने जा रहा हूं, जो एक अतुल्यकालिक फाइल सिस्टम को लागू करता है और i / o C ++ लाइब्रेरी को फाइल करता है।
सबसे पहले, विंडोज पर O_APPEND या समकक्ष FILE_APPEND_DATA का अर्थ है कि समवर्ती लेखक के अंतर्गत अधिकतम फ़ाइल सीमा (फ़ाइल "लंबाई") की वृद्धि परमाणु है । यह POSIX द्वारा गारंटी है, और लिनक्स, FreeBSD, OS X और विंडोज सभी इसे सही तरीके से लागू करते हैं। सांबा भी इसे सही तरीके से लागू करता है, v5 से पहले एनएफएस नहीं करता है क्योंकि इसमें परमाणु रूप से संलग्न करने के लिए तार प्रारूप क्षमता का अभाव है। इसलिए यदि आप अपनी फ़ाइल को केवल परिशिष्ट के साथ खोलते हैं, तो समवर्ती लेखन किसी भी प्रमुख ओएस पर एक दूसरे के संबंध में आंसू नहीं बहाएगा जब तक कि एनएफएस शामिल नहीं होता है।
हालाँकि समवर्ती परमाणु परमाणुओं को पढ़ता है , ओएस, फाइलिंग सिस्टम के आधार पर फटे हुए लेखन को देख सकता है, और आपने फाइल को किस झंडे के साथ खोला है - अधिकतम फ़ाइल सीमा का वेतन वृद्धि परमाणु है, लेकिन रीड के संबंध में लेखन की दृश्यता हो सकती है या नहीं परमाणु होना। यहाँ झंडे, OS और फाइलिंग सिस्टम द्वारा एक त्वरित सारांश दिया गया है:
कोई O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 NTFS के साथ: atomicity = 1 बाइट तक अद्यतन करें और 10.0.10240 सहित, 10.0.14393 से कम से कम 1Mb, शायद अनंत (*)।
एक्स्टे 4 के साथ लिनक्स 4.2.6: अपडेट एटोमिसिटी = 1 बाइट
फ्रीबीएसडी 10.2 जेडएफएस के साथ: अद्यतन परमाणु = कम से कम 1 एमबी, शायद अनंत (*)
O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 NTFS के साथ: atomicity = अद्यतन करें और जब तक कि पृष्ठ संरेखित नहीं किया जाता है, तब तक केवल 10.096 बाइट्स 4096 बाइट्स सहित, अन्यथा 512 बाइट्स यदि FILE_FLAG_WRITE_THROUGH बंद हों, तो 64 बाइट्स। ध्यान दें कि यह परमाणुता संभवत: PCIe DMA की एक विशेषता है जिसे डिज़ाइन किया गया है। 10.0.14393 के बाद से, कम से कम 1Mb, शायद अनंत (*)।
एक्स्ट्रीम 4 के साथ लिनक्स 4.2.6: एटमॉसिटी = कम से कम 1Mb, शायद अनंत (*) को अपडेट करें। ध्यान दें कि ext4 के साथ पहले लिनक्स निश्चित रूप से 4096 बाइट्स से अधिक नहीं था, एक्सएफएस निश्चित रूप से कस्टम लॉकिंग का उपयोग करता था लेकिन ऐसा लगता है कि हाल ही में लिनक्स ने इसे ठीक कर दिया है।
फ्रीबीएसडी 10.2 जेडएफएस के साथ: अद्यतन परमाणु = कम से कम 1 एमबी, शायद अनंत (*)
आप कच्चे अनुभवजन्य परीक्षा परिणाम https://github.com/ned14/afio/tree/master/programs/fs-probe पर देख सकते हैं । ध्यान दें कि हम फटे हुए ऑफ़सेट के लिए केवल 512 बाइट गुणकों पर परीक्षण करते हैं, इसलिए मैं यह नहीं कह सकता कि यदि 512 बाइट सेक्टर का आंशिक अद्यतन रीड-मॉडिफाई-राइट साइकिल के दौरान आंसू बहाएगा।
इसलिए, ओपी के प्रश्न का उत्तर देने के लिए, O_APPEND लिखते हैं, एक दूसरे के साथ हस्तक्षेप नहीं करेंगे, लेकिन O_APPEND के समवर्ती को पढ़ता है, संभवतः लिनक्स पर फटे हुए लेखन को ext4 के साथ देखेगा जब तक कि O_DIRECT चालू नहीं होता है, जहां आपके O_APPEND लिखते से सेक्टर आकार बहु होने की आवश्यकता होगी।
(*) "संभवतः अनंत" POSIX कल्पना में इन खंडों से उपजा है:
निम्नलिखित सभी कार्य POSIX.1-2008 में निर्दिष्ट प्रभावों में एक दूसरे के संबंध में परमाणु होंगे जब वे नियमित फ़ाइलों या प्रतीकात्मक लिंक पर काम करते हैं ... [कई कार्य] ... पढ़ें () ... लिखें ) ... यदि दो थ्रेड्स इनमें से किसी एक फ़ंक्शन को कॉल करते हैं, तो प्रत्येक कॉल या तो अन्य कॉल के निर्दिष्ट प्रभावों को देखेगा, या उनमें से कोई भी नहीं। [स्रोत]
तथा
राइट्स को अन्य रीड और राइट के संबंध में क्रमबद्ध किया जा सकता है। यदि डेटा के एक रीड () किसी भी (किसी भी माध्यम से) डेटा के लिखने () के बाद होने के लिए सिद्ध किया जा सकता है, तो उसे उस लिखना () को प्रतिबिंबित करना चाहिए, भले ही कॉल विभिन्न प्रक्रियाओं द्वारा किए गए हों। [स्रोत]
लेकिन इसके विपरीत:
POSIX.1-2008 की यह मात्रा कई प्रक्रियाओं से एक फ़ाइल के समवर्ती लिखने का व्यवहार निर्दिष्ट नहीं करती है। एप्लिकेशन को समसामयिक नियंत्रण के कुछ रूप का उपयोग करना चाहिए। [स्रोत]
आप इस उत्तर में इनके अर्थ के बारे में अधिक पढ़ सकते हैं
fsync(2)
उतनी ही गारंटी देताsync(2)
है, जितना कि प्रदर्शन पर बड़े-हथौड़े का उतना असर नहीं होता।