كيف يمكنني قصر DLL خارجي على وحدة معالجة مركزية واحدة؟

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

سؤال

لدي برنامج أرغب في تشغيله على وحدة معالجة مركزية واحدة فقط حتى لا يستهلك الكثير من موارد النظام.تكمن المشكلة في أنه يقوم باستدعاء ملف DLL خارجي يستخدم تلقائيًا كافة مراكز وحدة المعالجة المركزية المتوفرة.ليس لدي الكود المصدري لملف DLL الخارجي.كيف يمكنني قصر DLL على استخدام وحدة معالجة مركزية واحدة فقط؟

يحرر:شكرًا على المساعدة، إليك الرمز الذي استخدمته لقصره على وحدة معالجة مركزية واحدة (Windows):

// Limit the process to only 1 thread so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
DWORD ProcessAffinityMask;
DWORD SystemAffinityMask;
if(GetProcessAffinityMask(ProcessHandle,&ProcessAffinityMask,&SystemAffinityMask)
    && SystemAffinityMask != 0)
{
    // Limit to 1 thread by masking all but 1 bit of the system affinity mask
    DWORD NewProcessAffinityMask = ((SystemAffinityMask-1) ^ SystemAffinityMask) & SystemAffinityMask;
    SetProcessAffinityMask(ProcessHandle,NewProcessAffinityMask);
}

يحرر:اتضح أن أسلوب برانون في تحديد أولوية العملية يعمل بشكل أفضل فيما أريده، وهو منع العملية من استهلاك الموارد.إليك هذا الرمز (Windows):

// Make the process low priority so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
SetPriorityClass(ProcessHandle,BELOW_NORMAL_PRIORITY_CLASS);
هل كانت مفيدة؟

المحلول

وإعداد معالج تقارب هو نهج خاطئ. دع جدولة مقبض OS.

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

لديها

ويندوز هذه الوظيفة المضمنة. الحل المناسب لذلك هو تعيين الأفضلية الأساسية للعملية.

http://msdn.microsoft.com /en-us/library/ms686219(VS.85).aspx حصول على تفاصيل حول SetPriorityClass().

إذا كنت ترغب في اختبار هذا دون كتابة أي رمز، استخدام إدارة المهام لتغيير أولوية العملية الخاصة بك.

نصائح أخرى

هل يمكن تعيين تقارب CPU من البرنامج. جرب SetProcessAffinityMask وظيفة على نظام التشغيل Windows أو <أ href ل = "http://www.kernel.org/doc/man-pages/online/pages/man2/sched_setaffinity.2.html" يختلط = "noreferrer"> sched_setaffinity على لينكس.

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

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

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

واذا لم يكن هناك شيء كنت لا يذكر، وأنا لا أرى أي سبب وجيه لحتى <قوية> محاولة للحد من مكتبة متعددة الخيوط لخيط واحد.

إذن يستخدم برنامجك مؤشر ترابط واحد، لكنك لا تريد أن يستخدم ملف DLL الخارجي أكثر من مؤشر ترابط واحد؟ليس لديك الكثير من التحكم فيما تفعله مكتبة الارتباط الحيوي (DLL) الخارجية، ولكن قد تكون بعض الطرق كالتالي:

وأنت لا تقول ما منصة هذا هو ل. أنا ذاهب لنفترض النوافذ هنا.

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

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

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