2011-02-09 20 views
6

यदि मुझे घड़ी_getटाइम (CLOCK_MONOTONIC, x) का उपयोग करने का समय मिलता है, तो उपज (उदाहरण के लिए sched_yield()) पर कॉल करें, फिर CLOCK_MONOTONIC समय फिर से प्राप्त करें, समय में अंतर उस समय शामिल होगा जब प्रोग्राम नहीं चल रहा था (उत्पन्न हुआ) , या CLOCK_MONOTONIC केवल उस समय को ट्रैक करता है जिसके दौरान प्रोग्राम निष्पादित हो रहा है? मेरे परीक्षण बाद वाले को इंगित करते हैं, लेकिन मैं निश्चित रूप से जानना चाहता हूं।क्या CLOCK_MONOTONIC प्रक्रिया (या धागा) विशिष्ट है?

इसके अलावा, अगर CLOCK_MONOTONIC में समय शामिल नहीं होता है, तो क्या कोई और monotonic टाइमर (यानी एक एनटीपी के कारण कूदने के अधीन नहीं है) है?

उत्तर

8

उत्तर मैक्सिम और आपके प्रश्न के दूसरे भाग का उत्तर देने के लिए टिप्पणियां, मेरा मानना ​​है। पहले भाग के लिए जवाब पर विस्तार करने के लिए, POSIX 2008 राज्यों

If the Monotonic Clock option is supported, all implementations shall support a clock_id of CLOCK_MONOTONIC defined in <time.h>. This clock represents the monotonic clock for the system. For this clock, the value returned by clock_gettime() represents the amount of time (in seconds and nanoseconds) since an unspecified point in the past (for example, system start-up time, or the Epoch). This point does not change after system start-up time.

विशेष रूप से, ध्यान दें "प्रणाली के लिए monotonic घड़ी"। यही है, प्रति-प्रणाली और प्रति प्रक्रिया नहीं, यह आपकी प्रक्रिया नहीं चल रही है, भले ही यह टिक टिकती रहती है। साथ ही, "यह बिंदु सिस्टम स्टार्ट-अप समय के बाद नहीं बदलता है।", जो कि फिर से तात्पर्य है कि यह किसी भी प्रक्रिया को चल रहा है या सो रहा है या नहीं, इस पर ध्यान दिए बिना टिक टिकता रहता है।

तो, या तो आपको अपने परीक्षण कार्यक्रम में लिनक्स कार्यान्वयन, या अधिक संभावना में एक बग मिला है।

4

CLOCK_REALTIME और CLOCK_MONOTONIC के बीच एकमात्र अंतर यह है कि उत्तरार्द्ध सेट नहीं किया जा सकता है। ये घड़ियों तब भी टिक रही हैं जब आपकी प्रक्रिया नहीं चल रही है।

http://www.opengroup.org/onlinepubs/009604599/functions/clock_getres.html

ध्यान दें कि monotonic घड़ी का निरपेक्ष मान अर्थहीन है (क्योंकि इसके मूल मनमाना है), और इस प्रकार यह निर्धारित करने के लिए कोई जरूरत नहीं है। इसके अलावा, रीयलटाइम एप्लिकेशन इस तथ्य पर भरोसा कर सकते हैं कि इस घड़ी का मान कभी सेट नहीं होता है और इसलिए, इस घड़ी के साथ मापा गया समय अंतराल घड़ी_सेटटाइम() पर कॉल से प्रभावित नहीं होगा।

लिनक्स में, आश्चर्यजनक रूप से, CLOCK_MONOTONIC अभी भी एनटीपी समायोजन से प्रभावित प्रतीत होता है, ताकि यह पीछे की ओर जा सके। इसलिए वे एक और घड़ी CLOCK_MONOTONIC_RAW कहा:

आदमी clock_gettime

CLOCK_MONOTONIC_RAW (लिनक्स 2.6.28 के बाद से, लिनक्स विशेष) CLOCK_MONOTONIC की तरह, लेकिन एक कच्चे हार्डवेयर आधारित समय है कि के अधीन नहीं है तक पहुँच प्रदान करता एनटीपी समायोजन।

+3

मेरा मानना ​​है कि उन एनटीपी समायोजनों का उल्लेख किया गया है जो घड़ी की प्रगति के * दर * को संदर्भित करते हैं, कूदने के लिए नहीं ('CLOCK_MONOTONIC' पीछे नहीं छोड़ेगा)। ध्यान दें कि मशीन को निलंबित करते समय 'CLOCK_MONOTONIC' बंद हो जाता है, अगर यह मायने रखता है। – caf

+3

नहीं, CLOCK_MONOTONIC लिनक्स पर पीछे नहीं जाता है। एनटीपी केवल एक चरण परिवर्तन से समय समायोजित करता है अगर यह 1/2 सेकंड से अधिक हो जाता है, तो monotonic घड़ी इससे प्रभावित नहीं होती है। छोटे समायोजन के लिए, एनटीपी घड़ी की टिक दर को थोड़ा बदलकर समय के साथ घड़ी को समायोजित करता है, और CLOCK_MONOTONIC इससे प्रभावित होता है। लेकिन, टिक दर कभी नकारात्मक नहीं होगी। – janneb

+0

यह मेरे प्रश्न का काफी जवाब नहीं देता- मुझे पता है कि मशीन निलंबित होने पर यह बंद हो जाती है, लेकिन _process_ को निलंबित होने पर यह रुक जाता है? – Benubird

संबंधित मुद्दे