سؤال

امتلاك بعض المشكلات خارج الذاكرة مع عملية 32 بت في Windows ، بدأت في استخدام Monitor Monitor لتسجيل بعض العدادات لتلك العملية.

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

ما هي العمليات المحددة ووظائف Win32/CRT (في C أو C ++) التي ستزيد من البايتات الظاهرية ولكن ليس بايتات خاصة ومجموعة العمل؟

أعتقد أنه سيكون نوعًا من الموارد المشتركة ، إذا فهمت وصف العدادات المختلفة في شاشة الأداء.


كما يبدو أن هناك بعض الالتباس (على أقل تقدير) في اتفاقية التسمية لاستخدامها لعدادات الذاكرة في إصدارات مختلفة من النوافذ وكذلك في تطبيقات مختلفة في نفس الإصدار من Windows ، قمت بتجميع ما يلي:

معلومات من MSDN

وفق MSDN - حدود الذاكرة لإصدارات Windows, ، الحد الأقصى لمساحة العنوان الظاهري لوضع المستخدم في Windows 32 بت لكل عملية 32 بت هي عادة 2 غيغابايت. يمكن أن يصل إلى 3 جيجابايت مع IMAGE_FILE_LARGE_ADDRESS_AWARE و 4GT.

فيما يلي وصف للعدادات المختلفة في مراقبة الأداء إلى جانب الأعمدة المقابلة في مدير المهام وهيكل Win32 الذي يحمل المعلومات ، وفقًا لـ MSDN - معلومات أداء الذاكرة.

بايت الافتراضية

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

مدير المهام XP: N/A
مدير المهام فيستا: ن/أ
بنية: MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual

بايتات خاصة

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

مدير المهام XP: حجم VM
مدير المهام فيستا: حجم الالتزام
بنية: PROCESS_MEMORY_COUNTERS_EX.PrivateUsage

طقم العمل

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

مدير المهام XP: استخدام MEM
مدير المهام فيستا: مجموعة العمل
بنية: PROCESS_MEMORY_COUNTERS_EX.WorkingSetSize

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

المحلول

الأشياء التي (مايو) تزيد من البايتات الافتراضية دون زيادة بايتات خاصة يمكنني التفكير فيها الآن:

  • غالبًا ما تتم مشاركة الثنائيات (أي ليست خاصة) ، ولكنها تشغل مساحة عنوان كبيرة. يمكن أن يكون هذا أكبر من حجم الثنائي

  • باستخدام VirtualAlloc لحجز مساحة العنوان المتسلسل دون الالتزام / الوصول إليها. قد يقوم مديرو الذاكرة المخصص بذلك.

  • باستخدام ملف تم تعيينه للذاكرة (دون الوصول إليه بالكامل)

نصائح أخرى

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

يمكن أن يكون سبب الخروج من الذاكرة هو تشغيل مساحة العنوان لأن الاحتفاظ بمساحة العنوان الكثير.

ما هي لغة البرمجة الخاصة بك؟

في الأطر المدارة ، تمثل البايتات الخاصة البيانات التي يتم تخصيصها بواسطة الموارد غير المدارة. في حين أن البايتات الافتراضية تمثل إجمالي استخدام الذاكرة (البيانات غير المدارة والمدارة).

وبالتالي ، من الشائع جدًا رؤية اختلافات كبيرة بين البايتات الخاصة والظاهرية في هذه الأطر.

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