تسرب الذاكرة


في علوم الحاسب، يعتبر تسرب الذاكره نوع من الاستهلاك غير المتعمد للذاكره المؤقته "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 ; 
}

أنظر أيضا

cs:Únik paměti de:Speicherleck Memory leak]] es:Fuga de memoria fa:کمبود حافظه fi:Muistivuoto fr:Fuite de mémoire he:דליפת זיכרון id:Kebocoran Memori it:Memory leak ja:メモリリーク ko:메모리 누수 lt:Atminties nutekėjimas ms:Bocor ingatan nl:Geheugenlek pl:Wyciek pamięci pt:Vazamento de memória ru:Утечка памяти sk:Memory leak tr:Bellek sızıntısı zh:内存泄漏 zh-yue:漏記憶