سؤال كيف يعرف نظام Windows ما إذا كان أحد البرامج لا يستجيب؟


كيف يعرف نظام Windows ما إذا كان أحد البرامج لا يستجيب؟ هل يستمر باستمرار في إجراء الاستطلاعات لجميع التطبيقات قيد التشغيل؟


171
2017-08-24 07:33


الأصل


hurryupandwait.io/blog/detecting-a-hung-windows-process - magicandre1981
@ magicandre1981 تقترح هذه الصفحة طريقة واحدة للتحقق من أن أحد البرامج يقوم بعمل شيء ما ، ولكنه ليس الطريقة التي يستخدمها Windows بالفعل. - Kevin Panko
انظر إلى قائمة انتظار رسائل Windows ، المرشح هو الدالة PeekMessage () - Luciano


الأجوبة:


يحصل أحد التطبيقات على الأحداث من قائمة انتظار يوفرها Windows.

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

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


149
2017-08-24 10:09



↑ هذا. لا علاقة له بجدولة أو كما هو مقترح في الإجابة المقبولة ، فقط إذا كنت تتصل بانتظام GetMessage (أو ما شابه) و DispatchMessage. - Damon
الجواب المقبول ، في اشارة الى IsHungAppWindow يلاحظ بشكل صحيح أن البرنامج في مرحلة بدء التشغيل ليس من الضروري الاتصال GetMessage. - MSalters
MSalters مع تعريف بدء التشغيل كالوقت قبل الأول GetMessage؟ تسمح هذه الميزة لتطبيقات سطر الأوامر البسيطة بالعمل دون اعتبارها معلقة لأنها لا تحتاج إلى استطلاع قائمة الانتظار. - ratchet freak
ratchetfreak: يفترض قبل استدعاء CreateWindow الأول. تطبيقات سطر الأوامر هي حيوانات مختلفة تماما ؛ انهم يركضون داخل ConHost.EXE ويتفاعل مع نظام التشغيل Windows GUI susbystem لهم. - MSalters
أيضا ، يبدو لي أنه في ويندوز 7 (وربما في وقت سابق) أن النوافذ ستلاحظ ذلك في وقت أقرب بكثير إذا حاولت وفشلت في التعامل مع النافذة بطريقة ما. كما لو أن البرنامج لا يعالج رسالة تكبير أو نقل ، فإن Windows 7 سوف يقفز إلى اليمين لعدم الاستجابة بعد حوالي ثانية أو ثانيتين. - Dave Cousineau


كيف يعرف نظام Windows ما إذا كان أحد البرامج لا يستجيب؟

بدون شفرة المصدر إلى Windows ، لا يمكننا التأكد مما تفعله داخليًا.

هناك وظيفة SDK Windows IsHungAppWindow ذلك يمكن استخدامه.

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

مصدر وظيفة IsHungAppWindow

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

مصدر حول الرسائل وقوائم الرسائل


هل يستمر باستمرار في إجراء الاستطلاعات لجميع التطبيقات قيد التشغيل؟

لا. لا يتم استقصاء التطبيقات ولكن مع إعطاء وقت المعالج.

يحتوي Windows على نظام جدولة يعطي المعالج الوقت إلى مؤشرات الترابط التطبيق.

تكون خوارزمية الجدولة معقدة ، ويتم وصفها بالكامل في Windows Internals ، الجزء 1 (الإصدار 6) (مرجع المطور).


78
2017-08-24 08:48



لا يستند حالة تعليق وحدة المعالجة المركزية (CPU). معظم البرامج "معلقة" بهذا المعنى لمدة 99.999 ٪ من الوقت ولا تفعل شيئا. - usr
usr أين قلت أن "معلقة" يعتمد على وحدة المعالجة المركزية؟ - DavidPostill♦
@ الإجابة: الإجابة في النصف الأول من الإجابة "هل تستمر في إجراء الاستطلاعات لكافة التطبيقات قيد التشغيل؟". أما النصف الثاني فيجيب على "كيف يعرف نظام ويندوز ما إذا كان البرنامج لا يستجيب؟" سأل OP سؤالين في واحد ؛) - DavidPostill♦
ليس حقا الاقتراع ، على الرغم من ذلك ، أليس كذلك؟ أفترض الداخلية هي أشبه بمؤشر الانتظار على النافذة هو الإشارة عند الاتصال PeekMessage. لذلك عندما يرسل Windows رسالة إلى التطبيق ، ولا يتم إرسال إشارة خلال خمس ثوانٍ ، فإنه يشير إلى أن التطبيق لا يستجيب. وفي الواقع ، في Windows الأحدث ، يتم وضع علامة على الإطار "لا يستجيب" إلا إذا فشلت الاستجابة المستعمل مدخلات في الوقت - حتى أحاول الضغط أو الضغط على مفتاح أو شيء ما ، يمكن التطبيق بسهولة البقاء "معلقة" لدقائق دون "الظهور" غير متجاوب. - Luaan
يمكنك حذف كل شيء فوق "حول الرسائل ورسائل الرسائل" لأنها لا تساعد في الإجابة. يعرف Windows توقف التطبيق عن الاستجابة لأنه يتوقف عن ضخ الرسائل. يمكن تشغيل التطبيق على الرغم من أن القيام به شيء مكثف بدلا من ضخ الرسائل (ولكن هذا برنامج مصمم بشكل سيء). - Andy


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

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

تتلقى التطبيقات الرسومية التفاعلية في Windows الأحداث عن طريق استطلاع قائمة انتظار الرسائل باستمرار. يقوم Windows بملء قائمة انتظار الرسائل هذه باستخدام أحداث لوحة المفاتيح أو الماوس أو المؤقت أو ما إلى ذلك. إذا فشل تطبيق لاستقصاء قائمة انتظار الرسائل لبعض الوقت (5 ثوان هو المهلة المذكورة في وثائق الدالة IsHungAppWindow ()) ، يعتبر Windows التطبيق "hung" ، والذي قد يشير عن طريق تغيير عنوان الإطار (إضافة النص " (لا يستجيب) "أو نص مكافئ في الإصدارات المترجمة" ويؤدي إلى شطب محتويات النافذة إذا حاول المستخدم التفاعل مع النافذة.

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


32
2017-08-24 11:12



لا يعني عدم الاستجابة ، بحكم التعريف ، عدم معالجة رسائل النوافذ ، لذلك لا ينطبق على الخدمات أو تطبيقات وحدة التحكم ، ولذا فإنني أقول أن Windows يعرف دائمًا ما إذا كان التطبيق لا يستجيب. أنت تربك أقفال ميتة ولا تستجيب. - Andy
بالطبع يمكن معرفة ما إذا كان البرنامج لا يستجيب. "لا يستجيب" ليس هو نفسه "عالق في حلقة لا نهائية" - BlueRaja - Danny Pflughoeft
في الواقع ، يمكن للتطبيق استرداد الرسائل عبر GetMessage () وفشل في معالجتها ، ولن يتم التعرف عليه على أنه "لا يستجيب" من قبل Windows على الرغم من حقيقة أنه سيبدو بالتأكيد غير مستجيب لمستخدمه. يستخدم مصطلح "لا يستجيب" في كثير من الأحيان لوصف الشبكة ، الخدمة ، سطر الأوامر التفاعلي ، إلخ. AFAIK لا يوجد تعريف رسمي يحد من العبارة إلى تطبيقات windowed. يمكن أن يؤدي كل من حالة توقف تام أو حلقة لا نهائية (أو أي خطأ برمجي آخر) إلى جعل التطبيق غير مستجيب ، ولكن لا ، لم أخلط بين السبب والتأثير. - Viktor Toth


Windows هو نظام تشغيل ، وهو يشرف على جميع البرامج قيد التشغيل.

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

جميع التفاعلات مع البرامج تعتمد على الحدث في Windows ، لذلك عندما لا يقوم البرنامج بمعالجة الأحداث الواردة لفترة طويلة ، فهذا يعني أنه لا يستجيب. كماDavidPostill وجدت ولاحظت في إجابته، المهلة هي 5 ثوان. PeekMessage هي الوظيفة التي تحصل على حدث من قائمة انتظار الأحداث.


10
2017-08-24 09:00





الجواب على سؤالك هو نعم / لا.

على الرغم من أن نظام التشغيل Windows يمكنه إجراء استقصاء للتطبيقات مع الأحداث في قائمة انتظار المراسلة في Windows ، فإن البرامج تكون تحت الالتزام تمامًا للارتباط بـ WinAPI أو معالجة / الإجابة على قائمة انتظار Windows. حتى الإجابة على رسالة في قائمة الانتظار لا تخبر Windows ما إذا كان البرنامج "مؤمنًا" أم لا. إنه مؤشر ، لكن هذا كل ما هو. الجواب الحقيقي أكثر تعقيدًا بعض الشيء.

الجواب الحقيقي

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

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

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

** هذا لا يعني أن عملية الاستجابة سوف إنهاء. ** يمكن أن تسفر عملية داخل حلقة لا نهائية عن المعالج ، مما يسمح لـ Windows بمعالجة الأحداث الأخرى.

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

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


0
2018-03-14 02:57