ما هي الطريقة الصحيحة للتعامل مع "نفاد الذاكرة"؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

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

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

سيخصص زملائي الذين يكتبون برامج الخادم على نظام التشغيل Linux ذاكرة كافية لـ 100 اتصال للعميل.لذا، على الرغم من أن برنامجه قد يرفض العميل 101، إلا أنه لن يفشل أبدًا في استخدام malloc.هل أسلوبه مناسب أيضًا لتطبيقات سطح المكتب؟

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

المحلول

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

في أنظمة التشغيل التي تدعم حالات الفشل، رأيت نمطين عامين:

  • اكتب إجراءً مخصصًا يتحقق من نتيجة malloc(), ، والمكالمات abort() إذا فشل التخصيص.على سبيل المثال، GLib وGTK+ المكتبات تستخدم هذا النهج.

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

نصائح أخرى

اتبع API موحد

وحتى على لينكس، ulimit يمكن استخدامها للحصول على وجه السرعة malloc عودة خطأ. انها مجرد افتراضات إلى غير محدود.

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

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

واستراتيجيات ما يجب القيام به إذا فشل malloc تعتمد على نوع و applciation ومقدار الثقة لديك في المكتبات تستخدمه. انها بعض الحالات الشيء الوحيد الآمن القيام به هو وقف البرنامج بأكمله.

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

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

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

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

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

وg_malloc الخصلة ل()، إجهاض، أيضا.

إذا كنت تسير على التعامل مع كميات كبيرة من الذاكرة، وتريد أن تجعل تصريحات لينكس مثل "الآن لدي مساحة الذاكرة ABC وأنا لست بحاجة إلى قطعة B، فاصنع ما شئت"، إلقاء نظرة على mmap () / madvise () أسرة من الوظائف المتاحة في مكتبة الأسهم GNU C. اعتمادا على أنماط الاستخدام، ويمكن للكود في نهاية المطاف حتى أبسط من استخدام malloc. يمكن أيضا أن هذا API أن تستخدم لمساعدة لينكس لا تضيع الذاكرة التخزين المؤقت الملفات أنت ذاهب لقراءة / كتابة مرة واحدة فقط.

وموثقة وهي لطيف في GNU LIBC وثائق المعلومات.

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