2014-10-10 6 views
5

मैं प्रक्रियाओं के बीच कुछ तार साझा करने के लिए बढ़ावा :: इंटरप्रोसेस :: वेक्टर उपयोग कर रहा हूँ, और मुझे यकीन है कि मैं साझा स्मृति खंड में वह जीता है अतिप्रवाह नहीं है बनाना चाहते हैं।साझा स्मृति में एक बूस्ट इंटरप्रोसेस वेक्टर के आकार को कैसे मापूं?

मैं कैसे कितनी जगह पाते हैं वेक्टर स्मृति में लेता है, और एक विशेष खंड-आवंटित स्ट्रिंग कितनी मेमोरी लेगी?

typedef boost::interprocess::managed_shared_memory::segment_manager SegmentManager; 
typedef boost::interprocess::allocator<char, SegmentManager> CharAllocator; 
typedef boost::interprocess::basic_string<char, std::char_traits<char>, CharAllocator> ShmString; 
typedef boost::interprocess::allocator<ShmString, SegmentManager> StringAllocator; 
typedef boost::interprocess::vector<ShmString, StringAllocator> ShmStringVector; 

const size_t SEGMENT_SIZE = ...; 

addToSharedVector(std::string localString){ 
    using namespace boost::interprocess; 
    managed_shared_memory segment(open_only, kSharedMemorySegmentName); 
    ShmStringVector *shmvector = segment.find<ShmStringVector>(kSharedMemoryVectorName).first; 

    size_t currentVectorSizeInShm = ?????(shmvector);   <-------- HALP! 
    size_t sizeOfNewStringInSharedMemory = ?????(localString); <-------- 

    //shared mutex not shown for clarity 

    if (currentVectorSizeInShm + sizeOfNewStringInSharedMemory < SEGMENT_SIZE) { 
     CharAllocator charAllocator(segment.get_segment_manager()); 
     ShmString shmString(charAllocator); 
     shmFunctionName = localString.c_str(); 
     shmvector->push_back(shmString); 
    } 
} 

उत्तर

4
  1. त्वरित और गंदे

    आप साझा स्मृति एक शारीरिक रूप से मैप किया फ़ाइल बनाने के लिए और देखने के कितने पृष्ठों वास्तव में डिस्क के लिए प्रतिबद्ध किया गया है सकते हैं। यह आपको कई कार्यान्वयन पर एक मोटा संकेत देता है क्योंकि पृष्ठ एक समय में संभवतः 1 प्रतिबद्ध होते हैं, और सामान्य मेमोरी पेज आकार 4kb होते हैं।

    मैं एक उत्तर है [1] कि आप इस विधि की मूल बातें पता चलता है।

  2. आप सेगमेंट मैनेजर पर get_free_memory() का उपयोग कर सकते हैं। ध्यान दें कि यह नहीं कहता कि उस वेक्टर के लिए आवंटित/बस/क्या है, लेकिन यह आपको वास्तव में पर कितना स्थान है, यह एक (तर्कसंगत रूप से अधिक उपयोगी) विचार देता है।

में another answer[2] मैं का इस्तेमाल किया है कि सन्निहित भंडारण बनाम नोड आधारित कंटेनर के साथ डेटा कंटेनरों के बीच स्मृति भूमि के ऊपर में बेंचमार्क मतभेद के।

enter image description here

आप देख सकते हैं, अलग-अलग आवंटन उच्च भूमि के ऊपर है, और पुनः आबंटन विखंडन के वास्तव में जल्दी से ले जाता है। तो यह अंतरिक्ष आरक्षित साझा मेमोरी क्षेत्र का बेहतर उपयोग करने के लिए विशेष बूस्ट Interprocess allocators का उपयोग कर reallocations

  • को रोकने के लिए समय से आगे

    • को देख लायक है

    [1]देखेंMemory Mapped Files, Managed Mapped File and Offset Pointer

    [2] देख Bad alloc is thrown

  • +0

    ओह, वैसे, त्वरित और गंदा विधि इस जवाब में दिखाया गया है: http://stackoverflow.com/a/21009839/85371 – sehe

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