2010-12-13 22 views
11


मैं एक छोटे से आवेदन है कि मैं अभी चल रहा था है और मैं अगर मैं इसे किसी भी मेमोरी लीक की जांच करना चाहता था इसलिए मैं कोड के इस टुकड़े में डाल:गैर स्वैच्छिक संदर्भ स्विच: मैं उन्हें कैसे रोक सकता हूं?

for (unsigned int i = 0; i<10000; i++) { 
    for (unsigned int j = 0; j<10000; j++) { 
     std::ifstream &a = s->fhandle->open("test"); 
     char temp[30]; 
     a.getline(temp, 30); 
     s->fhandle->close("test"); 
    } 
} 

जब मैं आवेदन भाग गया मैं यह देखने के लिए कि क्या स्मृति बढ़ती है, cateded/proc // स्थिति। ,

Name: origin-test 
State: R (running) 
Tgid: 7267 
Pid: 7267 
PPid: 6619 
TracerPid: 0 
Uid: 1000 1000 1000 1000 
Gid: 1000 1000 1000 1000 
FDSize: 256 
Groups: 4 20 24 46 110 111 119 122 1000 
VmPeak: 183848 kB 
VmSize: 118308 kB 
VmLck:   0 kB 
VmHWM:  5116 kB 
VmRSS:  5116 kB 
VmData:  9560 kB 
VmStk:  136 kB 
VmExe:  28 kB 
VmLib:  11496 kB 
VmPTE:  240 kB 
VmSwap:  0 kB 
Threads: 2 
SigQ: 0/16382 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000000 
SigBlk: 0000000000000000 
SigIgn: 0000000000002004 
SigCgt: 00000001800044c2 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
CapEff: 0000000000000000 
CapBnd: ffffffffffffffff 
Cpus_allowed: 3f 
Cpus_allowed_list: 0-5 
Mems_allowed: 00000000,00000001 
Mems_allowed_list: 0 
voluntary_ctxt_switches: 120 
nonvoluntary_ctxt_switches: 26475 

मूल्यों में से कोई भी पिछले एक को छोड़कर बदल दिया तो यह अर्थ है कि वहाँ कोई मेमोरी लीक कर रहे हैं: उत्पादन क्रम के बारे में 2 मिनट के बाद निम्नलिखित है?

लेकिन क्या अधिक महत्वपूर्ण है और मैं क्या जानना चाहता हूं, अगर यह बुरा है कि अंतिम मूल्य तेजी से बढ़ रहा है (लगभग 2 मिनट में लगभग 26475 स्विच!)।

मैं कुछ अन्य अनुप्रयोगों को देखा तुलना करने के लिए कितना गैर volunary स्विच वे हैं:

  1. फ़ायरफ़ॉक्स: लगभग 200
  2. Gdm: 2
  3. Netbeans: 19

फिर मैंने गुमराह किया और कुछ सामान पाया लेकिन यह समझने के लिए मेरे लिए तकनीकी है। मुझे इससे क्या मिला है यह तब होता है जब एप्लिकेशन प्रोसेसर या कुछ स्विच करता है? (मेरे पास एक एमडी 6-कोर प्रोसेसर बीटीडब्ल्यू है)।

मैं अपने आवेदन को ऐसा करने से कैसे रोक सकता हूं और एप्लिकेशन चलाने पर यह कितनी दूर हो सकती है?

अग्रिम धन्यवाद, रॉबिन।

+1

चूंकि आप शायद लिनक्स पर हैं, इसलिए संभव स्मृति रिसाव खोजने में आपकी सहायता के लिए वालग्रिंड का उपयोग क्यों न करें? – Palmik

+0

मुझे समझ में नहीं आता कि आपको लगता है कि कोड आपको स्मृति रिसाव की जांच करने में मदद करेगा। – Ferruccio

+0

खैर, मुझे लगता है कि यह उन इनपुट फ़ाइल स्ट्रीम को आवंटित/नष्ट करने वाले कोड में स्मृति रिसाव खोजने में उसकी मदद कर सकता है। –

उत्तर

19

स्वैच्छिक संदर्भ स्विच तब होता है जब आपका एप्लिकेशन किसी सिस्टम कॉल में अवरुद्ध होता है और कर्नेल इसे किसी अन्य प्रक्रिया में समय का टुकड़ा देने का निर्णय लेता है।

गैर स्वैच्छिक संदर्भ स्विच तब होता है जब आपके एप्लिकेशन ने शेड्यूलर को इसके लिए जिम्मेदार ठहराया गया है (कर्नेल यह दिखाने का प्रयास करता है कि प्रत्येक एप्लिकेशन में स्वयं के लिए पूरा कंप्यूटर है, और जितना सीपीयू वे चाहते हैं, उसका उपयोग कर सकते हैं, लेकिन एक से दूसरे में स्विच करने के लिए ताकि उपयोगकर्ता को भ्रम हो कि वे सभी समानांतर में चल रहे हैं)।

आपके मामले में, जब से आप एक ही फ़ाइल से खोल रहे हैं, बंद कर रहे हैं और पढ़ रहे हैं, तो संभवतः यह प्रक्रिया के पूरे निष्पादन के दौरान वर्चुअल फ़ाइल सिस्टम कैश में रहेंगे, और इस कार्यक्रम को कर्नेल द्वारा इसे पसंद किया जा रहा है अवरुद्ध नहीं है (या तो सिस्टम या लाइब्रेरी कैश के कारण)। दूसरी तरफ, फ़ायरफ़ॉक्स, जीडीएम और नेटबीन ज्यादातर उपयोगकर्ता या नेटवर्क से इनपुट की प्रतीक्षा कर रहे हैं, और कर्नेल द्वारा इसे पूर्ववत नहीं किया जाना चाहिए।

उन संदर्भ स्विच हानिकारक नहीं हैं। इसके विपरीत, यह आपके प्रोसेसर को सभी एप्लिकेशन द्वारा उचित रूप से उपयोग करने की इजाजत देता है, भले ही उनमें से कोई कुछ संसाधनों की प्रतीक्षा कर रहा हो।

और बीटीडब्ल्यू, मेमोरी लीक का पता लगाने के लिए, एक बेहतर समाधान एक उपकरण का उपयोग करना होगा इसके लिए, जैसे valgrind

+6

दूसरे शब्दों में, यह कोई समस्या नहीं है, इस प्रकार यूनिक्स काम करता है। –

+3

यूनिक्स से अधिक, प्रत्येक प्रीपेप्टिव मल्टीटास्किंग ऑपरेटिंग सिस्टम (यानी, सामान्य उपयोग में लगभग हर ऑपरेटिंग सिस्टम)। –

+0

गैर-स्वैच्छिक? या आप स्वैच्छिक मतलब था? जैसा कि मैं इसे समझता हूं, जब आप ओएस को कॉल करते हैं, तो आप इसे नियंत्रित करते हैं, इसलिए यदि यह संदर्भ स्विच करने का निर्णय लेता है, तो यह "स्वैच्छिक" है। और जब आपका एप्लिकेशन बस बहुत सारे CPU (जैसे उन लूपों में) का उपभोग करता है, तो ओएस जबरन किसी एप्लिकेशन के निष्पादन को निलंबित कर सकता है और संदर्भ "गैर स्वेच्छा से" स्विच कर सकता है। क्या मै गलत हु? –

1

मेमोरी रिसाव की तलाश करने के लिए यह स्थापित करने और वाल्ग्रिंड, http://www.valgrind.org/ का उपयोग करने के लिए बेहतर है। यह ढेर और स्मृति त्रुटि स्थितियों में स्मृति रिसाव की पहचान करेगा (अनियमित स्मृति का उपयोग करके, अन्य समस्याओं के टन)। मैं इसे लगभग हर दिन उपयोग करता हूं।

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