2012-08-02 3 views
8

में स्मृति आवंटित करते समय मैं सी ++ में सीमित मेमोरी (टेग्रा 2) के साथ एम्बेडेड सिस्टम के लिए एप्लिकेशन विकसित कर रहा हूं। मैं new और new[] के पूरे परिणामों को पूरा करता हूं जो कभी-कभी होता है लेकिन एप्लिकेशन इसे संभालने में सक्षम है।सिगकिल सी ++

समस्या यह है कि अगर सिस्टम पूरी तरह से बाहर निकलता है तो सिस्टम सिगकिल द्वारा प्रक्रिया को मारता है। क्या मैं किसी भी तरह से बता सकता हूं कि new को प्रक्रिया को मारने के बजाय नल वापस लौटना चाहिए?

+1

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन आप का उपयोग करने के लिए "नया (nothrow)" http://www.cplusplus.com/reference/std/ कोशिश कर सकते हैं नया/नोट्रो/ –

+0

मैं ज्यादातर मामलों में करता हूं, निश्चित रूप से जब मैं बड़ी मात्रा में स्मृति आवंटित कर रहा हूं। कुछ मामलों में मैं नए (std :: nothrow) को नया लिखने के लिए बहुत आलसी था लेकिन मुझे लगता है कि प्रक्रिया सिगकील के बजाय अपवाद के साथ समाप्त हो जाएगी। – Blackhex

उत्तर

11

मुझे यकीन है कि ओएस की किस तरह आप प्रयोग कर रहे हैं नहीं कर रहा हूँ, लेकिन अगर यह opportunistic memory allocation का समर्थन करता है लिनक्स की तरह आप की जाँच करनी चाहिए।

यह सक्षम है, तो निम्नलिखित हो सकता है:

  1. आपका new या malloc गिरी से एक मान्य पता हो जाता है। भले ही पर्याप्त स्मृति न हो, क्योंकि ...
  2. कर्नेल वास्तव में पहली पहुंच के क्षण तक स्मृति को आवंटित नहीं करता है।
  3. यदि सभी "अतिसंवेदनशील" स्मृति का उपयोग किया जाता है, तो ऑपरेटिंग सिस्टम में कोई मौका नहीं है लेकिन इसमें शामिल प्रक्रियाओं में से एक को मारना है। (कार्यक्रम को बताने में बहुत देर हो चुकी है कि पर्याप्त स्मृति नहीं है।) लिनक्स में, इसे Out Of Memory Kill (OOM Kill) कहा जाता है। इस तरह की हत्या कर्नेल संदेश बफर में लॉग इन हो जाती है।

समाधान: स्मृति के अक्षम overcommitting: echo 2 > /proc/sys/vm/overcommit_memory

1

दो विचार दिमाग में आते हैं।

1.) new पर सीधे इसके बजाय अपना स्वयं का मेमोरी आवंटन फ़ंक्शन लिखें। आपने बताया है कि आप एक एम्बेडेड सिस्टम पर हैं, जहां विशेष आवंटक अनुप्रयोगों में काफी आम हैं। क्या आप सीधे अपने हार्डवेयर पर हार्डवेयर चला रहे हैं या आप एक कार्यकारी/ओएस परत के तहत एक प्रक्रिया में चल रहे हैं? यदि उत्तरार्द्ध, स्मृति आवंटित करने के लिए एक सिस्टम एपीआई प्रदान की जाती है?

2.) सी ++ set_new_handler देखें और देखें कि यह आपकी मदद कर सकता है या नहीं। आप अनुरोध कर सकते हैं कि new आवंटन विफल होने पर एक विशेष फ़ंक्शन लागू किया जाता है। शायद उस समारोह में आप निष्पादन से प्रक्रिया को मारने वाले किसी भी चीज़ को रोकने के लिए कार्रवाई कर सकते हैं। संदर्भ: http://www.cplusplus.com/reference/std/new/set_new_handler/

+0

जोड़ें 1) हां, यह एक तरीका है कि इसे कैसे कामयाब किया जाए, लेकिन अगर सिस्टम-कॉन्फ़िगरेशन-आधारित समाधान हो सकता है तो मैं इस तरह से जाने के लिए बहुत आलसी था। यह ओपन एंबेडेड डिस्ट्रूब्यूशन है जो "वास्तविक" एम्बेडेड सिस्टम की तुलना में काफी भारी वजन है। मुझे नहीं पता कि विशेष मेमोरी आवंटन के लिए कोई एपीआई है या नहीं। कोई संकेत? जोड़ें 2) महान अंतर्दृष्टि, मैं कोशिश करूँगा। – Blackhex