نفاد الذاكرة

نفاد الذاكرة ( OOM ) حالة غير مرغوب فيها في كثير من الأحيان، حيث لا يمكن تخصيص ذاكرة إضافية للبرامج أو نظام التشغيل . في هذه الحالة، لن يتمكن النظام من تحميل أي برامج إضافية، ونظرًا لأن العديد من البرامج قد تُحمّل بيانات إضافية في الذاكرة أثناء التشغيل، فإنها ستتوقف عن العمل بشكل صحيح. يحدث هذا عادةً بسبب تخصيص جميع الذاكرة المتاحة، بما في ذلك مساحة التبديل على القرص.
تاريخ
تاريخيًا، كانت مشكلة نفاد الذاكرة أكثر شيوعًا مما هي عليه الآن، نظرًا لأن الحواسيب وأنظمة التشغيل القديمة كانت محدودة بكميات صغيرة من ذاكرة الوصول العشوائي (RAM) الفعلية، وذلك بسبب عجز المعالجات القديمة عن الوصول إلى كميات كبيرة من الذاكرة، فضلًا عن اعتبارات التكلفة. ومنذ ظهور الذاكرة الافتراضية التي أتاحت استخدام مساحة التبديل، أصبحت هذه المشكلة أقل شيوعًا. تتوقع جميع البرامج الحديثة تقريبًا أن تكون قادرة على تخصيص الذاكرة وتحريرها بحرية أثناء التشغيل، وتميل إلى التعطل بشكل غير متوقع (الانهيار) عندما لا يتحقق هذا التوقع؛ أما البرامج القديمة فكانت غالبًا ما تخصص الذاكرة مرة واحدة فقط، وتتحقق مما إذا كانت قد حصلت على ما يكفي لإنجاز جميع مهامها، ثم تتوقع عدم توفر المزيد. لذلك، إما أن تفشل فورًا برسالة خطأ "نفاد الذاكرة" (OOME)، أو تعمل كما هو متوقع.
كانت أنظمة التشغيل المبكرة، مثل MS-DOS، تفتقر إلى دعم تعدد المهام . كانت البرامج تُخصص لها ذاكرة فعلية تستخدمها حسب حاجتها. وكانت الذاكرة الفعلية مورداً نادراً في كثير من الأحيان، وعندما تستنفدها تطبيقات مثل تلك التي تعتمد على خاصية الإنهاء والبقاء في الذاكرة ، لا يمكن تشغيل أي تطبيقات أخرى حتى يتم إغلاق التطبيقات قيد التشغيل.
توفر أنظمة التشغيل الحديثة ذاكرة افتراضية، حيث تُمنح العمليات نطاقًا من الذاكرة، لكن هذه الذاكرة لا تتطابق مباشرةً مع ذاكرة الوصول العشوائي (RAM) الفعلية. يمكن دعم الذاكرة الافتراضية بذاكرة الوصول العشوائي الفعلية، أو ملف قرص عبر mmap (في أنظمة يونكس المشتقة) أو MapViewOfFile (في ويندوز)، أو مساحة تبديل، ويستطيع نظام التشغيل نقل صفحات الذاكرة الافتراضية حسب الحاجة. ولأن الذاكرة الافتراضية لا تحتاج إلى دعم من ذاكرة فعلية، فإن استنفادها نادر، وعادةً ما يفرض نظام التشغيل قيودًا أخرى على استهلاك الموارد. (على سبيل المثال، يستخدم ويندوز آلية حساب تكلفة الالتزام للحد من حجم الذاكرة الافتراضية).
كما تنبأ قانون مور ، ازداد حجم الذاكرة الفعلية في جميع أجهزة الكمبيوتر بشكل كبير، وإن كان هذا النمو يُقابله جزئيًا ازدياد حجم البرامج والملفات نفسها. في بعض الحالات، قد ينفد مخزون الذاكرة الفعلية في جهاز كمبيوتر يدعم الذاكرة الافتراضية، حيث تُخزَّن معظم البيانات على القرص الصلب، بينما يبقى مخزون الذاكرة الافتراضية متاحًا، مما يُسبب ترحيلًا مفرطًا للبيانات . تُعرف هذه الحالة باسم "التبديل المفرط للذاكرة "، وعادةً ما تجعل الكمبيوتر غير قابل للاستخدام حتى يتم إغلاق بعض البرامج أو إعادة تشغيل الجهاز. لهذه الأسباب، نادرًا ما تواجه التطبيقات على أجهزة الكمبيوتر الحديثة رسالة "نفاد الذاكرة".
مع ذلك، لا يزال من الممكن مواجهة حالة نفاد الذاكرة (OOM) في الحواسيب الحديثة. تحدث هذه الحالة عادةً عندما يعجز نظام التشغيل عن إنشاء المزيد من الذاكرة الافتراضية، إما لامتلاء جميع وحدات التخزين المتاحة أو لتعطيلها من قِبل المستخدم. وقد تنشأ هذه الحالة بسبب خاصية النسخ عند الكتابة (copy-on-write) fork().
استعادة
تحاول نواة أنظمة التشغيل، مثل لينكس، التعافي من حالة نفاد الذاكرة (OOM) عن طريق إنهاء عملية واحدة أو أكثر، وهي آلية تُعرف باسم " قاتل نفاد الذاكرة " (OOM Killer ) . [ 1 ] [ 2 ] أدخلت لينكس 4.6 (التي صدرت في مايو 2016) تغييرات على حالات نفاد الذاكرة، مما حسّن من اكتشافها وموثوقيتها. [ 3 ] [ 4 ] تم تطبيق خاصية إدراك مجموعات التحكم (cgroup) في قاتل نفاد الذاكرة في نواة لينكس 4.19 التي صدرت في أكتوبر 2018، والتي أضافت القدرة على إنهاء مجموعة تحكم كوحدة واحدة. [ 5 ]
بسبب التنشيط المتأخر لـ OOM Killer على بعض أنظمة Linux، [ 6 ] هناك العديد من البرامج الخفية وتصحيحات النواة التي تساعد في استعادة الذاكرة من حالة OOM قبل فوات الأوان.
حدود الذاكرة لكل عملية
إلى جانب حدود الذاكرة الفعلية على مستوى النظام، تحدّ بعض الأنظمة من مقدار الذاكرة التي يمكن لكل عملية استخدامها. عادةً ما يكون هذا التقييد سياسةً مُتبعة، وقد يحدث أيضًا عندما يمتلك نظام التشغيل مساحة عناوين أكبر من المتاحة على مستوى العملية. تأتي بعض أنظمة 32 بت المتطورة (مثل تلك التي تدعم امتداد العنوان الفعلي ) مزودة بذاكرة نظام تبلغ 8 جيجابايت أو أكثر، على الرغم من أن أي عملية منفردة لا يمكنها الوصول إلا إلى 4 جيجابايت منها في نموذج ذاكرة 32 بت المسطح .
ستواجه أي عملية تتجاوز حدّها المسموح به من الذاكرة، ثم تحاول تخصيص المزيد منها، حالة خطأ. على سبيل المثال، ستُرجع دالة تخصيص الذاكرة القياسية في لغة C القيمة NULL إذا فشلت في التخصيص، ويجب على التطبيق السليم التعامل مع هذه الحالة. أما في لغة C++ القياسية، فسيتم طرح استثناء عند الفشل، ليس بالضرورة عند نفاد ذاكرة الوصول العشوائي (RAM) الفعلية، بل عند فشل تخصيص الذاكرة الافتراضية. في لغة Java ، إذا نفدت ذاكرة آلة Java الافتراضية (JVM)، فسيتم طرح استثناء ، وفي لغة C# ، يتم طرح استثناء آخر. تحتوي مكتبات POCO C++ على فئة تُطلق استثناءً إذا نفدت ذاكرة عملية ما.malloc()operator newbad_allocOutOfMemoryErrorOutOfMemoryExceptionOutOfMemoryExceptionMemoryPool
مراجع
- ↑ برنامج قتل عمليات نفاد الذاكرة في لينكس
- ↑ "كيفية تهيئة أداة إنهاء العمليات عند نفاد الذاكرة في نظام لينكس" . تم الاطلاع عليه بتاريخ 19 فبراير 2015 .
- ↑ "نحو معالجة أكثر قابلية للتنبؤ وموثوقية لنقص الذاكرة [ LWN.net ] " . lwn.net .
- ↑ "Linux_4.6 - Linux Kernel Newbies" . kernelnewbies.org .
- ↑ "Linux_4.19 - Linux Kernel Newbies" . kernelnewbies.org .
- ↑ "نواة لينكس - هل من الممكن جعل قاتل العمليات بسبب نفاد الذاكرة يتدخل مبكراً؟" . سوبر يوزر . تم الاطلاع عليه في 7 مارس 2021 .
- ↑ rfjakob (7 مارس 2021)، rfjakob/earlyoom ، GitHub ، تم الاطلاع عليه في 7 مارس 2021
- ↑ أفراموف، أليكسي (5 مارس 2021)، hakavlad/nohang ، GitHub ، تم الاطلاع عليه في 7 مارس 2021
- ↑ "linux-psi.git - مقاييس ضغط موارد لينكس" . git.cmpxchg.org . مؤرشف من الأصل بتاريخ 22 يناير 2021. تم الاطلاع عليه بتاريخ 7 مارس 2021 .
- ↑ facebookincubator/oomd ، حاضنة فيسبوك، 3 مارس 2021 ، تم الاطلاع عليه في 7 مارس 2021
روابط خارجية
- معالجة نفاد الذاكرة
- مقال بعنوان " تقليل استخدام الذاكرة لإنشاء العمليات الفرعية للتطبيق " مؤرشف بتاريخ 12 يونيو 2006 على موقع Wayback Machine بواسطة جريج ناخيموفسكي
- مقال بعنوان " ترويض قاتل نفاد الذاكرة " بقلم غولدون رودريغز
- مقال بعنوان " عندما ينفد ذاكرة نظام لينكس " بقلم موليادي سانتوسا
- ورقة بحثية بعنوان " معالجة أخطاء "نفاد الذاكرة" مؤرشفة بتاريخ 25 فبراير 2021 على موقع Wayback Machine " بقلم جون بويلاند
- إدارة الذاكرة
- أخطاء الحاسوب
