2010-09-21 11 views
10

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

मैं मेमोरी मैप किए गए फ़ाइल पर एक ही प्रभाव कैसे प्राप्त करूं?

मेमोरी मैप की गई फ़ाइलें बस बाइट सरणी हैं, इसलिए यदि मैं बाइट सरणी को संशोधित करता हूं, तो ऑपरेटिंग सिस्टम को "पूर्ण" लिखने पर विचार करने का कोई तरीका नहीं है, इसलिए यह हो सकता है (भले ही यह असंभव है) बस मेरे ब्लॉक-लेखन ऑपरेशन के बीच में स्मृति, और असल में मैं आधा ब्लॉक लिखता हूं।

मुझे कुछ प्रकार के "प्रवेश/छोड़ने के महत्वपूर्ण खंड" की आवश्यकता होगी, या फ़ाइल के पृष्ठ को "पिनिंग" करने की कुछ विधि स्मृति में याद आती है। क्या ऐसा कुछ मौजूद है? यदि हां, तो क्या यह पोर्टेबल सामान्य POSIX सिस्टम & विंडोज़ में पोर्टेबल है?

+0

आपकी मैप की गई फ़ाइल के साथ कितने एप्लिकेशन इंटरैक्ट कर रहे हैं? – Justin

+0

केवल एक प्रक्रिया, यानी, डेटाबेस सर्वर। –

उत्तर

4

journal रखने की तकनीक एकमात्र तरीका प्रतीत होता है। मुझे नहीं पता कि यह एक ही फ़ाइल में लिखने वाले एकाधिक ऐप्स के साथ कैसे काम करता है। जर्नल के साथ प्रदर्शन कैसे करें इस पर कैसंद्रा प्रोजेक्ट में good article है। महत्वपूर्ण बात यह सुनिश्चित करने के लिए है कि जर्नल केवल सकारात्मक क्रियाओं को रिकॉर्ड करता है (मेरा पहला दृष्टिकोण पत्रिका को प्रत्येक लिखने की पूर्व-छवि लिखना था जो आपको रोलबैक करने की इजाजत देता था, लेकिन यह अत्यधिक जटिल हो गया था)। [header[cksum]] [header[cksum]]:

तो मूल रूप से अपनी स्मृति-मैप की गई फ़ाइल यदि आपके शीर्षक एक ब्लॉक आप जानते हैं कि यह भ्रष्ट नहीं किया जाएगा, हालांकि कई लोग इसे दो बार लिखने के लिए चेकसम साथ लगते में फिट बैठता है, शीर्षक में एक transactionId है। यदि पहला चेकसम विफल रहता है, तो दूसरे का उपयोग करें।

[beginTxn[txnid]] [offset, length, data...] [commitTxn[txnid]] 

तुम बस जब तक यह बहुत बड़ा हो जाता है पत्रिका रिकॉर्ड जोड़कर रखना है, तो यह कुछ बिंदु पर रोल ओवर:

पत्रिका कुछ इस तरह लग रहा है। जब आप अपना प्रोग्राम शुरू करते हैं तो आप यह देखने के लिए जांच करते हैं कि फ़ाइल के लिए लेनदेन आईडी जर्नल की अंतिम लेनदेन आईडी पर है - यदि आप जर्नल में सिंक करने के लिए सभी लेन-देन वापस नहीं खेलते हैं।

+0

हां, जर्नलिंग जाने का रास्ता है, मैं उन एल्गोरिदम से अवगत हूं। लेकिन समस्या यह है कि एक पत्रिका का उपयोग करते समय भी आपको यह गारंटी देना होगा कि डेटा फ़ाइल के अलग-अलग पृष्ठ केवल पूर्ण रूप से लिखे गए हैं, अन्यथा आपको "अर्ध-लिखित" पृष्ठ का जोखिम होता है, और आप यह नहीं पता लगा सकते हैं कि यह दूषित है या नहीं। यही कारण है कि मैं मैप की गई फ़ाइलों में पृष्ठों के परमाणु लिखने का एक तरीका ढूंढ रहा हूं। –

+1

यह काम क्यों नहीं करता है: partialWrite = (file.transaction-id Justin

+0

@ मार्टिनप्रॉस्ट: आप पृष्ठों के परमाणु लेखन नहीं कर सकते हैं। यह विंडोज कर्नेल के लिए मूल रूप से असीमित ऑपरेशन है, मुझे विश्वास है। आप शायद 'फ्लशफाइलबफर' विन एपीआई फ़ंक्शन को देखना चाहेंगे। – Noldorin

संबंधित मुद्दे