चूंकि स्मॉलटाक शेड्यूलिंग गैर-प्रीमेप्टिव है, इसलिए प्रक्रियाओं को स्पष्ट रूप से उत्पन्न होना चाहिए या सेमाफोर पर प्रतीक्षा करनी चाहिए

क्या इसका मतलब यह है कि अनंत लूप में प्रवेश करने वाली एक वस्तु पूरे सिस्टम को रोक सकती है?

लूप को किसी भी समय बाधित किया जा सकता है। यहां तक ​​​​कि एक परमाणु लूप जैसे [सत्य] जबकि ट्रू को वास्तविक वस्तु को "निष्पादित" करने से पहले बाधित किया जा सकता है

इसे किससे बाधित किया जा सकता है?

3
2080 11 पद 2020, 23:23

2 जवाब

सबसे बढ़िया उत्तर

यह वर्चुअल मशीन है जो छवि को बाधित कर सकती है। एक सामान्य निष्पादन प्रवाह के तहत, वीएम मूल रूप से एक के बाद एक संदेश भेज रहा है। हालाँकि, कुछ घटनाएँ आवश्यकता पड़ने पर इसे बाधित करके निष्पादन के प्राकृतिक प्रवाह को प्रभावित कर सकती हैं। जबकि ठोस उदाहरण एक बोली से दूसरी बोली में बदल सकते हैं, ये आमतौर पर ओएस घटनाओं के अनुरूप होते हैं जिन्हें उनके विचार के लिए छवि को संप्रेषित करने की आवश्यकता होती है।

यदि VM की मेमोरी खत्म हो रही है तो रुकावट भी आ सकती है। इस मामले में यह कचरा संग्रह करने के लिए अनुरोध करने वाली छवि को बाधित करेगा।

लूप दिलचस्प हैं क्योंकि उनके पास नियमित संदेशों का शब्दार्थ है, इसलिए क्या होता है कि लूप के अंदर कोड के ब्लॉक का मूल्यांकन किया जाता है (#value & दोस्त) हर बार लूप दोहराता है। तो, आपको लूप को नियमित संदेशों के रूप में सोचना चाहिए। हालाँकि, इस शब्दार्थ को आमतौर पर अनुकूलित किया जाता है इसलिए पुनर्मूल्यांकन का स्पष्ट रूप से एक स्मॉलटाक संदेश द्वारा अनुरोध नहीं किया जाता है। उस स्थिति में VM ब्लॉक को निष्पादित करने से पहले रुकावटों की जाँच करेगा। इस प्रकार, यदि आप दौड़ते हैं

[true] whileTrue

ऑब्जेक्ट true को वर्तमान रिसीवर के रूप में नामित करने से पहले (इस मामले में, कोई संदेश नहीं) वीएम जांच करेगा कि क्या ध्यान देने में कोई बाधा है (उसी तरह यह किसी दिए गए को निष्पादित करने से पहले बाधाओं की जांच करता है) तरीका)।

अधिकांश बोलियां कुछ "ब्रेक" कीस्ट्रोक को लागू करती हैं जो "रोक" उत्पन्न करती हैं और प्रोग्रामर के लिए मैन्युअल नियंत्रण पुनर्प्राप्त करने के लिए डीबगर खोलती हैं।

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

आखिरी उदाहरण जो दिमाग में आता है वह है StackOverflow अपवाद (कोई इरादा नहीं), जहां वीएम को पता चलता है कि यह स्टैक स्पेस से बाहर हो रहा है और अपवाद को संकेत देकर छवि को बाधित करता है।

आप #messageNotUnderstood: को VM द्वारा उत्पन्न रुकावट के रूप में भी सोच सकते हैं जब उसे पता चलता है कि किसी वस्तु को एक संदेश प्राप्त हुआ है जिसके लिए कोई कार्यान्वयन नहीं है। इस मामले में, प्राकृतिक प्रवाह बदल जाएगा जिससे वस्तु को वास्तविक संदेश के साथ तर्क के रूप में संदेश #messageNotUnderstood: प्राप्त होगा।

एक और चीज़। लूप सिस्टम को रोक सकता है या नहीं, यह उस प्रक्रिया की प्राथमिकता पर निर्भर करता है जो वह चल रही है। यदि लूप कम प्राथमिकता के साथ चल रहा है तो एक रुकावट जो उच्च प्राथमिकता की प्रक्रिया को जगाती है, को प्राथमिकता दी जाएगी और लूप को सोने के लिए भेजे जाने पर चलाया जाएगा। उसी तर्क से, यदि आपका अंतहीन लूप किसी प्रक्रिया में उच्च प्राथमिकता पर चलता है तो कोई रुकावट इसे रोक नहीं पाएगी।

5
Leandro Caniglia 12 पद 2020, 00:15

हाँ, बस दौड़ना बहुत आसान है

[ true ] whileTrue: [  ]

और तुम कुछ और नहीं कर पाओगे।

जब आप Mac पर comand + . दबाते हैं तो Pharo में "ripcord" होता है। विंडोज या लिनक्स के लिए यह या तो ऑल्ट या कंट्रोल है। इस क्रिया को उस चीज़ को रोकना चाहिए जिसे आप चला रहे हैं और आपको हस्तक्षेप करने की अनुमति देनी चाहिए।

4
Uko 11 पद 2020, 23:32