यदि प्रोग्राम जवाब नहीं दे रहा है, तो विंडोज कैसे जानता है? क्या यह सभी चालू अनुप्रयोगों को लगातार मतदान करता रहता है?
यदि प्रोग्राम जवाब नहीं दे रहा है, तो विंडोज कैसे जानता है? क्या यह सभी चालू अनुप्रयोगों को लगातार मतदान करता रहता है?
जवाबों:
एक अनुप्रयोग विंडोज द्वारा प्रदान की गई एक कतार से घटनाओं को प्राप्त करता है।
यदि एप्लिकेशन कुछ समय (5 सेकंड) के लिए ईवेंट को प्रदूषित नहीं करता है, उदाहरण के लिए जब एक लंबी गणना कर रहा है, तो विंडोज मानता है कि एप्लिकेशन लटका हुआ है और उपयोगकर्ता को सचेत करता है।
इस बात से बचने के लिए कि आवेदन कर्ताओं के लिए महंगी गणना को धकेल दें या प्रसंस्करण को विभाजित कर दें और सुनिश्चित करें कि कतार नियमित रूप से प्रदूषित हो जाती है।
GetMessage(या पसंद करते हैं) और DispatchMessage।
IsHungAppWindowसही ढंग से नोट करने के संदर्भ में कि स्टार्टअप चरण में एक कार्यक्रम को कॉल नहीं करना है GetMessage।
GetMessage? यह सुविधा सरल कमांड लाइन एप्स को बिना लटकाए काम करने की अनुमति देती है क्योंकि उन्हें कतार को प्रदूषित करने की आवश्यकता नहीं है।
विंडोज के लिए स्रोत कोड के बिना हम यह सुनिश्चित नहीं कर सकते कि यह आंतरिक रूप से क्या कर रहा है।
एक एसडीके विंडोज फ़ंक्शन IsHungAppWindowहै जिसका उपयोग किया जा सकता है।
ऐसा माना जाता है कि किसी एप्लिकेशन का जवाब नहीं दिया जाता है यदि वह इनपुट की प्रतीक्षा नहीं कर रहा है, स्टार्टअप प्रोसेसिंग में नहीं है, और 5 सेकंड की आंतरिक समय अवधि के भीतर PeekMessage को नहीं बुलाया है ।
स्रोत IsHungAppWindow फ़ंक्शन
यदि एक शीर्ष-स्तरीय विंडो कई सेकंड से अधिक संदेशों का जवाब देना बंद कर देती है, तो सिस्टम खिड़की को प्रतिक्रिया नहीं देने वाला मानता है। इस स्थिति में, सिस्टम विंडो को छुपाता है और इसे एक भूत खिड़की से बदल देता है जिसमें समान Z ऑर्डर, स्थान, आकार और दृश्य विशेषताएँ होती हैं। यह उपयोगकर्ता को इसे स्थानांतरित करने, इसे आकार बदलने या एप्लिकेशन को बंद करने की अनुमति देता है। हालाँकि, ये केवल उपलब्ध क्रियाएं हैं क्योंकि एप्लिकेशन वास्तव में प्रतिक्रिया नहीं दे रहा है।
संदेश और संदेश कतार के बारे में स्रोत
नहीं। अनुप्रयोग प्रदूषित नहीं हैं, लेकिन प्रोसेसर समय दिया गया है।
विंडोज में एक शेड्यूलिंग सिस्टम है जो एप्लिकेशन थ्रेड को प्रोसेसर समय देता है।
शेड्यूलिंग एल्गोरिथ्म जटिल है, और विंडोज इंटरनल्स, भाग 1 (6 वें संस्करण) (डेवलपर संदर्भ) में पूरी तरह से वर्णित है ।
PeekMessage। इसलिए जब विंडोज एप्लिकेशन को एक संदेश भेजता है, और पांच सेकंड के भीतर सिग्नल नहीं मिलता है, तो यह एप्लिकेशन को जवाब नहीं देने के रूप में चिह्नित करता है। और वास्तव में, अधिक हाल के विंडोज पर, विंडो केवल "जवाब नहीं दे रही है" चिह्नित है यदि यह समय में उपयोगकर्ता इनपुट का जवाब देने में विफल रहा - जब तक कि मैं एक कुंजी या कुछ को क्लिक करने या दबाने की कोशिश नहीं करता, तो आवेदन आसानी से "लटका" रह सकता है। गैर-उत्तरदायी "दिखाई देने वाले" मिनट के बिना।
दरअसल, विंडोज को हमेशा पता नहीं होता है कि कोई एप्लिकेशन जवाब नहीं दे रहा है। विंडो के साथ एप्लिकेशन को एक इंटरैक्टिव अनुप्रयोग होना चाहिए, और विंडो को संदेश प्राप्त करना होगा कि एप्लिकेशन प्रक्रिया करने में विफल रहता है, इससे पहले कि विंडोज यह निष्कर्ष निकाले कि एप्लिकेशन जवाब नहीं दे रहा है।
उदाहरण के लिए, विंडोज में यह जानने का कोई तरीका नहीं है कि क्या कमांड लाइन से चलने वाला कोई यूजर इंटरफेस वाला नंबर-क्रंचिंग एप्लिकेशन अपना काम कर रहा है, या शायद एक अनंत लूप में फंस गया है।
विंडोज में इंटरएक्टिव ग्राफिकल एप्लिकेशन एक संदेश कतार को लगातार मतदान करके घटनाओं को प्राप्त करते हैं। विंडोज इस संदेश कतार को कीबोर्ड, माउस, टाइमर, आदि घटनाओं के साथ आबाद करता है। यदि कोई एप्लिकेशन संदेश कतार को कुछ समय के लिए विफल करने में विफल रहता है (5 सेकंड में IsHungAppWindow () फ़ंक्शन प्रलेखन में उल्लिखित टाइमआउट है), विंडोज एप्लिकेशन को "त्रिशंकु" मानता है, जिसे वह विंडो शीर्षक (पाठ जोड़कर) बदलकर संकेत कर सकता है (प्रतिसाद नहीं दे रहा है) "या स्थानीय संस्करणों में समतुल्य पाठ) और उपयोगकर्ता द्वारा विंडो के साथ बातचीत करने की कोशिश करने पर खिड़की की सामग्री को बाहर निकाल देना।
अनुप्रयोग उन तरीकों से लटकाए जा सकते हैं जो Windows नहीं पहचानता है। उदाहरण के लिए, कोई एप्लिकेशन उन पर संदेश पंक्ति में संदेशों के लिए मतदान जारी रख सकता है, उन पर ठीक से काम किए बिना, इसलिए सभी व्यावहारिक इरादों और उद्देश्यों के लिए यह विंडोज के बिना "लटकाए" दिखाई देगा कि यह गैर-उत्तरदायी है।
विंडोज एक ऑपरेटिंग सिस्टम है, यह सभी चल रहे कार्यक्रमों की देखरेख कर रहा है।
विंडोज़ घटनाओं का उपयोग करके विंडो-आधारित अनुप्रयोगों के साथ संचार करता है। प्रत्येक प्रोग्राम में एक थ्रेड होता है जो लगातार आने वाली घटनाओं को सुनता है और उन्हें प्रोसेस करता है। उदाहरण के लिए जब आप एक बटन या अधिसूचना क्षेत्र आइकन पर क्लिक करते हैं, तो विंडोज एक घटना उत्पन्न करता है और इसे उचित प्रक्रिया में फीड करता है। प्रक्रिया तब तय कर सकती है कि इसे कैसे संभालना है।
प्रोग्राम के साथ सभी इंटरैक्शन विंडोज में ईवेंट-आधारित हैं, इसलिए जब प्रोग्राम आने वाली घटनाओं को बहुत लंबे समय तक संसाधित नहीं करता है, तो इसका मतलब है कि यह प्रतिक्रिया नहीं करता है। जैसा कि @DavidPostill ने अपने उत्तर में पाया और नोट किया है , टाइमआउट 5 सेकंड है। PeekMessageवह कार्य है जिसे ईवेंट कतार से कोई ईवेंट मिलता है।
आपके प्रश्न का उत्तर हां / नहीं है।
हालांकि विंडोज ओएस विंडोज मैसेजिंग क्यू में घटनाओं के साथ आवेदन कर सकता है और कर सकता है, WinAPI से लिंक करने या विंडोज क्यू को हैंडल / जवाब देने के लिए प्रोग्राम बिल्कुल शून्य दायित्व के तहत हैं। यहां तक कि कतार में एक संदेश का जवाब देने से विंडोज को यह नहीं बताया जाता है कि कार्यक्रम "लॉक अप" है या नहीं। यह एक संकेतक है, लेकिन यह सब है। असली जवाब थोड़ा और अधिक जटिल है।
असली जवाब
लोग यहां वास्तविक उत्तर के आसपास बचाव कर रहे हैं। यह निर्धारित करना कि क्या कोई कार्यक्रम "जवाब नहीं दे रहा है" " पड़ाव समस्या " का एक प्रकार है , जो कंप्यूटर विज्ञान में औपचारिक रूप से अनिर्दिष्ट है। संक्षिप्त विवरण यह है कि प्रोसेसर एक थर्ड पार्टी के रूप में कार्य कर सकता है जो यह निर्धारित करने के लिए कि क्या सबरूटिन अनंत लूप में फंस गया है, कुछ भी नहीं कर रहा है, एक काउंटर को बढ़ाता है जो कुछ निश्चित, सामान्य संख्या में समाप्त हो जाएगा। इन दोनों को कसकर बंद छोरों के रूप में माना जा सकता है। एक पड़ाव, दूसरा कभी समाप्त नहीं होगा। यहां तक कि आप एक व्यक्ति के रूप में, यह नहीं जानते कि कोई कार्यक्रम वास्तव में प्रतिक्रिया दे रहा है या नहीं, खासकर यदि यह एक कसकर बंद लूप में है - आप केवल यह जानते हैं कि क्या यह सोचना चाहिए (प्रतिक्रिया)।
विंडोज के दृष्टिकोण से, ये दोनों लूप "जवाब नहीं दे रहे हैं " हैं । इसलिए विंडोज़ आपको प्रतीक्षा करने या समाप्त करने का विकल्प देता है, क्योंकि यह नहीं बता सकता।
तो परिणाम "क्यों खिड़कियों को पता है कि एक प्रक्रिया है है जवाब?" उत्तर बल्कि चालाक है। जब एक प्रक्रिया को बहु-थ्रेडेड और बहु-प्रक्रिया ओएस में संकलित किया जाता है, तो कभी-कभी कसकर बंद छोरों में भी, संकलक एक उपज () कमांड में जोड़ सकता है , जो प्रोसेसर को एक सुविधाजनक सूचना प्रदान करता है कि यह अन्य चल रही प्रक्रियाओं पर स्विच कर सकता है । यह प्रोसेसर को "छोड़ देता है" और "संदर्भ स्विच" (जैसा कि इसे कहा जाता है) होता है जो ओएस (विंडोज शामिल) को स्टैक में अन्य घटनाओं का जवाब देने की अनुमति देता है, जिनमें से कुछ में ट्रैकिंग शामिल है जो प्रक्रिया ने जवाब दिया है।
** इसका मतलब यह नहीं है कि एक प्रतिक्रिया प्रक्रिया समाप्त हो जाएगी । ** एक अनंत लूप के अंदर एक प्रक्रिया प्रोसेसर का उत्पादन कर सकती है, जिससे विंडोज अन्य घटनाओं को संसाधित कर सकता है।
कुछ विंडोज़ कार्यक्रमों में, प्रोग्राम विंडोज़ ओएस सिग्नल को हैंडल करेगा, जो ओएस को बता सकता है कि यह "जवाब दे रहा है", लेकिन ऐसा करने के लिए कोई भी कार्यक्रम किसी भी दायित्व के तहत नहीं है। आप विंडोज पर उच्च स्तर की भाषाओं जैसे कि पर्ल, php, पायथन और विंडोज के भीतर भी काफी सरल सीपीयू हॉगिंग, नॉन-टर्मिनेटिंग प्रोग्राम लिख सकते हैं और हो सकता है कि विंडोज यह पता नहीं लगा सके कि यह समाप्त नहीं हो रहा है और जवाब नहीं दे रहा है। उस बिंदु पर, विंडोज उत्तराधिकार पर निर्भर करता है - सीपीयू लोड, मेमोरी, प्रोग्राम को "अनुमान" करने के लिए चल रहा था, तो प्रोसेसर ने कितने व्यवधानों को संभाला। फिर, उस बिंदु पर, विंडोज को आपको समाप्त करने के लिए कहना होगा, क्योंकि यह वास्तव में नहीं जानता कि क्या होना चाहिए।
विक्टर का (सही) उत्तर भी देखें। टिप्पणियों के बारे में उपेक्षा करें कि क्या "जवाब नहीं" अनंत लूप के समान नहीं है। सभी प्रकार के संदेश, व्यवधान, लूप हैं जो कि एक अनुप्रयोग विंडोज संदेश कतार को सूचित किए बिना संभाल सकता है या नहीं कर सकता है। संदेश कतार को संभालना कई प्रकार की घटनाओं में से एक है जो ओएस काउंटररों को यह अनुमान लगाने की कोशिश करता रहता है कि क्या कोई प्रक्रिया लटका दी गई है।