2012-06-12 24 views
8

मैं एक बड़ी बफर है:कांटा() आईएनजी की प्रति-ऑन-राइट व्यवहार जाओ, कांटा के बिना()

char *buf = malloc(1000000000); // 1GB 

अगर मैं एक नई प्रक्रिया काँटेदार, यह एक buf जिसके साथ स्मृति साझा करना होगा माता-पिता की बफ जब तक कि एक या दूसरे ने इसे लिखा न हो। फिर भी, कर्नेल द्वारा केवल एक नया 4KiB ब्लॉक आवंटित करने की आवश्यकता होगी, बाकी को साझा करना जारी रहेगा।

मैं बफ की एक प्रति बनाना चाहता हूं, लेकिन मैं केवल प्रतिलिपि को बदलने जा रहा हूं। मैं फोर्किंग के बिना कॉपी-ऑन-राइट व्यवहार चाहता हूं। (जैसे आप फोर्किंग करते समय मुफ्त में आते हैं।)

क्या यह संभव है?

+0

सुनिश्चित करें, लेकिन यह 'मुक्त नहीं होगा' - आपको अपने स्वयं के मेमोरी प्रबंधन और परिवर्तनों का ट्रैक रखना होगा। –

+1

हां, मैं 'मुफ्त में' चाहता हूं। मैं सोच रहा था कि क्या कोई एमएमएपी आधारित समाधान था, या हो सकता है कि मैंने कुछ कल्पना भी नहीं की थी। – fadedbee

+0

शायद MAP_ANONYMOUS के साथ mmap और MAP_PRIVATE नौकरी करेगा? – fadedbee

उत्तर

9

आप ब्लॉक के लिए डिस्क या एक पॉज़िक्स साझा मेमोरी सेगमेंट (shm_open) पर एक फ़ाइल बनाना चाहते हैं। पहली बार, इसे MAP_SHARED के साथ मानचित्र करें। जब आप एक प्रतिलिपि बनाने के लिए तैयार होते हैं और गाय पर स्विच करते हैं, तो को MAP_FIXED और MAP_PRIVATE पर अपने मूल मानचित्र के शीर्ष पर मानचित्र बनाने के लिए, और दूसरी प्रतिलिपि बनाने के लिए MAP_PRIVATE पर कॉल करें। यह आपको उन प्रभावों को प्राप्त करना चाहिए जो आप चाहते हैं।

+1

यह बहुत उत्साहजनक लग रहा है, लेकिन मैं इसे काम नहीं कर सकता। मुझे बस त्रुटि मिलती है (लाइन 13 पर)। fd == 3. क्या आप मेरी बेवकूफ गलती को इंगित कर सकते हैं? https://gist.github.com/2924412 – fadedbee

+1

साझा मेमोरी सेगमेंट को आकार देने के लिए आपको 'ftruncate' की आवश्यकता है। प्रारंभिक आकार शून्य है। –

+0

धन्यवाद, मैंने एक ftruncate जोड़ा और अब बस त्रुटि के बजाय एक segfault है, अभी भी 14 लाइन पर। – fadedbee

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