स्लो सिस्टम कॉल और फास्ट सिस्टम कॉल के बीच अंतर


13

स्लो सिस्टम कॉल और फास्ट सिस्टम कॉल में क्या अंतर है? मैंने सीखा है कि यदि सिस्टम कुछ सिग्नलों को पकड़ता है तो स्लो सिस्टम कॉल ब्लॉक कर सकता है, क्योंकि पकड़े गए सिग्नल ब्लॉक किए गए सिस्टम कॉल को जगा सकते हैं, लेकिन मैं इस तंत्र को ठीक से समझ नहीं सकता। किसी भी उदाहरण की सराहना की जाएगी।

जवाबों:


20

सिस्टम कॉल में वास्तव में तीन ग्रेडेशन हैं।

  1. कुछ सिस्टम कॉल तुरंत लौटाते हैं। "तुरंत" का मतलब है कि केवल एक चीज जो उन्हें चाहिए वह है थोड़ा प्रोसेसर समय। वे कब तक ( वास्तविक समय प्रणालियों को छोड़कर) ले सकते हैं, इसके लिए कोई कठिन सीमा नहीं है , लेकिन ये कॉल लंबे समय तक निर्धारित किए जाते ही वापस लौट जाते हैं।
    इन कॉल्स को आमतौर पर नॉन-ब्लॉकिंग कहा जाता है । गैर अवरुद्ध कॉल के उदाहरण कॉल, जैसे कि सिर्फ सिस्टम स्थिति का एक सा पढ़ा, या सिस्टम स्थिति में एक सामान्य परिवर्तन कर रहे हैं getpid, gettimeofday, getuidया setuid। कुछ सिस्टम कॉल परिस्थितियों के आधार पर अवरुद्ध या गैर-अवरुद्ध हो सकते हैं; उदाहरण के लिए, readब्लॉक कभी नहीं होता है यदि फ़ाइल एक पाइप या अन्य प्रकार है जो गैर-अवरुद्ध रीडिंग का समर्थन करता है और O_NONBLOCKध्वज सेट है।
  2. कुछ सिस्टम कॉल को पूरा होने में थोड़ा समय लग सकता है, लेकिन हमेशा के लिए नहीं। एक विशिष्ट उदाहरण है sleep
  3. कुछ सिस्टम कॉल तब तक वापस नहीं आएंगे जब तक कि कुछ बाहरी घटना न हो जाए। इन कॉल्स को ब्लॉक करने के लिए कहा जाता है । उदाहरण के लिए, readएक अवरुद्ध फ़ाइल डिस्क्रिप्टर पर कॉल करना अवरुद्ध है, और ऐसा ही है wait

"तेज" और "धीमी" प्रणाली कॉल के बीच का अंतर गैर-अवरुद्ध बनाम अवरुद्ध करने के करीब है, लेकिन इस बार कर्नेल कार्यान्वयनकर्ता के दृष्टिकोण से। एक तेज syscall वह है जिसे अवरुद्ध या प्रतीक्षा किए बिना पूरा किया जा सकता है। जब कर्नेल एक तेज syscall का सामना करता है, तो यह जानता है कि यह तुरंत syscall निष्पादित कर सकता है और उसी प्रक्रिया को निर्धारित रख सकता है। ( गैर- प्रीमेप्टिव मल्टीटास्किंग के साथ कुछ ऑपरेटिंग सिस्टमों में , तेज़ syscalls गैर-प्रीमेप्टिव हो सकता है; यह सामान्य यूनिक्स सिस्टम में ऐसा नहीं है।) दूसरी ओर, एक धीमी syscall संभावित रूप से किसी अन्य कार्य को पूरा करने के लिए प्रतीक्षा करने की आवश्यकता होती है, इसलिए कर्नेल। कॉलिंग प्रक्रिया को रोकने और एक अन्य कार्य चलाने के लिए तैयार होना चाहिए।

कुछ मामले थोड़े भूरे रंग के होते हैं। उदाहरण के लिए एक डिस्क रीड ( readएक नियमित फ़ाइल से) को आमतौर पर गैर-अवरुद्ध माना जाता है, क्योंकि यह किसी अन्य प्रक्रिया की प्रतीक्षा नहीं कर रहा है; यह केवल डिस्क की प्रतीक्षा कर रहा है, जो आम तौर पर जवाब देने में केवल थोड़ा समय लेता है, लेकिन हमेशा के लिए नहीं लेगा (इसलिए यह मामला 2 से ऊपर है)। लेकिन कर्नेल के दृष्टिकोण से, प्रक्रिया को डिस्क चालक के पूरा होने तक इंतजार करना पड़ता है, इसलिए यह निश्चित रूप से एक धीमी गति से syscall है।


एक महान धन्यवाद! लेकिन अगर फ़ाइल एक पाइप है, तो क्या फ़ाइल गैर-अवरोधक पढ़ रही है? यह देखें कि www2.hawaii.edu/~esb/2007spring.ics612/apr10.html
KayKay

यह "धीमी गति से पढ़ता / लिखता है (उदाहरण के लिए एक पाइप या एक टर्मिनल पर)"
केके

@KayKay: एक पाइप के लिए, आपके पास O_NONBLOCKध्वज की स्थिति के आधार पर दोनों हो सकते हैं । यदि ध्वज सेट किया गया है, तो syscall किसी भी चीज़ पर प्रतीक्षा किए बिना पूरा कर सकता है, इसलिए यह गैर-अवरुद्ध है, और कर्नेल इसे तेज़ syscall के रूप में मान सकता है।
गिल्स एसओ- बुराई को रोकें '

आपका मतलब है कि यह O_NONBLOCK ध्वज पर निर्भर करता है!
कयाक

3

एक धीमी प्रणाली कॉल एक टीसीपी सॉकेट रीड () की तरह कुछ है - यदि आपके पास O_ASYNC (या जो भी) सेट नहीं है, वह हमेशा के लिए प्रतीक्षा कर सकता है।

एक फास्ट सिस्टम कॉल कुछ समय के लिए मिलता है जैसे गेटटाइमऑफ () या गेटपिड (), दोनों उस प्रक्रिया की जानकारी देते हैं जो कर्नेल तुरंत उपलब्ध होती है।

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

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

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