2010-07-14 14 views
12

का उपयोग कर C/C++ लिनक्स के तहत में बिना सबसे बड़ा बफर आवंटन, मैं स्मृति की एक बड़ी (कई गीगाबाइट) ब्लॉक आवंटित करने के लिए, क्रम में ईथरनेट बंदरगाह और स्ट्रीमिंग डेटा से जुड़ा एक सेंसर से वास्तविक समय डाटा स्टोर करने में की जरूरत है लगभग 110 एमबी/एस। मैं डेटा अनुक्रम की लंबाई को अधिकतम करने के लिए संभवतः स्मृति की सबसे बड़ी मात्रा आवंटित करना चाहता हूं। हालांकि, मैं यह भी सुनिश्चित करें कि वहाँ कोई डिस्क-स्वैपिंग हो जाएगा बनाने के लिए, के बाद से, जिसके परिणामस्वरूप देरी और डिस्क पहुँच के सीमित बैंडविड्थ सेंसर के (बहुत ही सीमित) बफर अतिप्रवाह का कारण बनता है की जरूरत है।स्वैप

आवंटित करने के लिए कितनी स्मृति निर्धारित करने के लिए सबसे अच्छा तरीका क्या है? मैं सिर्फ सूचना दी मुक्त स्मृति की तुलना में एक थोड़ा छोटा ब्लॉक आवंटन तक ही सीमित है, या मैं और अधिक सीधे लिनक्स वर्चुअल स्मृति प्रबंधक के साथ इंटरफेस कर सकते हैं हूँ?

+0

शुद्ध रूप से ब्याज से बाहर, आप किस सेंसर का उपयोग कर रहे हैं? – Konrad

+0

http://stackoverflow.com/questions/2513505/ –

+0

@ Space_C0wb0y का डुप्लिकेट: यह वास्तव में नहीं है। – Hasturkun

उत्तर

9

ठीक है, linux के तहत आप उपयोग कर सकते हैं()/mlockall() भौतिक स्मृति में एक पता रेंज रखने के लिए और इसे बाहर बदली होने से रोकने के। मैलॉक का उपयोग करने की प्रक्रिया को ऐसा करने के लिए कुछ विशेषाधिकारों की आवश्यकता होती है, "मैन मॉक" में विवरण हैं। मुझे अधिकतम mlock'able ब्लॉक के बारे में निश्चित नहीं है (यह "मुक्त" प्रतीत होता है से भिन्न हो सकता है), तो शायद एक बाइनरी खोज मदद कर सकती है (एक सीमा को लॉक करें, अगर यह क्षेत्र के आकार को कम करने में विफल रहता है ..)

दूसरी ओर, 110 एमबी/एस वास्तव में सॉलिड-स्टेट-ड्राइव के लिए कोई समस्या नहीं है। 280 एमबी/एस लिखने की गति के साथ एक 60 जीबी एसएसडी कोने पर लगभग $ 200 खर्च होता है। बस सेंसर डेटा को एक छोटे से लिखने वाले बफर में कॉपी करें और एसएसडी को स्ट्रीम करें।

0

यदि आप malloc आवश्यक स्मृति की मात्रा और उस गति पर लिखते हैं, तो आपको अभी भी सभी पृष्ठ दोषों के कारण प्रदर्शन प्रदर्शन मिलेगा (यानी वर्चुअल मेमोरी के प्रत्येक पृष्ठ को भौतिक स्मृति में मैप करना, जिसमें भी शामिल हो सकता है अन्य प्रक्रियाओं की स्मृति को स्वैप करना)।

इससे बचने के लिए, आप सेंसर से पढ़ने शुरू करने से पहले memset पूरे आवंटित बफर 0 पर कर सकते हैं, ताकि सभी आवश्यक वर्चुअल मेमोरी को भौतिक स्मृति में मैप किया जा सके।

यदि आप केवल उपलब्ध भौतिक मेमोरी का उपयोग करते हैं, तो आपको बिल्कुल स्वैपिंग नहीं करना चाहिए। अधिक उपयोग करने से अन्य प्रक्रियाओं की स्मृति डिस्क पर बदल दी जाएगी - यदि ये प्रक्रिया निष्क्रिय हैं, तो इसे किसी भी समस्या का सामना नहीं करना चाहिए। अगर वे सक्रिय, (अर्थात एक समय में एक बार उनकी स्मृति का उपयोग), कुछ गमागमन घटित होता - शायद हार्ड ड्राइव बैंडविड्थ तुलना में काफी कम दर में। अधिक स्मृति का उपयोग करें, और अधिक सक्रिय प्रक्रियाओं 'स्मृति बदली किया जाएगा, और अधिक HD गतिविधि घटित होता - इस बिंदु पर आप सभ्य प्रदर्शन के साथ इस्तेमाल कर सकते हैं स्मृति के अधिक से अधिक राशि काफी परीक्षण और त्रुटि का परिणाम है।

उपलब्ध भौतिक स्मृति से अधिक का उपयोग करके, आप निश्चित रूप से स्मृति लिखने की दर से स्वैपिंग का कारण बनेंगे, और इससे बचने का कोई तरीका नहीं है।

+2

भौतिक स्मृति आवंटित करने के लिए सिस्टम को ट्रिक करने के लिए 'memset()' का उपयोग करने की आवश्यकता नहीं है। इसे स्पष्ट रूप से करने के लिए 'mlock() 'का उपयोग करें, और सुनिश्चित करें कि यह कभी भी स्वैप नहीं हुआ है। –

+0

इसे इंगित करने के लिए धन्यवाद। –

0

यह निर्धारित करने का सबसे अच्छा तरीका क्या है कि कितनी मेमोरी आवंटित की जाए?

कैसे आभासी स्मृति प्रयोग किया जाता है, गैर swappable कर्नेल स्मृति के कारण, यह पहचान करने के लिए कैसे स्थापित मेमोरी की ज्यादा एक आवेदन द्वारा पहुँचा जा सकता लगभग असंभव है।

सबसे अच्छा मैं आ सकता हूं कि उपयोगकर्ता को यह कॉन्फ़िगर करने की अनुमति दी जा सके कि बफरिंग के लिए कितनी मेमोरी उपयोग की जाए।

मैं सिर्फ सूचना दी मुक्त स्मृति की तुलना में एक थोड़ा छोटा ब्लॉक आवंटन तक ही सीमित हूँ,

की सूचना दी मुक्त स्मृति वास्तव में नहीं है "मुक्त भौतिक स्मृति।" दुर्भाग्य से।

या क्या मैं लिनक्स वर्चुअल मेमोरी मैनेजर के साथ अधिक सीधे इंटरफ़ेस कर सकता हूं?

यह कस्टम डिवाइस ड्राइवर का उपयोग करके किया जा सकता है, सीधे कर्नेल स्पेस में मेमोरी आवंटित किया जा सकता है और mmap() के माध्यम से इसका उपयोग प्रदान कर सकता है। आम तौर पर अनुशंसित नहीं है, फिर भी आपके जैसे विशेष मामलों में काम करेगा।

हालांकि, मैं भी है कि वहाँ हो जाएगा कोई डिस्क-गमागमन

लिनक्स कर्नेल विकास की गति में ज्ञान अप्रचलित काफी तेजी से हो जाता है, तो नमक की अनाज के साथ ले सुनिश्चित करने की आवश्यकता है कि मैं क्या मैं यहाँ कह रहा हूँ। आप निम्न के साथ खेलने का प्रयास कर सकते हैं:

  1. SysV साझा स्मृति। यह आमतौर पर स्वैप नहीं किया जाता है। man shmget देखें।

  2. tmpfs - इन-मेमोरी फ़ाइल सिस्टम। स्मृति को कम से कम 2.6 कर्नेल में रैम पर पिन किया गया था और इस प्रकार swappable नहीं था। इसे स्मृति के रूप में उपयोग करने के लिए, फ़ाइल में tmpfs, write() पर फ़ाइल बनाएं (वास्तव में स्मृति आवंटित करने के लिए मजबूर करें) और फिर फ़ाइल को mmap() करें।

+0

बस रिकॉर्ड्स के लिए, * tmpfs * वास्तव में swappable है। एक और संस्करण * rootfs * है जो कभी भी स्वैप नहीं किया जाएगा। लेकिन इसके कारण आपको इसके साथ वास्तव में सावधान रहना होगा और इसे ओवरस्ट्रेस नहीं करना चाहिए। –

0

के बाद आप अपनी स्मृति का आवंटन, आप

echo 0 > /proc/sys/vm/swappiness 

गिरी के बजाय कैश से स्मृति सुधारने की अदला-बदली करने के लिए पसंद करते हैं मांग सकते हैं।

बस मेरे mlock $ 0.2

+1

सवाल यह नहीं पूछ रहा है कि स्वैपिंग को कैसे रोकें, यह पूछने के लिए कि कैसे स्वैप करने की आवश्यकता के बिना कितनी मेमोरी आवंटित की जा सकती है। और आप 'मैलॉक()' का उपयोग करके किसी विशेष बफर के लिए स्वैपिंग को रोकते हैं, स्मृति प्रबंधक को सिस्टम-व्यापी हैक नहीं। –

+0

धन्यवाद, जानना अच्छा है। :) – miedwar

3

यदि कंप्यूटर सिस्टम आपके सेंसर से डेटा प्राप्त करने के लिए समर्पित है, तो आप बस स्वैप अक्षम कर सकते हैं। फिर बड़े बफर के रूप में आवंटित करें, क्योंकि आप केवल आवश्यक उपकरणों के लिए सिस्टम में पर्याप्त स्मृति छोड़ सकते हैं।

+0

अफसोस की बात यह एक समर्पित प्रणाली नहीं है। हालांकि, इसके अन्य उपयोगों के लिए इसमें बहुत सी रैम है, इसलिए स्वैप अक्षम करना एक विकल्प हो सकता है। –

+0

कुछ समय के लिए मेमोरी उपयोग की जांच करें। आप देख सकते हैं कि स्वैप का कभी भी उपयोग नहीं किया जाता है जब तक कि कुछ एप्लिकेशन पागल की तरह स्मृति को लीक करना शुरू नहीं करते हैं। मैं बिना किसी समस्या के स्वैप-कम डेस्कटॉप सिस्टम चला रहा हूं। लेकिन अधिक सामान्य समाधान के लिए लूथर सलाह के रूप में मॉक (2) का उपयोग करें। और एक निरंतर बफर के रूप में सबकुछ आवंटित न करें। मेमोरी मैनेजर को आवंटित करने में समस्या हो सकती है (या फिर से आवंटित)। कुछ इंटरफ़ेस द्वारा एक से जुड़े कई छोटे बफर का उपयोग करें। इस तरह आप उदा। रनटाइम पर बफर आकार ट्यून करें। –

+0

"बफर" वर्तनी के लिए अंगूठे: पी! – Cray

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