2011-02-26 12 views
9

मैं कर्नेल 2.6 है, जो है एक निर्माता प्रक्रिया और उपभोक्ता के एन प्रक्रियाओं, जो डेटा पर कोई बदलाव नहीं है के साथ एक नेटवर्क डेमॉन लिख रहा हूँ, लिनक्स पर, और किसी भी प्रतिक्रिया के लिए वापस नहीं बनाता है उत्पादक।साझा-स्मृति परिणामों के साथ प्रक्रियाओं के बीच संचार शून्य-प्रतिलिपि?

जब भी निर्माता प्रक्रिया डेटा ऑब्जेक्ट उत्पन्न करती है, जिसमें लंबाई कुछ 10 बाइट्स से कुछ 10 के-बाइट्स तक भिन्न होती है, तो इसे डेटा ऑब्जेक्ट को एक उपलब्ध उपभोक्ता प्रक्रिया में पास करना होता है।

पहली बार, मैंने नामित/अज्ञात पीआईपीई का उपयोग करने के लिए माना। हालांकि, वे मेमोरी-कॉपी ओवरहेड होंगे।

  1. उत्पादक उपयोगकर्ता के अंतरिक्ष बफर --copy -> कर्नेल-स्थान पाइप बफर
  2. कर्नेल-स्थान पाइप बफर --copy -> उपभोक्ता के उपयोगकर्ता के अंतरिक्ष बफर

कार्यक्रम के बाद से कम विलंबता के साथ बड़ी संख्या में साथियों के साथ काम कर सकते हैं, कॉपी-ओवरहेड हानिकारक हो सकता है। इस प्रकार, मैंने एमओएसएपी() के साथ पॉज़िक्स साझा-मेमोरी का उपयोग करने का निर्णय लिया।

मैं सोच रहा हूं कि का उपयोग कर प्रक्रियाओं के बीच डेटा साझा करना एमओएसएपी() के साथ पॉज़िक्स साझा-मेमोरी का परिणाम किसी भी स्मृति-प्रति का परिणाम नहीं है, पीआईपीई के विपरीत।

इसके अलावा, क्या प्रक्रियाओं के बीच डेटा साझा करने का कोई अन्य तरीका है, लेकिन शून्य-प्रति परिणाम? प्रोग्राम लिनक्स पर कर्नेल के हाल के संस्करण के साथ चलाया जाएगा और इसमें क्रॉस-प्लेटफ़ॉर्म क्षमता नहीं हो सकती है।

मैंने तय किया कि प्रत्येक उपभोक्ता/उपज के लिए धागा को स्पैन/रन न करें, लेकिन डिज़ाइन समस्याओं के कारण प्रक्रिया।

उत्तर के लिए धन्यवाद।

उत्तर

5

सामान्य रूप से साझा स्मृति विशेष रूप से कॉपी ओवरहेड (स्रोत: http://www.boost.org/doc/libs/1_46_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory.shared_memory_what_is) का कारण नहीं बनने के लिए डिज़ाइन की गई है।

यदि आप सी ++ का उपयोग कर रहे हैं, तो बूस्ट :: इंटरप्रोसेस एक क्रॉस-प्लेटफ़ॉर्म तरीके में जो वर्णन कर रहा है उसे लागू करने के लिए एक महान लाइब्रेरी है - आप उनकी साझा मेमोरी क्लास को name_upgradable_mutex के साथ संयुक्त कर सकते हैं। Name_upgradable_mutex क्लास को संसाधन पर अनन्य और तेज़ ताले देने के लिए समर्थन है, ताकि आप इसके साथ अपने उपभोक्ता-निर्माता मॉडल को आसानी से कार्यान्वित कर सकें। (स्रोत: http://www.boost.org/doc/libs/1_37_0/doc/html/boost/interprocess/named_upgradable_mutex.html#id2913393-bb)

2

साझा-स्मृति को किसी भी प्रतियां (कैश कोहेरेंसी को छोड़कर) नहीं पेश करनी चाहिए, और आप सीधे स्मृति तक पहुंच सकते हैं ताकि आप अपने कोड में प्रतियों से बच सकें।

0

हां यह शून्य प्रतिलिपि होना चाहिए।

हालांकि, यह भी एक (संभवतः समयपूर्व) अनुकूलन है और आपको यह सुनिश्चित करने के लिए काफी सावधानी बरतनी होगी कि आपकी प्रक्रिया आवंटन/डीलोकेशन/साझा स्मृति की संशोधितता के साथ उचित रूप से सहयोग करे। समवर्ती पहुंच समस्याओं से बचने के लिए आपको निश्चित रूप से किसी प्रकार की म्यूटेक्स की आवश्यकता होगी।

व्यक्तिगत रूप से मैं पाइप का उपयोग तब तक करता हूं जब तक कि प्रदर्शन एक उचित मुद्दा न हो जाए। यदि यह वास्तव में करता है, बूस्ट :: इंटरप्रोसेस या इसी तरह की लाइब्रेरी का उपयोग करने का सुझाव उचित है।

+4

प्रक्रियाओं के बीच डेटा कितनी बड़ी मात्रा में स्थानांतरित किया गया है यह तय करना "समयपूर्व अनुकूलन" नहीं है, यह "आवश्यक वास्तुकला" है। सभी अनुकूलन (या डिज़ाइन, या आर्किटेक्चर) "समयपूर्व" नहीं है। –

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