2012-05-24 8 views
6

मैं एक scratchbox पार में हूँ पर्यावरण संकलन और जब मैं बाइनरी चलाने के लिए औरइस कार्यक्रम की स्मृति पदचिह्न क्यों नहीं बढ़ता है?

ps -p pid -o cmd,rss,%mem 

कर मैं इस प्रक्रिया की स्मृति पदचिह्न में कोई वृद्धि नहीं दिख रहा है इस

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main() 
{ 
    int * ptr; 
    int i=0; 

    while(1) 
    { 
     ptr = (int*)malloc(10485760 * sizeof(int)); 

     if(ptr == NULL) 
     { 
      printf("Could not malloc\n"); 
      exit(1); 
     } 

     else 
     { 
      printf("Malloc done\n"); 
      for (i = 0 ; i <= 10485759 ; i++) 
      { 
       ptr[i] = i ; 
      } 
      sleep (5); 
      continue; 
     } 
    } 
} 

है। ऐसा क्यों है?

+0

क्योंकि स्मृति सब शुरुआत में एक बार में आवंटित किया जाता है? –

+3

@arasmussen 'while' लूप के अंदर। –

+0

हो सकता है कि संकलक देखता है कि अब आपके पास उस सूचक पर कोई संभाल नहीं है (क्योंकि आप हर बार पीआरटी लिखते हैं) और इसके बाद आपके लिए सफाई कर रहे हैं? या शायद दस लाख पुनरावृत्तियों को चलाने में काफी समय लग रहा है? –

उत्तर

5

आपने शायद बहुत अनुकूलित बनाया है।

अधिकांश आधुनिक प्रणालियों पर जीसीसी जानता है कि मॉलोक एक गैर-एलियाड पॉइंटर लौटाता है। ऐसा कहने के लिए, यह कभी भी एक ही सूचक को दो बार वापस नहीं करेगा और यह कभी भी उस सूचक को वापस नहीं करेगा जिसे आपने कहीं और 'लाइव' बचाया है।

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

यह जानता है कि आपकी याददाश्त एक मृत स्टोर है। यानी: आप इसे लिखते हैं, लेकिन इसे कभी नहीं पढ़ा जाता है। सूचक को एलियाड नहीं माना जाता है, इसलिए यह कहीं और से पढ़ने के लिए नहीं बच गया है, और यह अस्थिर चिह्नित नहीं है। लूप के लिए आपका/स्वयं/फेंक दिया जा सकता है।

उस बिंदु पर यह केवल उसी स्मृति का उपयोग कर सकता है।

अब मुझे विश्वास करना मुश्किल लगता है: जीसीसी को मॉलोक के बारे में कितना पता है? मॉलोक के किसी भी तरह के साइड इफेक्ट्स हो सकते हैं जैसे कि 'मेरे कमरे को नीले रंग की यादृच्छिक छाया' के लिए 'ग्लोबल' नामक कई बार 'बढ़ाना'। यह वास्तव में अजीब लगता है कि यह कॉल छोड़ देगा और इसे साइड-इफेक्ट-फ्री माना जाएगा। नरक, 'मॉलोक' को हर 100 वें कॉल को वापस करने के लिए लागू किया जा सकता है (शायद कल्पना करने के लिए काफी नहीं, लेकिन कौन कहना है)।

यह नहीं कर रहा है कि यह आपकी ओर से इसे मुक्त कर रहा है। यह 'चीजों को करने की अनुमति' के क्षेत्र में और उस क्षेत्र के क्षेत्र में जो कुछ भी हो सकता है उससे परे है। आपको स्मृति को रिसाव करने की इजाजत है, हालांकि यह हो सकता है।

2 चीजें यहां उपयोगी होंगी: 1) कंपाइल पर्यावरण वातावरण: जो ओएस, कंपाइलर, और कमांड लाइन झंडे।

और 2) अंतिम बाइनरी के पृथक्करण। (Objdump या संकलक से)

+0

_ बस जीसीसी को malloc के बारे में कितना पता है? _ Gcc को 'malloc()' के बारे में सबकुछ जानने की अनुमति है, क्योंकि सी मानक उस फ़ंक्शन के व्यवहार को निर्दिष्ट करता है। – mlp

-2

आपका कंपाइलर आवंटित स्मृति को मुक्त करके आपकी मदद कर रहा है (यह मानते हुए कि आपके कोड का अनुकूलित संस्करण भी मॉलोक करने के लिए हो जाता है) जब यह महसूस होता है कि आप इसका उपयोग नहीं कर रहे हैं। आप पॉइंटर के मूल्य को प्रिंट करने का प्रयास कर सकते हैं (printf ("0x% x", ptr);) - मुझे संदेह है कि आपको दोहराए जाने वाले मान मिलेंगे। एक और विश्वसनीय चेक मेमोरी में ज्ञात बिटस्ट्रिंग लिखता है, पहले से ही यह देखने के लिए देखा जाता है कि आवंटित स्मृति में पहले से ही स्ट्रिंग है या नहीं। दूसरे शब्दों में, मुझे लिखने की बजाय, 0xdeadbeef0cabba6e को बार-बार लिखें, यह देखने के बाद कि क्या वह बिट पैटर्न पहले से ही आपके द्वारा आवंटित स्थान पर है या नहीं।

+0

सी सामान्यतः उस समय के कचरा संग्रह को चलाने के लिए नहीं जा रहा है। लेकिन यह सोचना दिलचस्प है कि एक कंपाइलर * क्या कर सकता है। 'Ptr [i]' में से कोई भी कभी नहीं पढ़ा जाता है, ताकि असाइनमेंट को बढ़ाया जा सके। तब 'malloc' द्वारा आवंटित स्मृति में से कोई भी किसी भी तरह से उपयोग नहीं किया जाता है, इसलिए प्रिंसिपल में इसे elided किया जा सकता है (यदि हम संतुष्ट हैं कि "आवंटित स्मृति की मात्रा" एक शुद्धता संपत्ति नहीं है जिसे संरक्षित किया जाना चाहिए)। हालांकि पहला व्यक्ति शायद एलियासिंग के साथ मुश्किल है, और मुझे आश्चर्य होगा अगर अस्तित्व में कोई भी सी कंपाइलर दूसरा करता है; सुनिश्चित नहीं है कि यह वैसे भी एक वैध परिवर्तन है। – Edmund

+0

मैंने कभी यह सुझाव नहीं दिया कि किसी भी कचरा संग्रह पर जा रहा है। सी स्पेक एकमात्र शर्त के तहत किसी भी अनुकूलन की अनुमति देता है कि अंतिम परिणाम सी सार मशीन परिभाषा द्वारा परिभाषित से कोई कार्यात्मक अंतर नहीं है। (ध्यान दें कि हम जावा अर्थ में वीएम के बारे में बात नहीं कर रहे हैं, लेकिन इस अर्थ में कि सी स्पेक संकलित कोड के व्यवहार को परिभाषित करने के लिए एक तंत्र के रूप में एक सार मशीन को परिभाषित करता है।) यह अनुकूलक के दायरे में अच्छा होगा उपरोक्त कोड से आवंटन को पूरी तरह खत्म करें। – Sniggerfardimungus

+0

"कचरा संग्रह" निर्णय लेने की प्रक्रिया है - रनटाइम पर - जब बिना संदर्भित स्मृति को मुक्त किया जा सकता है। हम यहां एक रनटाइम निर्णय के बारे में बात नहीं कर रहे हैं, लेकिन यह देखते हुए एक संकलन-समय प्रभाव है कि आवंटित डेटा और लिखित डेटा का कभी भी उपयोग नहीं किया जाता है। – Sniggerfardimungus

2

आरएसएस और% मेम दोनों इस समय प्रक्रिया द्वारा उपयोग की जाने वाली भौतिक स्मृति के संदर्भ में हैं। इसमें पृष्ठ भरने के लिए बहुत अवसर हैं। बनाम जोड़ने का प्रयास करें। मैं शर्त लगाता हूं कि आप उम्मीद करते हैं।

+0

आपको बंपिंग। यदि आप मानते हैं कि संकलक के बारे में मैंने जो कहा है, वह एक मृत स्टोर के रूप में असाइनमेंट लूप को फेंकने में सक्षम है, तो यह स्मृति आरक्षित होगी लेकिन कभी भी प्रतिबद्ध नहीं होगी और जब तक पता स्थान समाप्त नहीं हो जाता तब तक लूप हो सकता है; वास्तव में एक बाइट वास्तव में बिना। :) – Joe

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