जब कोई प्रक्रिया उपयोगकर्ता मोड पर होती है, तो इसे किसी भी समय बाधित किया जा सकता है (कर्नेल मोड पर स्विच करना)। जब कर्नेल उपयोगकर्ता मोड में लौटता है, तो यह जांचता है कि क्या कोई सिग्नल लंबित हैं (इनमें से जो प्रक्रिया को मारने के लिए उपयोग किए जाते हैं, जैसे कि SIGTERM
और SIGKILL
)। इसका अर्थ है कि उपयोगकर्ता मोड पर लौटने पर ही किसी प्रक्रिया को मारा जा सकता है।
कर्नेल मोड में किसी प्रक्रिया को नहीं मारा जा सकता है, यह एक ही मशीन में अन्य सभी प्रक्रियाओं द्वारा उपयोग किए जाने वाले कर्नेल संरचनाओं को संभावित रूप से दूषित कर सकता है (उसी तरह एक धागा को मारने से संभवतः उसी प्रक्रिया में अन्य थ्रेड्स द्वारा उपयोग किए गए भ्रष्ट डेटा संरचनाएं हो सकती हैं) ।
जब कर्नेल को कुछ ऐसा करने की आवश्यकता होती है, जिसमें एक लंबा समय लग सकता है (किसी अन्य प्रक्रिया द्वारा लिखी गई पाइप पर प्रतीक्षा करना या हार्डवेयर के लिए कुछ करने की प्रतीक्षा करना, उदाहरण के लिए), यह खुद को सोने के रूप में चिह्नित करके और दूसरे को स्विच करने के लिए अनुसूचक को कॉल करके सोता है। प्रक्रिया (यदि कोई गैर-नींद की प्रक्रिया नहीं है, तो यह एक "डमी" प्रक्रिया में बदल जाता है जो सीपीयू को थोड़ा धीमा करने के लिए कहता है और एक लूप में बैठता है - निष्क्रिय लूप)।
यदि किसी सिग्नल को नींद की प्रक्रिया में भेजा जाता है, तो इसे उपयोगकर्ता के स्थान पर लौटने से पहले जागना होगा और इस प्रकार लंबित सिग्नल को संसाधित करना होगा। यहाँ हम दो मुख्य प्रकारों के बीच अंतर रखते हैं:
TASK_INTERRUPTIBLE
, बीच में नींद। यदि इस झंडे के साथ कोई कार्य चिह्नित है, तो यह सो रहा है, लेकिन संकेतों द्वारा जगाया जा सकता है। इसका मतलब यह है कि कोड जो कार्य को सोने के रूप में चिह्नित करता है, एक संभावित संकेत की उम्मीद कर रहा है, और इसके जागने के बाद इसके लिए जांच करेगा और सिस्टम कॉल से वापस आ जाएगा। सिग्नल हैंडल होने के बाद, सिस्टम कॉल संभावित रूप से स्वचालित रूप से पुनरारंभ हो सकता है (और मैं इस बात पर विवरण में नहीं जाऊंगा कि यह कैसे काम करता है)।
TASK_UNINTERRUPTIBLE
निर्बाध नींद। यदि किसी कार्य को इस ध्वज के साथ चिह्नित किया जाता है, तो यह अपेक्षा नहीं करता है कि जो कुछ भी इसके लिए इंतजार कर रहा है, उसके अलावा किसी और चीज से जागृत किया जाए, क्योंकि इसे आसानी से फिर से शुरू नहीं किया जा सकता है, या क्योंकि प्रोग्राम सिस्टम कॉल को परमाणु होने की उम्मीद कर रहे हैं। यह बहुत कम ज्ञात नींद के लिए भी इस्तेमाल किया जा सकता है।
TASK_KILLABLE
(डीडीए के जवाब से जुड़े LWN लेख में उल्लिखित) एक नया संस्करण है।
यह आपके पहले प्रश्न का उत्तर देता है। आपके दूसरे प्रश्न के रूप में: आप अबाधित नींद से बच नहीं सकते हैं, वे एक सामान्य बात है (यह होता है, उदाहरण के लिए, जब भी कोई प्रक्रिया डिस्क से / से लिखती / पढ़ती है); हालाँकि, उन्हें केवल एक सेकंड के कुछ अंश तक चलना चाहिए। यदि वे बहुत लंबे समय तक चलते हैं, तो इसका मतलब आमतौर पर एक हार्डवेयर समस्या (या डिवाइस ड्राइवर समस्या, जो कर्नेल के समान दिखता है) होती है, जहां डिवाइस ड्राइवर हार्डवेयर के लिए कुछ करने की प्रतीक्षा कर रहा है जो कभी नहीं होगा। इसका मतलब यह भी हो सकता है कि आप NFS का उपयोग कर रहे हैं और NFS सर्वर डाउन हो रहा है (यह सर्वर के ठीक होने की प्रतीक्षा कर रहा है; आप समस्या से बचने के लिए "intr" विकल्प का भी उपयोग कर सकते हैं)।
अंत में, जिस कारण से आप पुनर्प्राप्त नहीं कर सकते हैं, वही कारण है कि कर्नेल प्रतीक्षा करता है जब तक कि उपयोगकर्ता मोड में सिग्नल देने या प्रक्रिया को मारने के लिए वापस नहीं आता है: यह संभवतः कर्नेल के डेटा संरचनाओं को भ्रष्ट करेगा (कोड एक व्यवधानपूर्ण नींद पर प्रतीक्षा कर रहा है जो एक त्रुटि प्राप्त कर सकता है जो इसे बताता है। उपयोगकर्ता स्थान पर लौटने के लिए, जहां प्रक्रिया को मार दिया जा सकता है, एक निर्बाध नींद पर इंतजार कर कोड किसी भी त्रुटि की उम्मीद नहीं है)।
TASK_UNINTERUPTIBLE
राज्य में चला जाता है जब भी सिस्टम निष्क्रिय स्थिति में नहीं होता है, जिससे जबरन डेटा एकत्र किया जाता है, एक बार सुपर उपयोगकर्ता के बाहर निकलने के लिए संचार करने की प्रतीक्षा करता है? यह हैकर्स के लिए सूचना प्राप्त करने, ज़ोंबी राज्य में लौटने और निष्क्रिय नेटवर्क पर सूचना प्रसारित करने के लिए एक सोने की खान होगी। कुछ लोग यह तर्क दे सकते हैं कि यहBlackdoor
किसी भी प्रणाली में वांछित शक्तियों के लिए प्रवेश करने और बाहर निकलने के लिए बनाने का एक तरीका है । मेरा दृढ़ता से मानना है कि इस खामी को 'TASK_UNINTERUPTIB