2008-12-24 15 views
6

पर GNU सी में छोड़ दिया है ++ मैं एक सी ++ प्रोग्राम (जीसीसी के साथ संकलित और RedHat लिनक्स पर चल रहा) लिख रहा हूँ पता लगाना है। कार्यक्रम को रनटाइम पर पता होना चाहिए कि ढेर पर कितनी जगह छोड़ी गई है और ढेर में कितना बचा है। मुझे एहसास है कि इस प्रश्न (ढेर के बारे में) का एक निश्चित उत्तर नहीं हो सकता है, इसलिए वैकल्पिक रूप से, मैं पहले ही ढेर से आवंटित स्मृति की मात्रा का उपयोग कर सकता हूं। क्या कोई लाइब्रेरी/सिस्टम फ़ंक्शन कॉल है जो मुझे यह डेटा देगी?मैं कैसे कितना मुक्त स्मृति लिनक्स

मैं जोड़ने के लिए है कि मैं केवल डीबगिंग उद्देश्यों के लिए इस की जरूरत है, और केवल अनुमान की जरूरत है, तो त्वरित और गंदे समाधान पूरी तरह से स्वीकार्य हैं चाहते हैं। हालांकि, मुझे स्मृति उपयोग को अक्सर पूछताछ करने की आवश्यकता है, इसलिए यूनिक्स cmd-line उपयोगिता को खोलना और इसके आउटपुट को पार्स करना स्वीकार्य नहीं है।

उत्तर

2

आप शायद अपनी खुद की नई बना सकते हैं और कार्यों कि वास्तविक नए और हटाने के ऑपरेटरों समाहित हटा सकते हैं और एक ही समय में स्मृति के उपयोग को ध्यान में रखना कर सकते हैं।

स्टैक के लिए, सी में एक चाल है जहां आप अपने वर्तमान फ़ंक्शन में परिभाषित पहले स्थानीय चर के पते पर एक नज़र डालने के लिए इस बारे में कोई अंदाज़ा नहीं लेते हैं कि इस समय स्टैक पॉइंटर कहां है। मुझे लगता है कि इसे सी ++ में काम करना चाहिए लेकिन कोशिश नहीं की है।

0

आप/proc नाम स्थान फ़ाइलें/proc/< पीआईडी>/smaps और/proc/< पीआईडी>/नक्शे, जहां < पीआईडी> मौजूदा प्रक्रिया आईडी है में देख सकते हैं।

this blogpost देखें।

0

वेलग्रिंड के पुंजक उपकरण दोनों ढेर और ढेर profiling का समर्थन करता है। आप यह देखने के लिए अपने स्रोत कोड को देखना चाह सकते हैं कि यह कैसा करता है।

1

लिनक्स पर आप/proc/pid/स्थिति

1

पता है कि 32-बिट सिस्टम पर, ढेर नीचे की ओर बढ़ता है और ढेर ऊपर की ओर बढ़ता है, और दो कहीं बीच में पूरा हो सकता है हो सकता है पढ़ सकते हैं। इसलिए अंतरिक्ष को ढेर या ढेर करने के लिए आवंटित किया जा सकता है, लेकिन दोनों एक ही समय में नहीं। ध्यान दें कि साझा मेमोरी सेगमेंट (यदि आप उनका उपयोग करते हैं) मेमोरी मैप जटिल करते हैं। तो गतिशील रूप से लोड (साझा) पुस्तकालयों को कर सकते हैं।

+------------+ 
| stack | high addresses 
|  |  | 
|  v  | 
+------------+ 
|   | 
| unused | 
|   | 
+------------+ 
|   | 
| ^ | 
|  |  | 
| heap | 
|   | 
+------------+ 
|   | 
|  bss | 
|   | 
+------------+ 
|   | 
| data | 
|   | 
+------------+ 
|   | 
| text | 
|   | low addresses 
+------------+ 

64-बिट सिस्टम पर, टकराव होने से पहले वास्तविक पता और वास्तविक वर्चुअल मेमोरी चलाने के लिए पर्याप्त पता स्थान है।

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

सबसे अधिक संभावना है, तो आप पूछ बंद सबसे अच्छा कर रहे हैं। अन्य लोगों ने /proc फ़ाइल सिस्टम को सूचना के स्रोत के रूप में इंगित किया है कि कितनी मेमोरी उपयोग में है। मुझे यकीन नहीं है कि यह विश्वसनीय रूप से आपको बताता है कि पकड़ने के लिए कितनी मेमोरी उपलब्ध है।

0

ढेर भाग के लिए, शायद आप संसाधन सीमा को मार रहे हैं। this देखें।

आप स्टैक प्रोफाइलिंग के लिए वालग्रिंड का उपयोग कर सकते हैं, लेकिन आप इसके साथ क्या करने जा रहे हैं? ढेर ढेर की तरह नहीं है। आप कहते हैं, आप डीबगिंग उद्देश्यों के लिए ऐसा करना चाहते हैं। यदि आपका प्रोग्राम ठीक चलता है, तो कोई स्टैक समस्या नहीं है (कम से कम इसके आकार से संबंधित)।

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

मुझे लगता है कि यदि आप ढेर के उपयोग के लिए बहुत अधिक परवाह करते हैं, तो आपका प्रोग्राम शायद स्मृति को रिसाव कर देता है। इस मामले में, वालग्रिंड आपको सही दिशा में इंगित कर सकता है। Valgrind

0

RLIMIT_STACK के एक पैरामीटर के साथ getrlimit आपको बताएगा कि कुल में कितनी स्टैक स्पेस है। RLIMIT_AS के पैरामीटर के साथ आप यह पता लगा सकते हैं कि वर्चुअल मेमोरी कितनी है।

अधिक जानकारी के लिए देखने के http://linux.die.net/man/2/getrlimit

1

पर इस पर रास्पबेरी पीआई मुक्त स्मृति की मात्रा वापस जाने के लिए एक सी समारोह है। यह/proc/meminfo पढ़ने से काम करता है। मुझे यकीन नहीं है कि यह अन्य प्रणालियों के लिए काम करता है।

#include <stdio.h> 
#include <string.h> 
// Return the amount of free memory in kbytes. 
// Returns -1 if something went wrong. 
int getfreememory() 
{ 
    int returnValue; 
    const int BUFFER_SIZE = 1000; 
    char buffer[BUFFER_SIZE]; 
    FILE *fInput; 
    int loop; 
    int len; 
    char ch; 
    returnValue = -1; 
    fInput = fopen("/proc/meminfo","r"); 
    if (fInput != NULL) 
    { 
    while (!feof(fInput)) 
    { 
     fgets(buffer,BUFFER_SIZE-1,fInput); 
     if (feof(fInput)) 
     { 
     break; 
     } 
     buffer[BUFFER_SIZE-1] = 0; 
     // Look for serial number 
     if (strncmp(buffer,"MemFree:",8)==0) 
     { 
     // Extract mem free from the line. 
     for(loop=0;loop<BUFFER_SIZE;loop++) 
     { 
      ch = buffer[loop]; 
      if (ch == ':') 
      { 
      returnValue = 0; 
      continue; 
      } 
      if (ch == 0) 
      { 
       break; 
      } 
      if (returnValue >=0) 
      { 
      if (ch >='A') 
      { 
       break; 
      } 
      if ((ch >='0') && (ch <='9')) 
      { 
       returnValue = returnValue * 10 + (ch-'0'); 
      } 
      } 
     } 
     break; 
     } 
    } 
    fclose(fInput); 
    } 
    return returnValue; 
} 
संबंधित मुद्दे