تسرب الذاكرة

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

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

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

نتائج تسرب الذاكره

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

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

الحالات حين يكون التسرب أكثر خطوره قد تتضمن:

  • حين يترك البرنامج المخطئ يعمل، ويستهلك ذاكره أكثر فأكثر مع مرور الوقت (مثل المهمات الخلفيه، في خادمات الويب، ولكن أكثر في الأجهزه المضمنه والتي يمكن أن تترك تعمل لسنين عديده"مثال: راوتر")
  • حين يكون البرنامج قادرا على طلب ذاكره (مثال: ذاكره مشتركه shared memory) لم يتم إفراغها، حتى وإن اغلق البرنامج.
  • حين يحدث التسرب بسبب نظام التشغيل.


مثال لشخص عادي

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

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

حين يضغط على زر:
   احصل على بعض الذاكره، والتي سوف تستخدم لتذكر رقم الطابق المراد الصعود اليه.
   أحفظ رقم الطابق في الذاكره
   هل نحن بالفعل في الطابق المراد؟
   إذا كنا كذلك، ليس لدينا شيء لنفعله: انتهى
   إذا لم يكن كذلك:
        إنتظر حتى يغلق المصعد
        اذهب إلى الطابق المطلوب
        افرغ الذاكره التي استخدمت في تذكر رقم الطابق

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

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

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

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

هل هو تسرب بالذاكره؟

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

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

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

مثال بسيط لذاكره لا يمكن الوصول اليها في لغة سي

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

#include <stdio.h>
int f(void) 
{ 
    char* s; 
    s = (char *)malloc(50); /* get memory */ 
    if (s==NULL) return 1; /* no memory available */ 
    else 
    {   /* memory available */ 
        return 0;  /* memory leak - see note below */ 
    } 
    /* 
     * Memory was available and pointed to by s، but not saved. 
     * After this function returns، the pointer is destroyed، 
     * and the allocated memory becomes unreachable 
     * 
     * to "fix" this code، you would add the statement "free(s)" to 
     * the else block before the "return 0" statement 
     */ 
} 
int main(void) 
{ 
    /* this is an infinite loop calling the above function */ 
    while (1) f(); /* This function call will fail to malloc sooner or later */ 
return 0 ; 
}

أنظر أيضا