كيف يمكنني معرفة مقدار الذاكرة المجانية المتبقية في GNU C ++ على Linux

StackOverflow https://stackoverflow.com/questions/391107

  •  23-08-2019
  •  | 
  •  

سؤال

أنا أكتب برنامجا C ++ (مترجمة مع دول مجلس التعاون الخليجي وتشغيله على Linhat Linux). يحتاج البرنامج إلى معرفة وقت تشغيل مقدار المساحة المتبقية على المكدس وكم يتم ترك مقدار في كومة الكومة. أدرك أنه قد لا تكون هناك إجابة محددة لهذا السؤال (حول كومة الكومة)، لذلك بدلا من ذلك، يمكنني استخدام كمية الذاكرة المخصصة بالفعل من كومة الكومة بدلا من ذلك. هل هناك مكتبة / وظيفة مكتبة النظام التي ستعطيني هذه البيانات؟

أود أن أضيف أنني بحاجة فقط إلى هذا لأغراض تصحيح الأخطاء، والحاجة فقط إلى تقديرات تقريبية، لذلك الحلول السريعة القذرة مقبولة تماما. ومع ذلك، أحتاج إلى الاستعلام عن استخدام الذاكرة بشكل متكرر، لذا فإن القصف خارج إلى أداة UNIX CMD-Line ويقلل إخراجه غير مقبول.

لا يوجد حل صحيح

نصائح أخرى

ربما يمكنك إنشاء وظائف جديدة وحذف الخاصة بك التي تثبط المشغلين الحقيقيين وحذفهم وإحاطة علما باستخدام الذاكرة في نفس الوقت.

للحصول على كومة، هناك خدعة في C حيث نلقي نظرة على عنوان المتغير المحلي الأول المحدد في دئتك الحالية للحصول على فكرة تقريبية حول مكان وجود مؤشر المكدس في الوقت الحالي. أعتقد أنه يجب أن تعمل في C ++ ولكن لم تحاول ذلك.

على لينكس يمكنك قراءة / بروك /pid/الحالة

أن تدرك أنه على أنظمة 32 بت، ينمو المكدس إلى أسفل وينمو الكومة لأعلى، وقد يجتمع الاثنان في مكان ما في الوسط. وبالتالي، قد يتم تخصيص المساحة إلى كومة أو كومة كومة، ولكن ليس لكما في نفس الوقت. لاحظ أن شرائح الذاكرة المشتركة (إذا كنت تستخدمها) تعقد خريطة الذاكرة. لذلك يمكن تحميل المكتبات (المشتركة) ديناميكيا.

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

على نظام 64 بت، هناك مساحة عنوان كافية تنفد الذاكرة الحقيقية والظاهرية قبل حدوث التصادمات.

أيضا، لاحظ أن (على الأقل بعض إصدارات) Linux ترغب في قول المزيد من الذاكرة يمكن تخصيصها مما يمكن أن يدعمه بالفعل - إزاء ارتكابهم. هذا ليس جيدا جدا. وهذا يعني أن التجارب العملية مثل مخصصات الذاكرة المحاكمة قد تعطيك شعورا كاذبا بالأمن.

على الأرجح، فمن الأفضل أن تسأل "هو X MB (GB؟) من المساحة اليسرى"، بدلا من "عدد ميغابايت (GB؟) من المساحة المتبقية". وأشار أشخاص آخرون إلى /proc نظام الملفات كمصدر للمعلومات لمقدار الذاكرة قيد الاستخدام. لست متأكدا مما إذا كان يخبرك بشكل موثوق عن مقدار الذاكرة المتاحة للاستيلاء عليها.

هذه هي وظيفة C لإرجاع كمية الذاكرة الحرة على PI التوت. وهو يعمل من خلال قراءة / بروك / ميمينفا. لست متأكدا مما إذا كان يعمل من أجل أنظمة أخرى.

#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;
}

يمكنك التحقق من مساحة الاسم / proc الملفات / بروك /u003Cpid> / smaps و / proc /u003Cpid> / الخرائط، حيثu003Cpid> هو معرف العملية الحالي.

يفحص هذا blogpost. خارج.

تدعم أداة Massif Valgrind كلا من كومة وكم كومة التنميط. وبعد قد ترغب في التحقق من شفرة المصدر الخاصة به لمعرفة كيف يفعل ذلك.

بالنسبة إلى الجزء الكهائن، ربما كنت تضرب حد الموارد. الدفع هذه.

يمكنك استخدام Valgrind لمجموعة التنميط المكدس، ولكن ماذا ستفعل معها؟ كومة ليست مثل كومة. أنت تقول، تريد القيام بذلك لأغراض تصحيح الأخطاء. إذا كان برنامجك يعمل بشكل جيد، فلا توجد مشكلة مكدس (تتعلق بحجمها على الأقل).

يمكنك ضبط حجم المكدس على خيوط المواضيع التي قمت بإنشائها وفحص قيمة مؤشر المكدس من خلال النظر في عناوين المتغير المحلي (والتي يجب ألا تكون محسنة). فقط قم ببعض الرياضيات باستخدام الحجم الأولي وقيمة مؤشر المكدس الأولي وقيمة مؤشر المكدس الحالية، وسوف تحصل على بعض الأرقام الجميلة. فقط لا تنسى معرفة اتجاه المكدس أولا. هذا قد يتغير من النظام الأساسي إلى المنصة.

أعتقد أنه إذا كنت تهتم بهذا في استخدام كومة الكومة، فمن المحتمل أن يثب البرنامج الذاكرة. في هذه الحالة، يمكن أن يشيرك Valgrind إلى الاتجاه الصحيح. valgrind.

سيخبرك GetRLIMIT بمخطط RLIMIT_STACK بمقدار مساحة المكدس الموجودة في المجموع. مع معلمة من rlimit_as، يمكنك معرفة مقدار الذاكرة الظاهرية هناك.

لمزيد من المعلومات، انظر إلى http://linux.die.net/man/2/getRlimit.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top