سؤال

وطلبي مشابه لبرنامج hypotetical:

for(;;) {
  for (i=0; i<1000; i++) {
    p[i] = malloc(random_number_between_1000_and_100000());
    p[i][0]=0;  // update
   }
  for (i=0; i<1000; i++) {
    free(p[i]);
  }
}

لا يوجد لديه تسرب الذاكرة، ولكن على نظام بلدي، واستهلاك الذاكرة (أعلى العمود VSS) ينمو بلا حدود (مثل 300٪ من الذاكرة الفعلية المتوفرة). هل هذا طبيعي؟

على تحديث - يمكنك استخدام الذاكرة لفترة من الوقت ومن ثم تحريرها. هل هذا الفرق؟

هل كانت مفيدة؟

المحلول

وحاول إضافة

  sbrk(-1);

في نهاية كل حلقة لمعرفة ما اذا كان هناك فرق.

وومجانا () إلغاء تخصيص الذاكرة فقط ولكن لا يعيدها إلى نظام التشغيل.

نصائح أخرى

والسلوك غير العادي. نقلا عن man 3 malloc:

والبق

وافتراضيا، لينكس يتبع استراتيجية تخصيص الذاكرة تفاؤلا. وهذا يعني أنه عندما malloc () إرجاع غير NULL-ليس هناك ما يضمن أن        الذاكرة المتاحة حقا. هذا هو علة سيئة حقا. في حال تبين أن النظام هو من الذاكرة، وعمليات واحدة أو أكثر يكون        قتل على يد القاتل OOM الشائنة. في حالة ويعمل لينكس في ظل الظروف حيث سيكون أقل من المرغوب فيه أن تفقد فجأة بعض عشوائيا        اختار العمليات، وعلاوة على ذلك نسخة النواة هو الأخير بما فيه الكفاية، يمكن للمرء أن إيقاف هذا السلوك overcommitting باستخدام أمر مثل:

       # echo 2 > /proc/sys/vm/overcommit_memory

وانظر أيضا دليل الوثائق النواة، ملفات VM / overcommit محاسبة وsysctl / vm.txt.

وتحتاج للمس (القراءة / الكتابة) الذاكرة لنواة لينكس لحجز فعلا.

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

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

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