unix समय(1) के उत्पादन में 'वास्तविक', 'उपयोगकर्ता' और 'sys' का क्या अर्थ है?




time benchmarking (4)

$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

समय के उत्पादन में 'वास्तविक', 'उपयोगकर्ता' और 'sys' का क्या अर्थ है?

मेरे ऐप का बेंचमार्किंग करते समय कौन सा सार्थक है?


वास्तविक, उपयोगकर्ता और Sys प्रक्रिया समय आंकड़े

इनमें कुछ चीजें एक जैसी नहीं हैं। असली वास्तविक समय बीतता है; उपयोगकर्ता और Sys केवल प्रक्रिया द्वारा उपयोग किए गए CPU समय का संदर्भ लें

  • असली दीवार घड़ी का समय है - कॉल से शुरू होने के समय से। यह सभी समय बीत चुका है जिसमें अन्य प्रक्रियाओं द्वारा उपयोग किए जाने वाले समय स्लाइस और प्रक्रिया को अवरुद्ध करने का समय शामिल है (उदाहरण के लिए यदि यह I / O को पूरा करने का इंतजार कर रहा है)।

  • उपयोगकर्ता प्रक्रिया के भीतर उपयोगकर्ता-मोड कोड (कर्नेल के बाहर) में खर्च किए गए CPU समय की मात्रा है। यह केवल वास्तविक CPU समय प्रक्रिया को निष्पादित करने में उपयोग किया जाता है। प्रक्रियाओं को अवरुद्ध करने वाली अन्य प्रक्रियाओं और समय इस आंकड़े की ओर गिनती नहीं करते हैं।

  • Sys प्रक्रिया के भीतर कर्नेल में बिताए गए CPU समय की मात्रा है। इसका मतलब है कि कर्नेल के भीतर सिस्टम कॉल में खर्च किए गए CPU समय को निष्पादित करना , लाइब्रेरी कोड के विपरीत, जो अभी भी उपयोगकर्ता-स्थान में चल रहा है। 'उपयोगकर्ता' की तरह, यह केवल CPU समय प्रक्रिया द्वारा उपयोग किया जाता है। कर्नेल मोड (जिसे 'पर्यवेक्षक' मोड भी कहा जाता है) और सिस्टम कॉल तंत्र के संक्षिप्त विवरण के लिए नीचे देखें।

User+Sys आपको बताएगा कि आपकी प्रक्रिया का कितना वास्तविक CPU समय उपयोग किया जाता है। ध्यान दें कि यह सभी CPUs में है, इसलिए यदि प्रक्रिया में एकाधिक धागे हैं (और यह प्रक्रिया एक से अधिक प्रोसेसर वाले कंप्यूटर पर चल रही है) तो यह संभावित रूप से Real (जो आमतौर पर होता है) द्वारा रिपोर्ट की गई घड़ी घड़ी के समय से अधिक हो सकती है। ध्यान दें कि आउटपुट में इन आंकड़ों में सभी बाल प्रक्रियाओं (और उनके वंशज) के User और Sys समय शामिल होते हैं, साथ ही जब वे एकत्र किए जा सकते थे, उदाहरण के लिए wait(2) या wait(2) waitpid(2) , हालांकि अंतर्निहित सिस्टम कॉल वापस लौटाता है प्रक्रिया और उसके बच्चों के लिए अलग-अलग आंकड़े।

time (1) अनुसार रिपोर्ट आंकड़ों की उत्पत्ति time (1)

time - time रिपोर्ट किए गए आंकड़े विभिन्न सिस्टम कॉल से एकत्र किए जाते हैं। 'उपयोगकर्ता' और 'Sys' विशेष प्रणाली के आधार पर wait (2) या times (2) से आते हैं। 'रियल' की गणना gettimeofday (2) कॉल से एकत्रित शुरुआत और समाप्ति समय से की जाती है। सिस्टम के संस्करण के आधार पर, संदर्भ स्विच की संख्या जैसे कई अन्य आंकड़े time भी एकत्र किए जा सकते हैं।

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

कर्नेल बनाम उपयोगकर्ता मोड पर एक संक्षिप्त प्राइमर

यूनिक्स, या किसी भी संरक्षित-मेमोरी ऑपरेटिंग सिस्टम पर, 'कर्नेल' या 'पर्यवेक्षक' मोड एक विशेषाधिकृत मोड को संदर्भित करता है जिसमें सीपीयू काम कर सकता है। कुछ विशेषाधिकार प्राप्त क्रियाएं जो सुरक्षा या स्थिरता को प्रभावित कर सकती हैं केवल तभी किया जा सकता है जब CPU चालू हो यह मोड; ये क्रियाएं आवेदन कोड के लिए उपलब्ध नहीं हैं। ऐसी प्रक्रिया का एक उदाहरण MMU का एक और प्रक्रिया के पता स्थान तक पहुंच प्राप्त करने के लिए हेरफेर हो सकता है। आम तौर पर, user-mode कोड ऐसा नहीं कर सकता (अच्छे कारण से), हालांकि यह कर्नेल से साझा मेमोरी का अनुरोध कर सकता है, जिसे एक से अधिक प्रक्रियाओं द्वारा पढ़ा या लिखा जा सकता है। इस मामले में, साझा स्मृति को सुरक्षित तंत्र के माध्यम से कर्नेल से स्पष्ट रूप से अनुरोध किया जाता है और दोनों प्रक्रियाओं को इसका उपयोग करने के लिए स्पष्ट रूप से संलग्न करना होता है।

विशेषाधिकार प्राप्त मोड को आमतौर पर 'कर्नेल' मोड के रूप में जाना जाता है क्योंकि कर्नेल को इस मोड में चल रहे CPU द्वारा निष्पादित किया जाता है। कर्नेल मोड में स्विच करने के लिए आपको एक विशिष्ट निर्देश (अक्सर एक trap कहा जाता है) जारी करना होता है जो सीपीयू को कर्नेल मोड में चलाने के लिए स्विच करता है और जंप टेबल में रखे गए किसी विशिष्ट स्थान से कोड चलाता है। सुरक्षा कारणों से, आप कर्नेल मोड पर स्विच नहीं कर सकते हैं और मनमानी कोड निष्पादित कर सकते हैं - जाल को पते की एक तालिका के माध्यम से प्रबंधित किया जाता है जिसे तब तक लिखा नहीं जा सकता जब तक कि CPU पर्यवेक्षक मोड में नहीं चल रहा हो। आप एक स्पष्ट जाल संख्या से फंस जाते हैं और जंप टेबल में पता लगाया जाता है; कर्नेल में नियंत्रित प्रवेश बिंदुओं की एक सीमित संख्या है।

सी लाइब्रेरी में 'सिस्टम' कॉल (विशेष रूप से मैन पेजों की सेक्शन 2 में वर्णित) में उपयोगकर्ता-मोड घटक होता है, जो आप वास्तव में अपने सी प्रोग्राम से कॉल करते हैं। दृश्यों के पीछे, वे कर्नेल को I / O जैसी विशिष्ट सेवाओं को करने के लिए एक या अधिक सिस्टम कॉल जारी कर सकते हैं, लेकिन उनके पास अभी भी उपयोगकर्ता-मोड में कोड चल रहा है। वांछित होने पर किसी भी उपयोगकर्ता स्पेस कोड से कर्नेल मोड को सीधे जाल जारी करना भी संभव है, हालांकि कॉल के लिए रजिस्टरों को सही तरीके से सेट अप करने के लिए आपको असेंबली भाषा का एक स्निपेट लिखना पड़ सकता है। लिनक्स कर्नेल द्वारा प्रदान की गई सिस्टम कॉल का वर्णन करने वाला एक पृष्ठ और रजिस्टरों की स्थापना के लिए सम्मेलनों को here. पाया जा सकता here.

'Sys' के बारे में अधिक

ऐसी चीजें हैं जो आपका कोड उपयोगकर्ता मोड से नहीं कर सकती हैं - स्मृति आवंटित करने या हार्डवेयर तक पहुंचने जैसी चीजें (एचडीडी, नेटवर्क इत्यादि)। ये कर्नेल की देखरेख में हैं, और यह अकेले ही उन्हें कर सकता है। कुछ ऑपरेशन जो आप करते हैं (जैसे malloc या fread / fwrite ) इन कर्नेल फ़ंक्शन का आह्वान करेंगे और फिर 'sys' समय के रूप में गिना जाएगा। दुर्भाग्यवश यह उतना आसान नहीं है जितना "मॉलोक के लिए हर कॉल को 'sys' समय में गिना जाएगा"। malloc लिए कॉल स्वयं की कुछ प्रसंस्करण करेगा (अभी भी 'उपयोगकर्ता' समय में गिना जाता है) और उसके बाद कहीं भी कर्नेल में फ़ंक्शन को कॉल कर सकता है ('sys' समय में गिना जाता है)। कर्नेल कॉल से लौटने के बाद, 'उपयोगकर्ता' में कुछ और समय होगा और फिर malloc आपके कोड पर वापस आ जाएगा। जब स्विच होता है, और कर्नेल मोड में कितना खर्च किया जाता है ... आप नहीं कह सकते हैं। यह पुस्तकालय के कार्यान्वयन पर निर्भर करता है। इसके अलावा, अन्य प्रतीत होता है कि निर्दोष कार्य भी malloc और पृष्ठभूमि की तरह उपयोग कर सकते हैं, जो फिर से 'sys' में कुछ समय लगेगा।


वास्तविक प्रक्रिया एक प्रक्रिया के लिए कुल बारी-बारी से समय दिखाता है; जबकि उपयोगकर्ता उपयोगकर्ता द्वारा परिभाषित निर्देशों के लिए निष्पादन समय दिखाता है और Sys सिस्टम कॉल निष्पादित करने के लिए समय के लिए है!

वास्तविक समय में प्रतीक्षा समय भी शामिल है (I / O आदि के लिए प्रतीक्षा समय)


स्वीकार्य उत्तर पर विस्तार करने के लिए, मैं सिर्फ एक और कारण प्रदान करना चाहता था क्यों realuser + sys

ध्यान रखें कि real वास्तविक समय का प्रतिनिधित्व करता है, जबकि user और sys मान CPU निष्पादन समय का प्रतिनिधित्व करते हैं। नतीजतन, एक मल्टीकोर प्रणाली पर, user और / या sys समय (साथ ही साथ उनके योग) वास्तव में वास्तविक समय से अधिक हो सकता है। उदाहरण के लिए, जावा ऐप पर मैं कक्षा के लिए दौड़ रहा हूं मुझे मूल्यों का यह सेट मिलता है:

real    1m47.363s
user    2m41.318s
sys     0m4.013s

वास्तविक : प्रक्रिया को शुरू करने से शुरू करने में वास्तविक समय, जैसे कि इसे एक स्टॉपवॉच के साथ मानव द्वारा मापा गया था

उपयोगकर्ता : गणना के दौरान सभी CPUs द्वारा संचयी संचयी समय

sys : स्मृति आवंटन जैसे सिस्टम से संबंधित कार्यों के दौरान सभी CPUs द्वारा संचयी संचयी समय।

ध्यान दें कि कभी-कभी उपयोगकर्ता + sys वास्तविक से अधिक हो सकते हैं, क्योंकि एकाधिक प्रोसेसर समानांतर में काम कर सकते हैं।





benchmarking