UNIX चलाने के लिए आपके कंप्यूटर पर UNIX का समय मापा जाता है।
यह उत्तर आपको यह जानने की उम्मीद करने जा रहा है कि कोऑर्डिनेटेड यूनिवर्सल टाइम (यूटीसी), इंटरनेशनल एटॉमिक टाइम (टीएआई), और एसआई दूसरे क्या हैं। उन्हें समझाते हुए यूनिक्स और लिनक्स स्टैक एक्सचेंज के दायरे से परे है। यह फिजिक्स या एस्ट्रोनॉमी स्टैक एक्सचेंज नहीं है।
हार्डवेयर
आपके कंप्यूटर में विभिन्न ऑसिलेटर होते हैं जो घड़ियों और टाइमर को चलाते हैं। वास्तव में इसकी वास्तुकला के आधार पर कंप्यूटर से कंप्यूटर में क्या भिन्नता है। लेकिन आमतौर पर, और बहुत सामान्य शब्दों में:
- कहीं न कहीं एक प्रोग्रामेबल इंटरवल टाइमर (PIT) है, जिसे दिए गए दोलनों की संख्या की गणना करने और केंद्रीय प्रसंस्करण इकाई में एक बाधा को ट्रिगर करने के लिए प्रोग्राम किया जा सकता है।
- केंद्रीय प्रोसेसर पर एक चक्र काउंटर है जिसे बस प्रत्येक अनुदेश चक्र के लिए 1 गिना जाता है जिसे निष्पादित किया जाता है।
ऑपरेशन का सिद्धांत, बहुत व्यापक शब्दों में
ऑपरेटिंग सिस्टम कर्नेल पीआईटी का उपयोग टिक बनाने के लिए करता है । यह पीआईटी को फ्री-रन करने के लिए सेट करता है, एक बार के अंतराल के लिए दोलनों की सही संख्या की गिनती करता है, कहता है, एक सेकंड का एक सौवां भाग, एक बाधा उत्पन्न करता है, और फिर स्वचालित रूप से फिर से जाने के लिए गिनती रीसेट कर रहा है। इस पर भिन्नताएं हैं, लेकिन संक्षेप में यह एक निश्चित आवृत्ति के साथ एक टिक अवरोध पैदा करता है।
सॉफ्टवेयर में, कर्नेल हर टिक का एक काउंटर बढ़ाता है। यह टिक आवृत्ति को जानता है, क्योंकि इसने पीआईटी को पहले स्थान पर क्रमादेशित किया था। तो यह जानता है कि एक सेकंड में कितने टिक होते हैं। इसका उपयोग यह जानने के लिए कर सकते हैं कि सेकंड गिनने वाले काउंटर को कब बढ़ाया जाए। यह उत्तरार्द्ध "यूनिक्स टाइम" का कर्नेल विचार है। यह, वास्तव में, प्रति एसआई सेकंड की दर से ऊपर की ओर गिनती करता है अगर अपने उपकरणों के लिए छोड़ दिया जाता है।
चार चीजें इसे जटिल बनाती हैं, जिन्हें मैं बहुत सामान्य शब्दों में प्रस्तुत करने जा रहा हूं।
हार्डवेयर सही नहीं है। एक पीआईटी जिसकी डेटा शीट कहती है कि इसमें एन हर्ट्ज़ की एक थरथरानवाला आवृत्ति है, इसके बजाय स्पष्ट परिणाम के साथ (कहना) एन .00002 हर्ट्ज़ की आवृत्ति हो सकती है ।
यह योजना पावर प्रबंधन के साथ बहुत खराब तरीके से हस्तक्षेप करती है, क्योंकि सीपीयू प्रति सेकंड सैकड़ों बार जाग्रत करने की तुलना में एक संख्या में वृद्धि से थोड़ा अधिक करता है। तो कुछ ऑपरेटिंग सिस्टम में "टिकलेस" डिज़ाइन के रूप में जाने जाते हैं। पीआईटी बनाने के बजाय हर टिक के लिए एक बाधा भेजते हैं, कर्नेल बाहर काम करता है (निम्न स्तर के अनुसूचक से) कितने टिक्स जाने वाले हैं, जिसमें कोई थ्रेड क्वांटा बाहर नहीं निकलता है, और पीआईटी को कई टिकों की गणना करने के लिए प्रोग्राम करता है। टिक अवरोध जारी करने से पहले भविष्य। यह जानता है कि इसके बाद 1 टिक के बजाय अगले टिक इंटरप्ट पर एन टिक के पारित होने को रिकॉर्ड करना होगा ।
एप्लिकेशन सॉफ़्टवेयर में कर्नेल के वर्तमान समय को बदलने की क्षमता है। यह वैल्यू को स्टेप कर सकता है या वैल्यू को स्लीव कर सकता है । स्लीविंग में टिकों की संख्या को समायोजित करना शामिल है जिन्हें सेकंड काउंटर को बढ़ाने के लिए जाना पड़ता है। तो सेकंड काउंटर जरूरी SI प्रति एक की दर से गणना नहीं करता है , यहां तक कि सही दोलक भी। स्टेपिंग में सेकंड काउंटर में बस एक नया नंबर लिखना शामिल है, जो कि आमतौर पर 1 एसआई सेकंड तक नहीं होता है क्योंकि अंतिम दूसरा टिक जाता है।
आधुनिक कर्नेल न केवल सेकंड की गिनती करते हैं, बल्कि नैनोसेकंड भी गिनते हैं। लेकिन यह एक बार-प्रति-नैनोसेकंड टिक बाधा के लिए हास्यास्पद और अक्सर एकमुश्त है। यह वह जगह है जहां चक्र काउंटर जैसी चीजें खेल में आती हैं। कर्नेल प्रत्येक सेकंड में चक्र काउंटर मान (या प्रत्येक टिक पर) को याद करता है और काउंटर के वर्तमान मूल्य से काम कर सकता है, जब कुछ नैनोसेकंड में समय जानना चाहता है, तो अंतिम सेकंड (या) से कितने नैनोसेकंड बीत चुके होंगे टिकटिक)। फिर से, हालांकि, शक्ति और थर्मल प्रबंधन इसके साथ कहर करता है क्योंकि निर्देश चक्र की आवृत्ति बदल सकती है, इसलिए गुठली अतिरिक्त हार्डवेयर जैसे (जैसे) एक उच्च परिशुद्धता घटना टाइमर (एचपीईटी) पर भरोसा करते हैं।
सी भाषा और POSIX
सी भाषा के मानक पुस्तकालय एक अपारदर्शी प्रकार, के मामले में समय का वर्णन करता है time_t
, एक संरचना प्रकार tm
विभिन्न निर्दिष्ट क्षेत्रों के साथ, और जैसे विभिन्न पुस्तकालय कार्यों time()
, mktime()
, और localtime()
।
सी भाषा: संक्षेप में ही केवल गारंटी देता है कि time_t
उपलब्ध में से एक है संख्यात्मक डेटा प्रकार और calculate समय मतभेद के केवल विश्वसनीय तरीका है कि difftime()
कार्य करते हैं। यह POSIX मानक है जो कड़ी गारंटी प्रदान करता time_t
है जो वास्तव में पूर्णांक प्रकारों में से एक है और यह एपच के बाद से सेकंड गिना जाता है । यह POSIX मानक भी है जो timespec
संरचना प्रकार को निर्दिष्ट करता है।
time()
समारोह कभी कभी एक सिस्टम कॉल के रूप में वर्णित किया गया है। वास्तव में, यह आजकल काफी समय से कई प्रणालियों पर अंतर्निहित सिस्टम कॉल नहीं है। FreeBSD पर, उदाहरण के लिए, अंतर्निहित सिस्टम कॉल है clock_gettime()
, जिसमें विभिन्न "क्लॉक" उपलब्ध हैं जो सेकंड या सेकंड + नैनोसेकंड में विभिन्न तरीकों से मापते हैं। यह वह सिस्टम कॉल है जिसके द्वारा एप्लिकेशन सॉफ्टवेयर कर्नेल से UNIX टाइम पढ़ता है। (एक मिलान clock_settime()
प्रणाली कॉल उन्हें इसे स्थानांतरित करने की अनुमति देती है और एक adjtime()
सिस्टम कॉल उन्हें इसे सुलाने की अनुमति देता है।)
बहुत से लोग POSIX मानक को बहुत निश्चित और सटीक दावों के साथ इधर-उधर कर देते हैं। ऐसे लोगों के पास, अधिक बार नहीं, वास्तव में पोसिक्स मानक नहीं पढ़ा जाता है। जैसा कि इसका औचित्य निर्धारित होता है, "सेकंड के बाद से सेकंड" की गिनती का विचार, जो कि मानक उपयोग करता है वाक्यांश है, जानबूझकर यह निर्दिष्ट नहीं करता है कि पॉसिक्स सेकंड एसआई सेकंड के समान लंबाई है, और न ही इसका परिणाम है gmtime()
कि "आवश्यक" UTC, इसकी उपस्थिति के बावजूद "। POSIX मानक जानबूझकर हैइतना पर्याप्त है कि यह एक UNIX प्रणाली के लिए अनुमति देता है (जहां) प्रशासक जाता है और मैन्युअल रूप से उनके होने के एक सप्ताह बाद घड़ी को फिर से सेट करके लीप सेकंड समायोजन को ठीक करता है। वास्तव में, तर्क यह बताता है कि सिस्टम को समायोजित करने के लिए यह जानबूझकर काफी ढीला है जहां घड़ी को वर्तमान यूटीसी समय के अलावा कुछ समय के लिए जानबूझकर गलत तरीके से सेट किया गया है ।
UTC और TAI
कर्नेल से प्राप्त UNIX समय की व्याख्या अनुप्रयोगों में चल रहे पुस्तकालय दिनचर्या तक है। POSIX कर्नेल के समय और एक "टूटे हुए समय" के बीच एक पहचान निर्दिष्ट करता है struct tm
। लेकिन, जैसा कि डैनियल जे। बर्नस्टीन ने एक बार बताया था, मानक के 1997 संस्करण ने इस पहचान को शर्मनाक तरीके से गलत कर दिया, जिससे ग्रेगोरियन कैलेंडर के लीप ईयर नियम (कुछ ऐसा जो स्कूली बच्चे सीखते हैं) को गड़बड़ कर दिया, ताकि वर्ष 2100 से गणना में गलती हो। "पालन की तुलना में उल्लंघन में अधिक सम्मान" एक वाक्यांश है जो आसानी से मन में आता है।
और वास्तव में यह है। कई सिस्टम आजकल आर्थर डेविड ओल्सन द्वारा लिखित लाइब्रेरी रूटीन पर इस व्याख्या को आधार बनाते हैं, जो कुख्यात "ओल्सन टाइमज़ोन डेटाबेस" से परामर्श करते हैं, आमतौर पर डेटाबेस फ़ाइलों के तहत इनकोड किया गया है /usr/share/zoneinfo/
। ओल्सन प्रणाली के दो तरीके थे:
- कर्नेल की "सेकंड के बाद की अवधि" को 1970-01-01 00:00:00 UTC के बाद से UTC सेकंड की गिनती करने के लिए माना जाता है, केवल कुछ सेकंड के लिए। यह
posix/
ओल्सन टाइमज़ोन डेटाबेस फ़ाइलों के सेट का उपयोग करता है । सभी दिनों में 86400 कर्नेल सेकंड होते हैं और एक मिनट में कभी भी 61 सेकंड नहीं होते हैं, लेकिन वे हमेशा एक एसआई सेकंड की लंबाई नहीं होते हैं और लीप सेकंड होने पर कर्नेल घड़ी को स्लीपिंग या स्टेपिंग की आवश्यकता होती है।
- 1970-01-01 00:00:10 TAI के बाद से कर्नेल की "सेकंड्स द एपोकॉच" को TAI सेकंड में गिना जाता है। यह
right/
ओल्सन टाइमज़ोन डेटाबेस फ़ाइलों के सेट का उपयोग करता है । कर्नेल सेकंड 1 सेकंड लंबे होते हैं और कर्नेल घड़ी को लीप सेकंड के लिए समायोजित करने के लिए कभी भी स्लीव या स्टेपिंग की आवश्यकता नहीं होती है, लेकिन टूटे हुए समय में 23:59:60 जैसे मान हो सकते हैं और दिन हमेशा 86400 कर्नेल सेकंड लंबे नहीं होते हैं।
एम। बर्नस्टीन ने अपने daemontools
टूलसेट सहित कई उपकरण लिखे, जिनकी आवश्यकता थी right/
क्योंकि उन्होंने time_t
1970-01-01 00:00:00 टीएआई के बाद से टीएआई सेकंड प्राप्त करने के लिए केवल 10 जोड़ा । उन्होंने इसे मैनुअल पेज में दर्ज किया।
इस आवश्यकता को (शायद अनजाने) जैसे उपकरण सेट द्वारा विरासत में मिला था daemontools-encore
और runit
और फ़ेलिक्स वॉन लेटनर के द्वारा libowfat
। उपयोग बर्नस्टीनmultilog
, Guentermultilog
, या पेपsvlogd
एक ओल्सन के साथ posix/
विन्यास, उदाहरण के लिए, और TAI64N timestamps के सभी के पीछे 26 सेकंड (इस लेखन के समय) हो जाएगा वास्तविक ताई दूसरा 1970-01-01 00:00:10 के बाद से गिनती ताई।
लॉरेंट बर्कोट और मैंने इसे एस 6 और नोश में संबोधित किया, यद्यपि हमने अलग-अलग दृष्टिकोण अपनाए। एम। बरकोट का tai_from_sysclock()
समय-संकलन ध्वज पर निर्भर करता है। nosh टूल जो TAI64N में काम करते हैं TZ
और TZDIR
पर्यावरण वैरिएबल को ऑटो-डिटेक्ट posix/
और right/
यदि वे कर सकते हैं, को देखते हैं।
दिलचस्प है, FreeBSD दस्तावेज़ time2posix()
और posix2time()
फ़ंक्शन जो TAI सेकंड के right/
साथ ओल्सन मोड के बराबर की अनुमति देते हैं time_t
। वे स्पष्ट रूप से सक्षम नहीं हैं, हालांकि।
एक बार फिर…
UNIX का समय आपके कंप्यूटर के हार्डवेयर में निहित ऑसिलेटर्स द्वारा आपके कंप्यूटर को UNIX चलाने पर मापा जाता है। यह SI सेकंड का उपयोग नहीं करता है; यह यूटीसी नहीं है, भले ही यह सतही रूप से समान हो; और यह जानबूझकर आपकी घड़ी को गलत होने की अनुमति देता है।
आगे की पढाई