यदि प्रोग्राम जवाब नहीं दे रहा है, तो विंडोज कैसे जानता है?


174

यदि प्रोग्राम जवाब नहीं दे रहा है, तो विंडोज कैसे जानता है? क्या यह सभी चालू अनुप्रयोगों को लगातार मतदान करता रहता है?



@ Magicandre1981 यह पृष्ठ यह जांचने के लिए एक तरीका प्रस्तावित करता है कि एक कार्यक्रम सक्रिय रूप से कुछ कर रहा है, लेकिन यह वह तरीका नहीं है जो विंडोज वास्तव में उपयोग करता है।
केविन पैंको

विंडोज संदेश कतार में देखें, एक उम्मीदवार PeekMessage () फ़ंक्शन है
लूसियानो

जवाबों:


150

एक अनुप्रयोग विंडोज द्वारा प्रदान की गई एक कतार से घटनाओं को प्राप्त करता है।

यदि एप्लिकेशन कुछ समय (5 सेकंड) के लिए ईवेंट को प्रदूषित नहीं करता है, उदाहरण के लिए जब एक लंबी गणना कर रहा है, तो विंडोज मानता है कि एप्लिकेशन लटका हुआ है और उपयोगकर्ता को सचेत करता है।

इस बात से बचने के लिए कि आवेदन कर्ताओं के लिए महंगी गणना को धकेल दें या प्रसंस्करण को विभाजित कर दें और सुनिश्चित करें कि कतार नियमित रूप से प्रदूषित हो जाती है।


27
↑ यह। शेड्यूलिंग के साथ कुछ भी नहीं करना है या जैसे कि स्वीकृत उत्तर में सुझाव दिया गया है, केवल यह कि क्या आप नियमित रूप से कॉल करते हैं GetMessage(या पसंद करते हैं) और DispatchMessage
डेमॉन

1
स्वीकृत उत्तर, IsHungAppWindowसही ढंग से नोट करने के संदर्भ में कि स्टार्टअप चरण में एक कार्यक्रम को कॉल नहीं करना है GetMessage
एमएसलेटर

@ एसएमएस स्टार्टअप के साथ समय से पहले परिभाषित किया जा रहा है GetMessage? यह सुविधा सरल कमांड लाइन एप्स को बिना लटकाए काम करने की अनुमति देती है क्योंकि उन्हें कतार को प्रदूषित करने की आवश्यकता नहीं है।
शाफ़्ट

4
@ratchetfreak: संभवतः पहले CreateWindow कॉल से पहले। कमांड लाइन ऐप पूरी तरह से अलग जानवर हैं; वे ConHost.EXE के अंदर चल रहे हैं और यह उनके लिए Windows GUI susbystem के साथ बातचीत करता है।
एमएसलेटर

1
इसके अलावा, यह मुझे लगता है कि विंडोज 7 (और संभवतः पहले) में है कि खिड़कियां इस बात को जल्द ही नोटिस करेंगी यदि आप कोशिश करते हैं और किसी तरह से खिड़की में हेरफेर करने में विफल रहते हैं। जैसे अगर कोई प्रोग्राम अधिकतम या संदेश को स्थानांतरित करने की प्रक्रिया नहीं करता है, तो विंडोज़ 7 लगभग 1 या 2 सेकंड के बाद जवाब नहीं देने के लिए सही कूद जाएगा ..
डेव कजिनो

78

यदि प्रोग्राम जवाब नहीं दे रहा है, तो विंडोज कैसे जानता है?

विंडोज के लिए स्रोत कोड के बिना हम यह सुनिश्चित नहीं कर सकते कि यह आंतरिक रूप से क्या कर रहा है।

एक एसडीके विंडोज फ़ंक्शन IsHungAppWindowहै जिसका उपयोग किया जा सकता है।

ऐसा माना जाता है कि किसी एप्लिकेशन का जवाब नहीं दिया जाता है यदि वह इनपुट की प्रतीक्षा नहीं कर रहा है, स्टार्टअप प्रोसेसिंग में नहीं है, और 5 सेकंड की आंतरिक समय अवधि के भीतर PeekMessage को नहीं बुलाया है ।

स्रोत IsHungAppWindow फ़ंक्शन

यदि एक शीर्ष-स्तरीय विंडो कई सेकंड से अधिक संदेशों का जवाब देना बंद कर देती है, तो सिस्टम खिड़की को प्रतिक्रिया नहीं देने वाला मानता है। इस स्थिति में, सिस्टम विंडो को छुपाता है और इसे एक भूत खिड़की से बदल देता है जिसमें समान Z ऑर्डर, स्थान, आकार और दृश्य विशेषताएँ होती हैं। यह उपयोगकर्ता को इसे स्थानांतरित करने, इसे आकार बदलने या एप्लिकेशन को बंद करने की अनुमति देता है। हालाँकि, ये केवल उपलब्ध क्रियाएं हैं क्योंकि एप्लिकेशन वास्तव में प्रतिक्रिया नहीं दे रहा है।

संदेश और संदेश कतार के बारे में स्रोत


क्या यह सभी चालू अनुप्रयोगों को लगातार मतदान करता रहता है?

नहीं। अनुप्रयोग प्रदूषित नहीं हैं, लेकिन प्रोसेसर समय दिया गया है।

विंडोज में एक शेड्यूलिंग सिस्टम है जो एप्लिकेशन थ्रेड को प्रोसेसर समय देता है।

शेड्यूलिंग एल्गोरिथ्म जटिल है, और विंडोज इंटरनल्स, भाग 1 (6 वें संस्करण) (डेवलपर संदर्भ) में पूरी तरह से वर्णित है ।


2
हैंग स्टेट सीपीयू पर आधारित नहीं है। अधिकांश कार्यक्रम 99.999% समय के लिए इस मायने में "त्रिशंकु" हैं और कुछ भी नहीं करते हैं।
usr

2
@usr मैंने कहां कहा कि "त्रिशंकु" सीपीयू पर निर्भर करता है?
DavidPostill

2
@usr उत्तर का पहला भाग उत्तर दे रहा है "क्या यह सभी चालू अनुप्रयोगों को लगातार मतदान करता रहता है?"। ); दूसरी छमाही "उत्तर दे रहा है विंडोज कैसे पता चलेगा कि एक कार्यक्रम जवाब नहीं है ?. ओपी एक में दो प्रश्न पूछे करता
DavidPostill

9
हालांकि, यह वास्तव में मतदान नहीं है? मुझे लगता है कि जब आप कॉल करते हैं तो इंटर्नल खिड़की पर एक प्रतीक्षा हैंडल की तरह संकेतित होते हैं PeekMessage। इसलिए जब विंडोज एप्लिकेशन को एक संदेश भेजता है, और पांच सेकंड के भीतर सिग्नल नहीं मिलता है, तो यह एप्लिकेशन को जवाब नहीं देने के रूप में चिह्नित करता है। और वास्तव में, अधिक हाल के विंडोज पर, विंडो केवल "जवाब नहीं दे रही है" चिह्नित है यदि यह समय में उपयोगकर्ता इनपुट का जवाब देने में विफल रहा - जब तक कि मैं एक कुंजी या कुछ को क्लिक करने या दबाने की कोशिश नहीं करता, तो आवेदन आसानी से "लटका" रह सकता है। गैर-उत्तरदायी "दिखाई देने वाले" मिनट के बिना।
लुआं

2
आप "संदेश और संदेश कतार के ऊपर" सब कुछ हटा सकते हैं क्योंकि यह जवाब देने में मदद नहीं करता है। विंडोज जानता है कि एक ऐप ने प्रतिक्रिया देना बंद कर दिया है क्योंकि यह संदेश पंप करना बंद कर देता है। एप्लिकेशन को पंपिंग संदेशों के बजाय कुछ गहन करने के बावजूद (लेकिन खराब तरीके से तैयार किए गए प्रोग्राम) के अनुसार चलाया जा सकता है।
एंडी

32

दरअसल, विंडोज को हमेशा पता नहीं होता है कि कोई एप्लिकेशन जवाब नहीं दे रहा है। विंडो के साथ एप्लिकेशन को एक इंटरैक्टिव अनुप्रयोग होना चाहिए, और विंडो को संदेश प्राप्त करना होगा कि एप्लिकेशन प्रक्रिया करने में विफल रहता है, इससे पहले कि विंडोज यह निष्कर्ष निकाले कि एप्लिकेशन जवाब नहीं दे रहा है।

उदाहरण के लिए, विंडोज में यह जानने का कोई तरीका नहीं है कि क्या कमांड लाइन से चलने वाला कोई यूजर इंटरफेस वाला नंबर-क्रंचिंग एप्लिकेशन अपना काम कर रहा है, या शायद एक अनंत लूप में फंस गया है।

विंडोज में इंटरएक्टिव ग्राफिकल एप्लिकेशन एक संदेश कतार को लगातार मतदान करके घटनाओं को प्राप्त करते हैं। विंडोज इस संदेश कतार को कीबोर्ड, माउस, टाइमर, आदि घटनाओं के साथ आबाद करता है। यदि कोई एप्लिकेशन संदेश कतार को कुछ समय के लिए विफल करने में विफल रहता है (5 सेकंड में IsHungAppWindow () फ़ंक्शन प्रलेखन में उल्लिखित टाइमआउट है), विंडोज एप्लिकेशन को "त्रिशंकु" मानता है, जिसे वह विंडो शीर्षक (पाठ जोड़कर) बदलकर संकेत कर सकता है (प्रतिसाद नहीं दे रहा है) "या स्थानीय संस्करणों में समतुल्य पाठ) और उपयोगकर्ता द्वारा विंडो के साथ बातचीत करने की कोशिश करने पर खिड़की की सामग्री को बाहर निकाल देना।

अनुप्रयोग उन तरीकों से लटकाए जा सकते हैं जो Windows नहीं पहचानता है। उदाहरण के लिए, कोई एप्लिकेशन उन पर संदेश पंक्ति में संदेशों के लिए मतदान जारी रख सकता है, उन पर ठीक से काम किए बिना, इसलिए सभी व्यावहारिक इरादों और उद्देश्यों के लिए यह विंडोज के बिना "लटकाए" दिखाई देगा कि यह गैर-उत्तरदायी है।


8
जवाब नहीं, परिभाषा के अनुसार, विंडो संदेशों को संसाधित नहीं करने का मतलब है, इसलिए यह सेवाओं या कंसोल ऐप पर लागू नहीं होता है, और इसलिए मैं कहूंगा कि विंडोज़ हमेशा जानता है कि क्या ऐप जवाब नहीं दे रहा है। आप मृत ताले को भ्रमित कर रहे हैं और जवाब नहीं दे रहे हैं।
एंडी

बेशक यह पता चल सकता है कि क्या कोई प्रोग्राम जवाब नहीं दे रहा है। "जवाब नहीं" "एक अनंत लूप में फंस गया" के समान नहीं है
ब्लूराजा - डैनी पफ्लुगुएफ्ट

1
वास्तव में, एक एप्लिकेशन GetMessage () के माध्यम से संदेश प्राप्त कर सकता है और उन्हें संसाधित करने में विफल हो सकता है, और यह इस तथ्य के बावजूद विंडोज द्वारा "जवाब नहीं" के रूप में पहचाना नहीं जाएगा कि यह निश्चित रूप से अपने उपयोगकर्ता के लिए गैर-उत्तरदायी दिखाई देगा। शब्द "जवाब नहीं" भी अक्सर नेटवर्क, सेवा, इंटरैक्टिव कमांड लाइन, आदि अनुप्रयोगों का वर्णन करने के लिए उपयोग किया जाता है; AFAIK कोई औपचारिक परिभाषा नहीं है जो वाक्यांश को विंडो किए गए अनुप्रयोगों तक सीमित करती है। एक गतिरोध या एक अनन्त लूप (या कोई अन्य प्रोग्रामिंग त्रुटि) दोनों एक एप्लिकेशन को गैर-उत्तरदायी बनने का कारण बन सकते हैं, लेकिन नहीं, मैंने कारण और प्रभाव को भ्रमित नहीं किया।
विक्टर टोथ

10

विंडोज एक ऑपरेटिंग सिस्टम है, यह सभी चल रहे कार्यक्रमों की देखरेख कर रहा है।

विंडोज़ घटनाओं का उपयोग करके विंडो-आधारित अनुप्रयोगों के साथ संचार करता है। प्रत्येक प्रोग्राम में एक थ्रेड होता है जो लगातार आने वाली घटनाओं को सुनता है और उन्हें प्रोसेस करता है। उदाहरण के लिए जब आप एक बटन या अधिसूचना क्षेत्र आइकन पर क्लिक करते हैं, तो विंडोज एक घटना उत्पन्न करता है और इसे उचित प्रक्रिया में फीड करता है। प्रक्रिया तब तय कर सकती है कि इसे कैसे संभालना है।

प्रोग्राम के साथ सभी इंटरैक्शन विंडोज में ईवेंट-आधारित हैं, इसलिए जब प्रोग्राम आने वाली घटनाओं को बहुत लंबे समय तक संसाधित नहीं करता है, तो इसका मतलब है कि यह प्रतिक्रिया नहीं करता है। जैसा कि @DavidPostill ने अपने उत्तर में पाया और नोट किया है , टाइमआउट 5 सेकंड है। PeekMessageवह कार्य है जिसे ईवेंट कतार से कोई ईवेंट मिलता है।


0

आपके प्रश्न का उत्तर हां / नहीं है।

हालांकि विंडोज ओएस विंडोज मैसेजिंग क्यू में घटनाओं के साथ आवेदन कर सकता है और कर सकता है, WinAPI से लिंक करने या विंडोज क्यू को हैंडल / जवाब देने के लिए प्रोग्राम बिल्कुल शून्य दायित्व के तहत हैं। यहां तक ​​कि कतार में एक संदेश का जवाब देने से विंडोज को यह नहीं बताया जाता है कि कार्यक्रम "लॉक अप" है या नहीं। यह एक संकेतक है, लेकिन यह सब है। असली जवाब थोड़ा और अधिक जटिल है।

असली जवाब

लोग यहां वास्तविक उत्तर के आसपास बचाव कर रहे हैं। यह निर्धारित करना कि क्या कोई कार्यक्रम "जवाब नहीं दे रहा है" " पड़ाव समस्या " का एक प्रकार है , जो कंप्यूटर विज्ञान में औपचारिक रूप से अनिर्दिष्ट है। संक्षिप्त विवरण यह है कि प्रोसेसर एक थर्ड पार्टी के रूप में कार्य कर सकता है जो यह निर्धारित करने के लिए कि क्या सबरूटिन अनंत लूप में फंस गया है, कुछ भी नहीं कर रहा है, एक काउंटर को बढ़ाता है जो कुछ निश्चित, सामान्य संख्या में समाप्त हो जाएगा। इन दोनों को कसकर बंद छोरों के रूप में माना जा सकता है। एक पड़ाव, दूसरा कभी समाप्त नहीं होगा। यहां तक ​​कि आप एक व्यक्ति के रूप में, यह नहीं जानते कि कोई कार्यक्रम वास्तव में प्रतिक्रिया दे रहा है या नहीं, खासकर यदि यह एक कसकर बंद लूप में है - आप केवल यह जानते हैं कि क्या यह सोचना चाहिए (प्रतिक्रिया)।

विंडोज के दृष्टिकोण से, ये दोनों लूप "जवाब नहीं दे रहे हैं " हैं । इसलिए विंडोज़ आपको प्रतीक्षा करने या समाप्त करने का विकल्प देता है, क्योंकि यह नहीं बता सकता।

तो परिणाम "क्यों खिड़कियों को पता है कि एक प्रक्रिया है है जवाब?" उत्तर बल्कि चालाक है। जब एक प्रक्रिया को बहु-थ्रेडेड और बहु-प्रक्रिया ओएस में संकलित किया जाता है, तो कभी-कभी कसकर बंद छोरों में भी, संकलक एक उपज () कमांड में जोड़ सकता है , जो प्रोसेसर को एक सुविधाजनक सूचना प्रदान करता है कि यह अन्य चल रही प्रक्रियाओं पर स्विच कर सकता है । यह प्रोसेसर को "छोड़ देता है" और "संदर्भ स्विच" (जैसा कि इसे कहा जाता है) होता है जो ओएस (विंडोज शामिल) को स्टैक में अन्य घटनाओं का जवाब देने की अनुमति देता है, जिनमें से कुछ में ट्रैकिंग शामिल है जो प्रक्रिया ने जवाब दिया है।

** इसका मतलब यह नहीं है कि एक प्रतिक्रिया प्रक्रिया समाप्त हो जाएगी । ** एक अनंत लूप के अंदर एक प्रक्रिया प्रोसेसर का उत्पादन कर सकती है, जिससे विंडोज अन्य घटनाओं को संसाधित कर सकता है।

कुछ विंडोज़ कार्यक्रमों में, प्रोग्राम विंडोज़ ओएस सिग्नल को हैंडल करेगा, जो ओएस को बता सकता है कि यह "जवाब दे रहा है", लेकिन ऐसा करने के लिए कोई भी कार्यक्रम किसी भी दायित्व के तहत नहीं है। आप विंडोज पर उच्च स्तर की भाषाओं जैसे कि पर्ल, php, पायथन और विंडोज के भीतर भी काफी सरल सीपीयू हॉगिंग, नॉन-टर्मिनेटिंग प्रोग्राम लिख सकते हैं और हो सकता है कि विंडोज यह पता नहीं लगा सके कि यह समाप्त नहीं हो रहा है और जवाब नहीं दे रहा है। उस बिंदु पर, विंडोज उत्तराधिकार पर निर्भर करता है - सीपीयू लोड, मेमोरी, प्रोग्राम को "अनुमान" करने के लिए चल रहा था, तो प्रोसेसर ने कितने व्यवधानों को संभाला। फिर, उस बिंदु पर, विंडोज को आपको समाप्त करने के लिए कहना होगा, क्योंकि यह वास्तव में नहीं जानता कि क्या होना चाहिए।

विक्टर का (सही) उत्तर भी देखें। टिप्पणियों के बारे में उपेक्षा करें कि क्या "जवाब नहीं" अनंत लूप के समान नहीं है। सभी प्रकार के संदेश, व्यवधान, लूप हैं जो कि एक अनुप्रयोग विंडोज संदेश कतार को सूचित किए बिना संभाल सकता है या नहीं कर सकता है। संदेश कतार को संभालना कई प्रकार की घटनाओं में से एक है जो ओएस काउंटररों को यह अनुमान लगाने की कोशिश करता रहता है कि क्या कोई प्रक्रिया लटका दी गई है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.