debugging - بالانجليزي - معنى كلمة whole




ما هي البايت الخاصة ، البايت الظاهري ، مجموعة العمل؟ (3)

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

تشير وحدات البايت الخاصة إلى مقدار الذاكرة التي تطلبها العملية القابلة للتنفيذ - وليس بالضرورة الكمية التي تستخدمها بالفعل . وهي "خاصة" لأنها (عادةً) تستبعد ملفات الذاكرة المعينة (مثل DLLs المشتركة). ولكن - هنا هو المصيد - أنها لا تستبعد بالضرورة الذاكرة المخصصة من قبل تلك الملفات . لا توجد طريقة لمعرفة ما إذا كان التغيير في البايتات الخاصة يرجع إلى الملف التنفيذي نفسه أو بسبب مكتبة مرتبطة. البايتات الخاصة ليست أيضًا ذاكرة فعلية بشكل حصري ؛ يمكن تقسيمها إلى قرص أو في قائمة صفحة الانتظار (أي لم تعد قيد الاستخدام ، ولكن لا يتم تقسيمها إلى صفحات بعد).

تشير مجموعة العمل إلى إجمالي الذاكرة الفعلية (RAM) المستخدمة من قبل العملية. ومع ذلك ، وبخلاف البايت الخاص ، يتضمن ذلك أيضًا ملفات معيّنة للذاكرة ومختلف الموارد الأخرى ، لذا فهو قياس أقل دقة من البايت الخاص. هذه هي نفس القيمة التي يتم الإبلاغ عنها في "استخدام Mem" في "إدارة المهام" ، وقد كانت مصدرًا للمبالغ التي لا نهاية لها من الارتباك في السنوات الأخيرة. تكون الذاكرة في مجموعة العمل "فعلية" بمعنى أنه يمكن معالجتها بدون خطأ صفحة؛ ومع ذلك ، فإن قائمة الصفحات الاحتياطية لا تزال موجودة في الذاكرة ولكن لم يتم الإبلاغ عنها في مجموعة العمل ، وهذا هو السبب في أنك قد ترى "Mem Usage" تنخفض فجأة عند تصغير أحد التطبيقات.

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

إذن فالعلاقات هي:

  • وحدات البايت الخاصة هي ما خصصه تطبيقك فعلاً ، ولكنها تتضمن استخدام ملف ترحيل الصفحات ؛
  • مجموعة العمل هي ملفات Bytes غير Bytes خاص + الذاكرة المعينة؛
  • البايت الظاهري هي مجموعة العمل بالإضافة إلى ترحيل وحدات البايت الخاصة وقوائم الانتظار.

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

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

أحد الأدوات الأكثر فعالية لكشف / تصحيح تسرب الذاكرة في Windows هو في الواقع Visual Studio (ينتقل الارتباط إلى صفحة حول استخدام VS لتسربات الذاكرة ، وليس صفحة المنتج). تنقية عقلانية هو احتمال آخر. لدى Microsoft أيضًا مستند أفضل الممارسات العامة حول هذا الموضوع. هناك المزيد من الأدوات المدرجة في هذا السؤال السابق .

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

أحاول استخدام الأداة المساعدة Windows perfmon لتصحيح أخطاء الذاكرة في عملية.

هذه هي الطريقة التي يفسر بها perfmon الشروط:

مجموعة العمل هي الحجم الحالي ، بالبايت ، لمجموعة العمل الخاصة بهذه العملية. مجموعة العمل عبارة عن مجموعة من صفحات الذاكرة التي تم لمسها مؤخرًا بواسطة مؤشرات الترابط في العملية. إذا كانت الذاكرة الخالية في الكمبيوتر أعلى من الحد الأدنى ، فسيتم ترك الصفحات في مجموعة العمل الخاصة بعملية حتى إذا لم تكن قيد الاستخدام. عندما تنخفض الذاكرة الخالية إلى أقل من الحد الأدنى ، يتم تقليم الصفحات من مجموعات العمل. إذا ﻟﺰم اﻷﻣﺮ ، ﻓﺴﻴﺘﻢ إﺻﻼﺣﻪ ﺑﻄﺮﻳﻘﺔ ﺳﻠﻴﻤﺔ إﻟﻰ اﻟﻤﺠﻤﻮﻋﺔ اﻟﻌﺎﻣﻠﺔ ﻗﺒﻞ اﻟﺨﺮوج ﻣﻦ اﻟﺬاآﺮة اﻟﺮﺋﻴﺴﻴﺔ.

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

وحدات البايت الخاصة هي الحجم الحالي ، بالبايت ، من الذاكرة التي تخصصها هذه العملية والتي لا يمكن مشاركتها مع العمليات الأخرى.

هذه هي الأسئلة التي لدي:

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

ما هي الذاكرة الإجمالية التي تستهلكها العملية؟ هل البايت الظاهري أم هو مجموع البايت الظاهري ومجموعة العمل؟

هل هناك أي علاقة بين وحدات البايت الخاصة ومجموعة العمل والبايت الظاهري؟

هل هناك أي أدوات أخرى تعطي فكرة أفضل عن استخدام الذاكرة؟


تم كسر تعريف عدادات perfmon منذ البداية ولسبب ما يبدو أن يصعب للغاية.

نظرة عامة جيدة على إدارة ذاكرة Windows متوفرة في الفيديو " Mysteries of Memory Management Revealed " على MSDN: وهو يغطي موضوعات أكثر من اللازم لتتبع تسرب الذاكرة (مثل إدارة مجموعة العمل) ولكنه يعطي تفاصيل كافية في الموضوعات ذات الصلة.

لإعطائك تلميحًا عن المشكلة المتعلقة بأوصاف العداد الخاص بـ perfmon ، إليك القصة الداخلية عن البايتات الخاصة من " عداد الأداء البايت الخاص - احذر! " على MSDN:

س: متى يكون البايت الخاص ليس البايت الخاص؟

ج: عندما لا تكون مقيمة.

تقارير العداد وحدات البايت الخاصة رسوم الالتزام من العملية. بمعنى ، مقدار المساحة التي تم تخصيصها في ملف المبادلة للاحتفاظ بمحتويات الذاكرة الخاصة في حالة تبديلها. ملاحظة: أنا أتجنب كلمة "محجوز" نظرًا للارتباك المحتمل مع الذاكرة الظاهرية في الحالة المحجوزة غير الملتزمة.

من " تخطيط الأداء " على MSDN:

3.3 وحدات البايت الخاصة

3.3.1 الوصف

يتم تعريف الذاكرة الخاصة كذاكرة مخصصة لعملية لا يمكن مشاركتها بواسطة العمليات الأخرى. هذه الذاكرة أكثر تكلفة من الذاكرة المشتركة عند تنفيذ العديد من هذه العمليات على جهاز. الذاكرة الخاصة في dlls (التقليدية) غير المدارة عادة ما تشكل statics C ++ وهي من ترتيب 5٪ من إجمالي مجموعة العمل من دلل.


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

وقد أعطى رد سابق على هذا السؤال تفسيرا كبيرا لماهية الأنواع المختلفة.

تسأل عن توصية الأداة: أوصي بـ Memory Validator. قادرة على مراقبة التطبيقات التي تجعل مليارات من مخصصات الذاكرة.

http://www.softwareverify.com/cpp/memory/index.html

إخلاء المسؤولية: لقد قمت بتصميم Memory Validator.





memory-management