2010-11-12 16 views
11

मैं एक निश्चित जवाब की तलाश में हूँ (वास्तव में एक मौजूद हैं) कितना स्मृति पर जब boost::interprocess के managed_shared_memory के माध्यम से साझा स्मृति का एक स्थिर हिस्सा बनाने आवंटित किया जाना चाहिए। यहां तक ​​कि official examples स्मृति के arbitrarily large हिस्सा आवंटित करने के लिए लग रहे हैं।कितना स्मृति 'managed_shared_memory' का आवंटन करना चाहिए? (बढ़ावा)

पर विचार करें निम्नलिखित संरचना:

// Example: simple struct with two 4-byte fields 
struct Point2D { 
    int x, y; 
}; 

मेरे आरंभिक प्रतिक्रिया है कि आवश्यक आकार 8 बाइट्स, या sizeof(Point2D) होगा। यह बुरी तरह विफल रहता है जब मैं एक वस्तु के निर्माण के लिए प्रयास करते हैं, मुझे रनटाइम पर SEG-दोष दे रही है।

// BAD: 8 bytes is nowhere near enough memory allocated. 
managed_shared_memory segment(create_only, "My shared memory", sizeof(Point2D)); 

क्या पढ़ने/लिखने आपरेशन SEG-दोष उत्पन्न कर रहा है? ढेर ऑपरेशन? अस्थायी रूप से segment.construct() भीतर आवंटन? साझा स्मृति आवंटित करते समय कितना ओवरहेड आवश्यक है?

परीक्षण-और-त्रुटि से मैंने पाया कि 4 से आकार को गुणा करने से उपर्युक्त संरचना के लिए काम किया जा सकता है, लेकिन जब मैं अपने struct पर अधिक फ़ील्ड जोड़ना शुरू करता हूं तो अलग हो जाता है। तो, यह एक बुरा हैक की reeks।

कुछ लोग तर्क दे सकते हैं कि आधुनिक पीसी में "स्मृति सस्ता है", लेकिन मैं इस दर्शन से असहमत हूं और अगर मुझे इससे बचा जा सकता है तो मुझे आवंटित करने से नापसंद है। मैं कल बूस्ट डॉक्स के आसपास खोदा और कोई सुझाव नहीं मिला। आज कुछ नया सीखने के लिए यहाँ है!

+1

लोग कुछ यहाँ मेरे साथ असहमत हो सकता है, लेकिन मैं अपने जीवन की "स्मृति सस्ता है" पंक्तियों के साथ कोडित में कभी नहीं किया है। मेमोरी ख़रीदना जरूरी नहीं है कि यह कैसे इस्तेमाल होता है, लेकिन यह बहुत पैसा है। जितना अधिक आप खर्च करेंगे उतना अधिक खर्च करेंगे। मेरे कंप्यूटर के लिए मैंने जो भी मेमोरी अपग्रेड खरीदा है, मैंने अब बहुत तेज कर दिया है कि मैं "अधिक सामान चला सकता हूं"। मैंने हमेशा इस संबंध में रूढ़िवादी रूप से कोड करने की कोशिश की है क्योंकि यह मेरे आवेदन * के लिए जरूरी नहीं है *। वैसे भी, बस उस पर मेरे 2 सी :) –

+0

मैं 100% सहमत हूँ! और यह ** संपूर्ण ** कारण है कि मैं इस सवाल से पूछ रहा हूं। मैंने केवल उस टिप्पणी को फेंक दिया ताकि किसी को यह कहने से मना कर दिया जा सके कि "कौन परवाह करता है, केवल 1k आवंटित करें और इसके साथ किया जाए।" मैं इस पोस्ट में इसे और स्पष्ट करने की कोशिश करूंगा। –

+0

आह ठीक है :) "कुछ तर्क दे सकते हैं" बहुत बेहतर है! –

उत्तर

8

दस्तावेज की this paragraph से:

स्मृति एल्गोरिथ्म एक वस्तु है कि एक साझा स्मृति/स्मृति मैप की गई फ़ाइल खंड की पहली बाइट में रखा जाता है। स्मृति खंड के

लेआउट:

____________ __________ ____________________________________________ 
|   |   |           | 
| memory | reserved | The memory algorithm will return portions | 
| algorithm |   | of the rest of the segment.    | 
|____________|__________|____________________________________________| 

पुस्तकालय एक अतिरिक्त स्मृति भूमि के ऊपर, खंड की शुरुआत में बैठे इस प्रकार आपके अनुरोध आकार के कुछ बाइट्स कब्जे है। this post और this post के अनुसार, अतिरिक्त बाइट्स की इस सटीक संख्या निर्धारित नहीं किया जा सकता:

आप इसे गणना नहीं कर सकते, क्योंकि वहाँ स्मृति आवंटन bookeeping और विखंडन के मुद्दों है कि आपके आवंटन के आधार पर क्रम में बदल रहे हैं/deallocation पैटर्न। और साझा स्मृति ओएस द्वारा पृष्ठों ( खिड़कियों पर linux 64k पर 4K) द्वारा आवंटित किया जाता है, इसलिए किसी भी आवंटन अभ्यास आवंटित एक पृष्ठ पर गोल में हो जाएगा:

managed_shared_memory segment(create_only, "name", 20); 

रूप में एक ही स्मृति बर्बाद करेंगे :

managed_shared_memory segment(create_only, "name", 4096); 
+0

उस पुरानी पोस्ट को ढूंढने के लिए अच्छी नौकरी; मैंने थोड़ी देर के लिए खोज की और सूखी आ गई। तो, "वास्तव में" से आपका मतलब है कि ** कोई ठोस जवाब नहीं है? ** यही वह है जो मुझे आयन गजतागागा की प्रतिक्रिया से मिलता है ... इसके अलावा, बूस्ट दस्तावेज़ों के लिए उस लिंक के लिए धन्यवाद। स्मृति मानचित्र ASCII कला मदद करता है, हालांकि प्रोग्रामिंग में 'मेमोरी एल्गोरिदम' + 'आरक्षित 'निर्धारित करने में मुझे कोई भाग्य नहीं था। लेकिन आखिरकार, यह एक महत्वपूर्ण मुद्दा है क्योंकि मेरे वास्तविक कार्यान्वयन में 5-10 संरचना के उदाहरण हैं (गजतागा द्वारा भी उल्लेख किया गया है)। फिर भी, यह एक वैध सवाल की तरह लगता है, भले ही यह ज्यादातर "अकादमिक" हो। –

+0

आह, * वहां * हम जाते हैं। मुझे पता था कि ओएस पेज का आकार प्रासंगिक विवरण होना चाहिए; ऊपर उद्धरण मेरे संदेह की पुष्टि करता है। ऐसा लगता है कि "सर्वश्रेष्ठ अनुमान" आवंटन करना होगा। एक बार फिर धन्यवाद। –

2

कुछ OS'es स्मृति पेज आकार काम करता है का उपयोग करना। मेरे मामले में यह काम करता है ..

off_t size = sizeof(class1) + (sizeof(class2) * 3); 
// round up to the OS page size. 
long page_size = sysconf(_SC_PAGE_SIZE); 
size = ((size/page_size) + (size % page_size ? 1 : 0)) * page_size; 

बढ़ावा :: managed_shared_memory का उपयोग करके आप जिसके परिणामस्वरूप अंतरिक्ष में वस्तुओं के निर्माण के लिए अनुमति देता है। की तरह ....

shared_memory_object::remove(m_name.c_str()); 
m_shared.reset(new managed_shared_memory(create_only, "myspace", size)); 
m_class1 = m_shared->construct<class1>("class1")(); 
m_class2 = m_shared->construct<class2>("class2")[3](); 
+0

+1 मुझे सिस्टम पेज आकार तक गोल करने का विचार पसंद है। हालांकि, ऐसा लगता है कि हम ** ** मनमाने ढंग से पैडिंग ** बना रहे हैं। इस मामले में "3" - तीन बार 'आकार (वर्ग 2)'। क्या मैं सही हूँ? मैं तब से अन्य परियोजनाओं पर चले गए हैं, लेकिन मुझे अभी भी कम से कम अपशिष्ट के साथ साझा स्मृति आवंटित करने का सबसे अच्छा तरीका है। –

+0

साझा स्मृति क्षेत्र के लिए पृष्ठ आकार का उपयोग करने के लिए मैं वैसे भी नहीं देख सकता। (कोड के दूसरे बिट में एक बग फिक्स्ड।) हालांकि आप उपरोक्त प्रकार के प्रकार को कर सकते हैं जिसे मैं साझा स्मृति क्षेत्र के अंदर कोड के दूसरे बिट में उपयोग कर रहा था। http://en.highscore.de/cpp/boost/interprocesscommunication.html#interprocesscommunication_managed_shared_memory को देखने के कई तरीकों का एक बहुत अच्छा विचार देता है कि उप-आवंटन किया जा सकता है। मैं बेहतर इस संपादक को सीखूंगा ताकि मैं अधिक स्वच्छता से * लिंक कर सकूं * – lprent

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

  • कोई संबंधित समस्या नहीं^_^