سؤال

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

الآن أنا قد يقع الأكثر استهلاكا للوقت حلقة في الموضوع (لا ضغط فقط) و استخدام GetTickCount() و Sleep() مع ضمنية القيم.فإنه يتأكد أن الحلقة تستمر لفترة معينة من الوقت و من ينام لفترة معينة من الحد الأدنى من الوقت.أكثر أو أقل لا وظيفة أيضمانات بأن الموضوع لن تستخدم أكثر من 50 ٪ من وحدة المعالجة المركزية.
ومع ذلك السلوك يعتمد على عدد النوى وحدة المعالجة المركزية (عيب كبير) و ببساطة القبيح (أصغر عيب :)).
أي أفكار ؟

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

المحلول

أنا لست على علم بأي API للحصول على نظام التشغيل المجدول أن تفعل ما تريد (حتى لو كان الخيط الخاص بك خاملا-الأولوية ، إذا كان هناك أي أولوية أعلى على استعداد المواضيع لك تشغيل).ومع ذلك, أعتقد أنك يمكن أن الارتجال إلى حد ما أنيقة اختناق وظيفة بناء على ما تقومون به بالفعل.أساسا (لا يكون لديك ويندوز ديف آلة يدوية):

اختيار الافتراضي مقدار الوقت موضوع النوم كل التكرار.ثم على كل التكرار (أو على كل النونية التكرار ، مثل أن اختناق وظيفة لا نفسها تصبح كبيرة CPU load) ،

  1. حساب مقدار من الوقت وحدة المعالجة المركزية الخاصة بك الخيط تستخدم منذ آخر مرة اختناق وظيفة كان يسمى (سأتصل هذا dCPU).يمكنك استخدام GetThreadTimes() API للحصول على كمية من الوقت الخاص بك الموضوع تم تنفيذ.
  2. حساب كمية الحقيقي الوقت المنقضي منذ آخر مرة اختناق وظيفة كان يسمى (سأتصل هذا dClock).
  3. dCPU / dClock هو استخدام CPU بنسبة (واحد وحدة المعالجة المركزية).إذا كان أعلى مما تريد زيادة وقت النوم الخاصة بك ، إذا كان أقل ، تقليل وقت النوم.
  4. لديك موضوع النوم احتساب الوقت.

اعتمادا على كيفية الوكالة الدولية للطاقة يحسب استخدام وحدة المعالجة المركزية ، قد ترغب في استخدام GetProcessAffinityMask() لمعرفة كيفية العديد من وحدات المعالجة المركزية للنظام.dCPU / (dClock * وحدات المعالجة المركزية) هو النسبة المئوية من إجمالي الوقت وحدة المعالجة المركزية المتوفرة.

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

نصائح أخرى

على لينكس ، يمكنك تغيير جدولة أولوية الموضوع مع نيس().

لا أستطيع التفكير في أي عبر منصة طريقة ما تريد (أو أي طريقة مضمونة وقف كامل) ولكن كما كنت تستخدم GetTickCount ربما كنت لا ترغب في عبر منصة :)

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

تحرير:أنا أتفق مع برنارد ولهذا أعتقد أن عملية بدلا من موضوع قد يكون أكثر ملاءمة لكن قد لا تتناسب مع الأغراض الخاصة بك.

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

يبدو لي مثل المشكلة هي عملية المراقبة.

إذا كان لديك خلفية مهمة منضم CPU ثم تريد أن تأخذ كل شيء غير المستخدمة من وقت وحدة المعالجة المركزية عن مهمته.

ربما يجب عليك أن تنظر في تحديد الوكالة الدولية للطاقة البرنامج ؟

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

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