मौजूदा फ़ाइल को फिर से लिखें ताकि इसे नए संस्करण द्वारा एटोमिक रूप से बदल दिया जाए, केवल एक बार पूरी तरह से लिखा जाए


18

मैं अस्पष्ट रूप से उस जगह को पढ़ने की याद दिलाता हूं, जिसमें कुछ का उपयोग करता है, लिखने के लिए एक मौजूदा फ़ाइल खोलने का एक तरीका है, एक ध्वज के साथ जिसने कर्नेल को पुराने संस्करण (पढ़ने के लिए इसे एक्सेस करने वाली अन्य प्रक्रियाओं के लिए) का उपयोग करने के लिए कहा, "नया "संस्करण पूरी तरह से लिखा गया था (fd बंद), जिस बिंदु से फ़ाइल नए संस्करण के रूप में दिखाई दी।

दूसरे शब्दों में, अन्य प्रक्रियाओं ने या तो पुराने संस्करण को देखा, या नए को कभी नहीं लिखा।

क्या कोई जानकार मुझे एक संदर्भ में बता सकता है?


लगता है कि योजना 9 क्या कर सकती है, लेकिन नहीं।
गाइल्स का SO- बुराई पर रोक '

2
OpenVMS पर फ़ाइलें -11 जैसी आवाज़ें : "हर बार मौजूदा संस्करण को अधिलेखित करने के बजाय, एक फ़ाइल को सहेजा जाता है, उसी नाम से एक नई फ़ाइल लेकिन एक संवर्धित संस्करण संख्या बनाई जाती है।"
Mat

आपने क्यों पूछा? क्या आपको उस कार्यक्षमता की आवश्यकता है, या यह सिर्फ जिज्ञासा थी?
निल्स

1
मुझे उस कार्यक्षमता को पाकर खुशी होगी, और मुझे कहीं न कहीं यह याद है कि यह अस्तित्व में है। तो जरूरत और जिज्ञासा दोनों का मिश्रण।
यूडोक्सोस

सभी यूनिक्स सिस्टम इसे दूसरे तरीके से अनुमति देते हैं - एक ही निर्देशिका में नई फ़ाइल बनाएं, परिवर्तित सामग्री से भरें और परमाणु नाम बदलें। यह छोटे परिवर्तनों के लिए बहुत अधिक महंगा है लेकिन काम कर रहा है।
नेट

जवाबों:


14

आप जो वर्णन कर रहे हैं वह किसी फ़ाइल को अधिलेखित करने के लिए मूल नाम की तरह लगता है।

जब आप एक फ़ाइल का नाम दूसरे के ऊपर रखते हैं / स्थानांतरित करते हैं, तो पुरानी फ़ाइल को अनलिंक कर दिया जाता है। मतलब फाइल अभी भी मौजूद है, लेकिन यह फाइलसिस्टम ट्री में नहीं है। इस प्रकार पुराने एप्लिकेशन फ़ाइल को तब तक एक्सेस करने में सक्षम रहेंगे जब तक वे इसे खोलते रहेंगे। एक बार सभी एप्लिकेशन ने पुरानी फ़ाइल को बंद कर दिया है, तो इसका वास्तव में डिस्क पर असंबद्ध है।

renameसिस्टम कॉल एक परमाणु ऑपरेशन है। तो ऐसा करने के लिए आप एक अलग नाम के तहत एक नई फ़ाइल बनाएंगे, और फिर renameअस्थायी फ़ाइल का नाम बदलने के लिए कॉल करेंगे, जिसे आप बदलना चाहते हैं। चूंकि ऑपरेशन परमाणु है, इसलिए पूरी तरह से कोई अवधि नहीं है जहां फ़ाइल गायब है। यह तुरंत पुरानी फाइल से नई फाइल में चला जाता है।
ध्यान दें कि अस्थायी फ़ाइल और प्रतिस्थापित की जा रही फ़ाइल को एक ही आरोह बिंदु पर निवास करना है।


आप केवल इसका उपयोग कर सकते हैं यदि आपका कार्यक्रम विशेष रूप से कार्यक्षमता को ध्यान में रखकर लिखा गया है। इस मामले में, हालांकि, यह एक ओएस सुविधा थी, जहां नियमित कार्यक्रमों को भी स्वचालित रूप से इस परमाणु शब्दार्थ दिया गया था।
यूडोक्सोस

1
@eudoxos आपकी टिप्पणी का कोई मतलब नहीं है। Youre कह कार्यक्रम विशेष रूप से renameस्वैप बात करने के लिए लिखा जाना होगा । यहां तक ​​कि अगर इस तरह के एक 'OS फीचर' के रूप में आप के बारे में बात कर रहे हैं, तब भी इस कार्यक्रम का लाभ लेने के लिए लिखा जाना चाहिए। क्या फर्क पड़ता है?
पैट्रिक

यदि आप opensyscall के लिए (संभवतः असमर्थित) झंडे को पास करते हैं या यदि आपको हाथ से जो वर्णन करना है, वह करने पर अंतर होता है ।
यूडोक्सोस

ध्यान रखें कि किसी दुर्घटना के मामले में पुराने या पूरी तरह से लिखे गए नए संस्करण को रखने के लिए आपको नई फाइल को डिस्क के साथ fsync या समान के साथ सिंक करने की आवश्यकता है
ग्रंथी

@textshell के बिना सिंक आप अभी भी परमाणुता प्राप्त करते हैं .... बस स्थायित्व नहीं ... सही? मुझे इस मामले में goo.gl/qfQQfy पर तर्क समझ में नहीं आता है । मेरे मामले में मेरे पास चरम भार के तहत एक प्रणाली है और मैं फ़ाइल सिस्टम फ़्लश से बचना चाहता हूं और मुझे परवाह नहीं है कि क्या फ़ाइल किसी दुर्घटना से बच जाती है।
wcochran 16

6

जैसा कि पैट्रिक लिखते हैं , ऐसा करने का सामान्य तरीका नए संस्करण को एक अलग फ़ाइल में लिखना है, और जब नया संस्करण पुराने नाम में बदला जाता है, तो इसे परमाणु रूप से लिखकर। इस दूसरे ऑपरेशन को ओवरराइट-बाय-रीनेम कहा जाता है ।

अब, कुछ संदर्भ:


man 3p renameमुझे बताता है कि renameवास्तव में परमाणु है, और मुझे लगता है कि यह सभी लिनक्स फ़ाइल सिस्टम के लिए है। और जब मैंने पहला लेख पढ़ा जिसे आपने लिंक किया था, तब भी मुझे लगता है कि Btrfs का नाम परिवर्तन परमाणु है।
हैगेलो

1

यह मुझे फ्लश पर आवंटित की याद दिलाता है । जब कोई फ़ाइल सिस्टम इस सुविधा का उपयोग करता है, तो डेटा को डिस्क पर सीधे लिखने के बजाय, यह डिस्क के फ्री स्पेस काउंटर से लिखे जाने वाले डेटा के आकार को घटाता है, और डेटा को तब तक मेमोरी में रखता है जब तक कि सिंक सिस्टम कॉल नहीं किया जाता है या कर्नेल निर्णय नहीं लेता है गंदे बफ़र्स को फ्लश करने के लिए।

इस मामले में, यदि फ़ाइल को एक प्रक्रिया द्वारा संशोधित किया जा रहा है, और एक अन्य प्रक्रिया द्वारा खोला जाता है, तो बाद की प्रक्रिया फ़ाइल के " अनमॉडिफाइड ( या यदि आप चाहें तो" पुरानी ) "देखेंगे" ।

बेशक, उपरोक्त सैद्धांतिक हैं और विभिन्न कारकों पर निर्भर करते हैं, और मैं थोड़ा अप्रत्याशित कहूंगा कि जब आपको पता नहीं होगा कि कर्नेल गंदे पन्नों को कैसे बहा रहा है। उदाहरण के लिए लिनक्स में ( जैसा कि आप लिनक्स कर्नेल को समझने की धारा 15.3 में भी पढ़ सकते हैं ), गंदे पृष्ठ निम्नलिखित शर्तों के तहत डिस्क पर लिखे जाते हैं:

  • पृष्ठ कैश बहुत अधिक भरा हुआ है और अधिक पृष्ठों की आवश्यकता है, या गंदे पृष्ठों की संख्या बहुत बड़ी हो गई है।

  • एक पृष्ठ गंदा रहने के बाद से बहुत अधिक समय बीत चुका है।

  • एक प्रक्रिया ब्लॉक डिवाइस या किसी विशेष फ़ाइल के सभी लंबित परिवर्तनों का निस्तारण करने का अनुरोध करती है; यह सिंक (), fsync (), या fdatasync () सिस्टम कॉल को लागू करके करता है।

यह सुविधा HFS +, XFS, Reiser4, ZFS, Btrfs और ext4 फाइल सिस्टम में लागू होने के लिए जानी जाती है।


2
क्या आप का वर्णन एक फाइल सिस्टम तकनीक है जो यूज़रस्पेस से अदृश्य होना चाहिए (और इस प्रकार आप क्या संकेत मिलता है नहीं है) POSIX (फाइल) सिस्टम पर (देखें लिखने : "यदि फ़ाइल डेटा का एक पढ़ने () सिद्ध किया जा सकता (किसी भी तरह से) डेटा के लिखने () के बाद होने के लिए, यह लिखना चाहिए कि लेखन (), भले ही कॉल विभिन्न प्रक्रियाओं द्वारा किए गए हों । ")। अन्य प्रक्रियाओं होगा नहीं पुराने डेटा (इसे POSIX पर) देखें।
Mat

सुधारों के लिए धन्यवाद। मुझे लगता है कि इस फाइलसिस्टम तकनीक के बारे में मेरी समझ गलत थी।
डेकोरगैसिडिस

वहीं, यह कुछ और ही लग रहा है। मुझे अब याद है कि यह आरएमएस के साथ एक साक्षात्कार में था कि उन्होंने इस सुविधा का उल्लेख किया था, शायद यह कुछ पुराने आर्कन सिस्टम थे जो कभी भी अकादमिया के बाहर नहीं रहते थे ... वैसे भी धन्यवाद।
यूडोक्सोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.