algorithm - يعمل - وحدة المعالجة المركزية pdf




كيف يتم احتساب استخدام وحدة المعالجة المركزية؟ (6)

  1. وحدة المعالجة المركزية لا تحصل على '' معلق '' ، إنها تعمل ببساطة بقدرة الذروة ، بمعنى أنها تعالج أكبر عدد من التعليمات لأنها قادرة على الوصول إلى كل ثانية. تعتبر العملية التي يتم حساب استخدام CPU بعض هذه الإرشادات. إذا حاولت التطبيقات القيام بعمليات أسرع من قدرة وحدة المعالجة المركزية (CPU) ، فببساطة سيتأخر ذلك ، وبالتالي فإن "التعلق".

  2. يعتمد حساب استخدام وحدة المعالجة المركزية على إجمالي الاستخدام المتاح. لذا إذا كانت وحدة المعالجة المركزية تحتوي على مركزين ، ونواة واحدة لديها استخدام 30 ٪ ، والآخر هو 60 ٪ ، فإن الاستخدام الإجمالي هو 45 ٪. يمكنك أيضًا رؤية استخدام كل نواة فردية.

على سطح المكتب لديّ أداة صغيرة تخبرني باستخدام وحدة المعالجة المركزية الحالية. كما يظهر الاستخدام لكل من النوى.

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


إحدى الطرق للقيام بذلك هي كما يلي:

اختر فترة أخذ عينات ، قل كل 5 دقائق (300 ثانية) من الوقت المنقضي الحقيقي. يمكنك الحصول على هذا من gettimeofday .

احصل على وقت المعالجة الذي استخدمته خلال 300 ثانية. يمكنك استخدام استدعاء times() للحصول على هذا. سيكون هذا هو new_process_time - old_process_time ، حيث old_process_time هو وقت المعالجة الذي قمت بحفظه من الفاصل الزمني الأخير.

عندئذ تكون نسبة cpu (process_time/elapsed_time)*100.0 يمكنك ضبط المنبه لإعلامك كل 300 ثانية لإجراء هذه الحسابات.

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


للحصول على استخدام وحدة المعالجة المركزية ، قم بتجربة وقت العملية بشكل دوري ، وابحث عن الفرق.

على سبيل المثال ، إذا كانت هذه هي أوقات وحدة المعالجة المركزية (CPU) الخاصة بالعملية 1:

kernel: 1:00:00.0000
user:   9:00:00.0000

ثم تحصل عليها مرة أخرى بعد مرور ثانيتين ، وهي:

kernel: 1:00:00.0300
user:   9:00:00.6100

يمكنك طرح أوقات النواة ( 0.03 ) وأوقات المستخدم ( 0.61 ) ، وإضافتها معاً ( 0.64 ) ، وتقسيمها على الوقت العينة من 2 ثانية ( 0.32 ).

على مدار الثواني الماضية ، استخدمت العملية متوسط ​​وقت وحدة المعالجة المركزية بنسبة 32٪.

إن مكالمات النظام المحددة المطلوبة للحصول على هذه المعلومات مختلفة (بشكل واضح) على كل منصة. على Windows ، يمكنك استخدام GetProcessTimes ، أو GetSystemTimes إذا كنت تريد اختصار إلى إجمالي وقت استخدام CPU أو خاملاً.


هذا هو فهمي الأساسي من التعرض القليل لرمز مشابه. تستدعي برامج مثل Task Manager (إدارة المهام) أو نظام الوصول إلى عنصر واجهة المستخدم (NtQuerySystemInformation ()) واستخدام المعلومات التي تم جمعها من نظام التشغيل لإجراء عملية حساب بسيطة للنسبة المئوية من الوقت التي تكون فيها وحدة المعالجة المركزية خاملة أو يتم استخدامها (في مقدار قياسي من الوقت). تعرف وحدة المعالجة المركزية (CPU) عندما تكون في وضع الخمول ولذلك يمكنها تحديد متى تكون غير خاملة. هذه البرامج يمكن أن تحصل بالفعل على انسداد ... مدير المهام الخاص بالكمبيوتر المحمول المتهالك يتجمد طوال الوقت عند حساب استخدام وحدة المعالجة المركزية عند طرحه بنسبة 100٪.

يمكن العثور على جزء بسيط من كود المثال على موقع MSDNs على الويب الذي يعرض استدعاءات دالة لحساب استخدام CPU لمجموعة من التعليمات: http://msdn.microsoft.com/en-us/library/aa364157(VS.85).aspx

ما يفعله هذا النظام هو الوصول إلى رمز النواة وأعتقد ... والذي هو خارج نطاق فهمي.


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

  • عندما ننتقل إلى مهمة الخمول ، قم بتعيين t = الوقت الحالي
  • عندما ننتقل من مهمة الخمول ، أضف (time-t) إلى الإجمالي الجاري

إذا أخذنا عينتين من إجمالي عدد n ثانية متباعدة ، فيمكننا حساب النسبة المئوية لتلك الثواني التي قضيتها في تشغيل المهمة الخاملة (عينة ثانية - العينة الأولى) / n

لاحظ أن هذا شيء يفعله نظام التشغيل وليس وحدة المعالجة المركزية. مفهوم المهمة غير موجود على مستوى وحدة المعالجة المركزية! (في الممارسة العملية ، ستضع المهمة الخاملة المعالج في وضع السكون بتعليمات HLT ، لذا فإن وحدة المعالجة المركزية تعرف متى لا يتم استخدامها)

أما بالنسبة للسؤال الثاني ، فإن أنظمة التشغيل الحديثة متعددة المهام بشكل استباقي ، وهو ما يعني أن نظام التشغيل يمكن أن يبتعد عن مهمتك في أي وقت. كيف يسرق نظام التشغيل فعلا وحدة المعالجة المركزية بعيدا عن مهمتك؟ المقاطعات: http://en.wikipedia.org/wiki/Interrupt


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

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

هذه هي وظيفة لينكس في (ممزقة من ويكيبيديا) التي تؤدي الحساب المذكور :

#define FSHIFT   11  /* nr of bits of precision */
#define FIXED_1  (1<<FSHIFT) /* 1.0 as fixed-point */
#define LOAD_FREQ (5*HZ) /* 5 sec intervals */
#define EXP_1  1884  /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5  2014  /* 1/exp(5sec/5min) */
#define EXP_15 2037  /* 1/exp(5sec/15min) */

#define CALC_LOAD(load,exp,n) \
    load *= exp; \
    load += n*(FIXED_1-exp); \
    load >>= FSHIFT;

unsigned long avenrun[3];

static inline void calc_load(unsigned long ticks)
{
    unsigned long active_tasks; /* fixed-point */
    static int count = LOAD_FREQ;

    count -= ticks;
    if (count < 0) {
        count += LOAD_FREQ;
        active_tasks = count_active_tasks();
        CALC_LOAD(avenrun[0], EXP_1, active_tasks);
        CALC_LOAD(avenrun[1], EXP_5, active_tasks);
        CALC_LOAD(avenrun[2], EXP_15, active_tasks);
    }
}

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





cpu-architecture