Erlang 21 - 3. Time and Time Correction in Erlang

एर्लांग में 3 समय और समय सुधार




erlang

एर्लांग में 3 समय और समय सुधार

3.1 नई विस्तारित समय कार्यक्षमता

ध्यान दें

एर्लैंग / ओटीपी 18 (ईआरटीएस 7.0) से समय की कार्यक्षमता बढ़ाई गई है। इसमें समय और time warp modes लिए एक new API शामिल है जो सिस्टम के समय में बदलाव होने पर सिस्टम व्यवहार को बदलता है।

default time warp mode में पहले जैसा ही व्यवहार होता है, और पुराना एपीआई अभी भी काम करता है। इस प्रकार, आपको कुछ भी बदलने की आवश्यकता नहीं है जब तक आप नहीं चाहते हैं। हालाँकि, आपको erlang:now/0 आधार पर पुराने API के बजाय नए API का उपयोग करने के लिए दृढ़ता से प्रोत्साहित किया जाता है erlang:now/0 erlang:now/0 को पदावनत किया जाता है, क्योंकि यह एक स्केलेबिलिटी अड़चन है।

नए एपीआई का उपयोग करके, आपको स्वचालित रूप से मापनीयता और प्रदर्शन में सुधार होता है। यह आपको multi-time warp mode का उपयोग करने में सक्षम बनाता multi-time warp mode जो सटीकता और समय माप की सटीकता में सुधार करता है।

३.२ शब्दावली

इस अनुभाग को समझना आसान बनाने के लिए, कुछ शब्दों को परिभाषित किया गया है। यह हमारी अपनी शब्दावली (एर्लांग / ओएस प्रणाली समय, एर्लांग / ओएस मोनोटोनिक समय, समय ताना) और विश्व स्तर पर स्वीकृत शब्दावली का मिश्रण है।

नीरस रूप से बढ़ रहा है

मूल्यों के एक नीरस रूप से बढ़ते क्रम में, पूर्ववर्ती होने वाले सभी मूल्य या तो अपने पूर्ववर्ती की तुलना में बड़े हैं या बराबर हैं।

सख्ती से नीरसता बढ़ रही है

मूल्यों के एक सख्त रूप से बढ़ते क्रम में, पूर्ववर्ती होने वाले सभी मूल्य इसके पूर्ववर्ती की तुलना में बड़े हैं।

UT1

यूनिवर्सल टाइम। UT1 पृथ्वी के घूर्णन पर आधारित है और वैचारिक रूप से इसका मतलब 0 ° देशांतर पर सौर समय है।

यु.टी. सी

समन्वित वैशविक समय। UTC लगभग UT1 साथ संरेखित UT1 । हालाँकि, UTC एक सेकंड की SI परिभाषा का उपयोग करता है, जिसकी उतनी लंबाई नहीं है जितनी कि UT1 द्वारा उपयोग की जाने वाली दूसरी है। इसका मतलब है कि यूटीसी धीरे-धीरे यूटी 1 से बह जाता है। यूटीसी 1 के साथ यूटीसी को अपेक्षाकृत रखने के लिए, छलांग सेकंड में डाली जाती है, और संभावित रूप से हटा दी जाती है। यानी, एक UTC दिन 86400, 86401 या 86399 सेकंड लंबा हो सकता है।

POSIX समय

समय के बाद से। युग को 00:00:00 UTC , 1970-01-01 से परिभाषित किया गया है। A day in POSIX time ठीक 86400 सेकंड लंबा परिभाषित किया गया है। अजीब तरह से पर्याप्त, युग को यूटीसी में एक समय के रूप में परिभाषित किया गया है, और यूटीसी की एक और परिभाषा है कि दिन कितना लंबा है। ओपन ग्रुप का हवाला देते हुए "POSIX time is therefore not necessarily UTC, despite its appearance" । इसका प्रभाव यह है कि जब एक यूटीसी लीप सेकंड डाला जाता है, तो पोसिक्स समय या तो एक सेकंड के लिए रुक जाता है, या अंतिम सेकंड को दोहराता है। यदि कोई UTC लीप सेकंड हटा दिया जाएगा (जो अभी तक नहीं हुआ है), POSIX समय एक सेकंड की लीप को आगे बढ़ाएगा।

समय संकल्प

सबसे कम समय अंतराल जिसे समय मान पढ़ने पर अलग किया जा सकता है।

समय की शुद्धता

सबसे कम समय का अंतराल जो समय मूल्यों को पढ़ते समय बार-बार और मज़बूती से पहचाना जा सकता है। परिशुद्धता resolution द्वारा सीमित है, लेकिन संकल्प और परिशुद्धता में काफी अंतर हो सकता है।

समय की सटीकता

समय मूल्यों की शुद्धता।

टाइम वार्प

एक समय ताना समय में पीछे या पीछे छलांग है। यही है, समय से पहले और बाद में लिए गए समय के मूल्यों का अंतर वास्तविक बीता समय के अनुरूप नहीं है।

OS सिस्टम का समय

ऑपरेटिंग सिस्टम POSIX time । इसे पुनर्प्राप्त करने के लिए, os:system_time() कॉल करें। यह POSIX समय का सटीक दृश्य हो सकता है या नहीं भी हो सकता है। यह समय आमतौर पर बिना किसी सीमा के पीछे और आगे दोनों तरफ समायोजित किया जा सकता है। यही है, time warps देखा जा सकता है।

erlang:system_info(os_system_time_source) रनटाइम सिस्टम के OS सिस्टम समय के स्रोत के बारे में जानकारी प्राप्त करने के लिए, erlang:system_info(os_system_time_source) कॉल करें।

ओएस मोनोटोनिक समय

ओएस द्वारा प्रदान किया गया एक नीरस समय। इस बार छलांग नहीं लगती है और अपेक्षाकृत स्थिर आवृत्ति होती है, हालांकि पूरी तरह से सही नहीं है। हालाँकि, यह असामान्य नहीं है कि ओएस मोनोटोनिक समय बंद हो जाता है अगर सिस्टम निलंबित है। यह समय आमतौर पर उस समय के कुछ अनिर्दिष्ट बिंदु से बढ़ता है जो OS system time जुड़ा नहीं है। इस प्रकार का समय सभी ओएस द्वारा आवश्यक रूप से प्रदान नहीं किया गया है।

erlang:system_info(os_monotonic_time_source) रनटाइम सिस्टम के ओएस मोनोटोनिक समय के स्रोत के बारे में जानकारी प्राप्त करने के लिए, erlang:system_info(os_monotonic_time_source) कॉल करें।

एरलांग सिस्टम का समय

POSIX time Erlang रनटाइम सिस्टम दृश्य। इसे पुनर्प्राप्त करने के लिए, erlang:system_time() कॉल करें।

यह समय POSIX समय का सटीक दृश्य हो सकता है या नहीं भी हो सकता है, और OS system time साथ संरेखित हो भी सकता है और नहीं भी। रनटाइम सिस्टम दो सिस्टम बार को संरेखित करने की दिशा में काम करता है। उपयोग किए जाने वाले time warp mode आधार पर, यह एरलैंग प्रणाली के समय को time warp देने से प्राप्त किया जा सकता है।

एरलंग मोनोटोनिक समय

एर्लांग रनटाइम सिस्टम द्वारा प्रदान किया गया एक नीरस रूप से बढ़ता समय। एर्लांग मोनोटोनिक समय कुछ अनिर्दिष्ट बिंदु से बढ़ जाता है। इसे पुनर्प्राप्त करने के लिए, erlang:monotonic_time() कॉल करें erlang:monotonic_time()

एरलांग मोनोटोनिक समय की accuracy और accuracy निम्नलिखित पर बहुत निर्भर करती है:

ओएस मोनोटोनिक समय के बिना एक सिस्टम पर, एरलांग मोनोटोनिक समय एकरसता की गारंटी देता है, लेकिन अन्य गारंटी नहीं दे सकता है। Erlang मोनोटोनिक समय में किए गए आवृत्ति समायोजन का उपयोग किए गए समय ताना मोड पर निर्भर करता है।

आंतरिक रूप से रनटाइम सिस्टम में, एर्लांग मोनोटोनिक समय "टाइम इंजन" है जो कम या ज्यादा हर चीज के लिए उपयोग किया जाता है जिसका समय के साथ कुछ भी करना है। सभी टाइमर, इसकी परवाह किए बिना एक receive ... after टाइमर के receive ... after , बीआईएफ टाइमर, या टाइमर में timer(3) मॉड्यूल, सापेक्ष एरलंग मोनोटोनिक समय को ट्रिगर करते हैं। यहां तक ​​कि Erlang system time एरलंग मोनोटोनिक समय पर आधारित है। वर्तमान समय की ऑफसेट के साथ वर्तमान Erlang मोनोटोनिक समय को जोड़कर, आपको वर्तमान Erlang सिस्टम समय मिलता है।

वर्तमान समय ऑफसेट को पुनः प्राप्त करने के लिए, erlang:time_offset/0 कॉल करें erlang:time_offset/0

३.३ परिचय

एक एर्लांग कार्यक्रम के लिए समय महत्वपूर्ण है और, अधिक महत्वपूर्ण बात, एर्लैंग कार्यक्रम के लिए सही समय महत्वपूर्ण है। जैसा कि एरलंग नरम वास्तविक समय गुणों के साथ एक भाषा है और हम अपने कार्यक्रमों में समय व्यक्त कर सकते हैं, वर्चुअल मशीन और भाषा को इस बात से सावधान रहना चाहिए कि क्या एक सही समय माना जाता है और कितने समय में कार्य करता है।

जब एर्लैंग को डिज़ाइन किया गया था, तो यह माना गया था कि सिस्टम में दीवार घड़ी का समय समय की परिभाषा के समान गति से आगे बढ़ते हुए एक मोनोटोनिक समय दिखाया गया था। कमोबेश इसका मतलब है कि एक परमाणु घड़ी (या बेहतर समय स्रोत) आपके हार्डवेयर से जुड़ी होने की उम्मीद थी और हार्डवेयर को तब किसी भी मानव छेड़छाड़ से हमेशा के लिए दूर रहने की उम्मीद थी। हालांकि यह एक सम्मोहक विचार हो सकता है, बस कभी ऐसा नहीं होता।

एक "सामान्य" आधुनिक कंप्यूटर समय नहीं रख सकता है, न कि खुद पर और जब तक आपके पास चिप-स्तर की परमाणु घड़ी नहीं होती है। समय, जैसा कि आपके कंप्यूटर द्वारा माना जाता है, सामान्य रूप से सही होना चाहिए। इसलिए नेटवर्क टाइम प्रोटोकॉल (NTP) प्रोटोकॉल, ntpd प्रक्रिया के साथ मिलकर, आपके कंप्यूटर समय को सही समय के साथ ntpd रखने की पूरी कोशिश करता है। एनटीपी सुधारों के बीच, आमतौर पर एक परमाणु घड़ी की तुलना में कम शक्तिशाली समय-रक्षक का उपयोग किया जाता है।

हालाँकि, NTP सुरक्षित नहीं है। NTP सर्वर अनुपलब्ध हो सकता है, ntp.conf को गलत तरीके से कॉन्फ़िगर किया जा सकता है, या आपका कंप्यूटर कभी-कभी इंटरनेट से डिस्कनेक्ट हो सकता है। इसके अलावा, आपके पास एक उपयोगकर्ता (या यहां तक ​​कि सिस्टम व्यवस्थापक) हो सकता है जो डेलाइट सेविंग टाइम को संभालने का सही तरीका सोचता है, वर्ष में दो बार घड़ी को एक घंटे में समायोजित करना है (जो इसे करने का गलत तरीका है)। चीजों को और अधिक जटिल बनाने के लिए, इस उपयोगकर्ता ने आपके सॉफ़्टवेयर को इंटरनेट से प्राप्त किया है और यह विचार नहीं किया है कि कंप्यूटर द्वारा सही समय क्या माना जाता है। उपयोगकर्ता सही समय के साथ दीवार घड़ी को सिंक में रखने की परवाह नहीं करता है। उपयोगकर्ता को उम्मीद है कि आपके कार्यक्रम में समय के बारे में असीमित ज्ञान होगा।

अधिकांश प्रोग्रामर भी विश्वसनीय होने के लिए समय की उम्मीद करते हैं, कम से कम जब तक उन्हें एहसास नहीं होता है कि उनके कार्य केंद्र पर दीवार घड़ी का समय एक मिनट का है। फिर उन्होंने इसे सही समय पर सेट किया, लेकिन सबसे अधिक संभवत: सहज तरीके से नहीं।

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

3.4 समय सुधार

यदि समय सुधार सक्षम किया जाता है, तो एर्लांग मोनोटोनिक घड़ी की आवृत्ति को समायोजित करने के लिए, एरलांग रनटाइम सिस्टम OS system time और OS monotonic time दोनों का उपयोग करता है। समय सुधार यह सुनिश्चित करता है कि Erlang monotonic time ताना नहीं देता है और यह आवृत्ति अपेक्षाकृत सटीक है। आवृत्ति समायोजन का प्रकार उपयोग किए गए समय ताना मोड पर निर्भर करता है। सेक्शन Time Warp Modes अधिक विवरण प्रदान करता है।

यदि विशिष्ट प्लेटफ़ॉर्म पर इसके लिए समर्थन मौजूद है, तो डिफ़ॉल्ट समय में सुधार सक्षम है। इसके लिए समर्थन में ओएस द्वारा प्रदान किए गए दोनों ओएस मोनोटोनिक समय शामिल हैं, और ओएस मोनोनेटोनिक समय का उपयोग करके एरलंग रनटाइम सिस्टम में एक कार्यान्वयन। यह जांचने के लिए कि क्या आपके सिस्टम में OS मोनोटोनिक समय के लिए समर्थन है, erlang:system_info(os_monotonic_time_source) कॉल करें erlang:system_info(os_monotonic_time_source) । यह देखने के लिए कि क्या आपके सिस्टम पर समय सुधार सक्षम है, erlang:system_info(time_correction) कॉल करें erlang:system_info(time_correction)

समय सुधार को सक्षम या अक्षम करने के लिए, कमांड लाइन तर्क +c [true|false] को erl(1)

यदि समय सुधार को अक्षम कर दिया जाता है, तो एरलांग मोनोटोनिक समय को आगे या रोक सकता है, या यहां तक ​​कि विस्तारित अवधि के लिए फ्रीज भी कर सकता है। फिर कोई गारंटी नहीं है कि एरलंग मोनोटोनिक घड़ी की आवृत्ति सटीक या स्थिर है।

आप आमतौर पर समय सुधार को अक्षम नहीं करना चाहते हैं । पहले एक प्रदर्शन जुर्माना समय सुधार के साथ जुड़ा हुआ था, लेकिन आजकल यह आमतौर पर चारों ओर का दूसरा तरीका है। यदि समय सुधार अक्षम किया गया है, तो आपको संभवतः खराब मापनीयता, खराब प्रदर्शन और खराब समय मापन मिलेंगे।

3.5 समय ताना सुरक्षित कोड

समय ताना सुरक्षित कोड Erlang system time का एक time warp संभाल सकता है।

erlang:now/0 तब बुरा व्यवहार करता है जब Erlang सिस्टम टाइम वॉर करता है। जब एरलैंग सिस्टम का समय पीछे की ओर जाता है, तो मान erlang:now/0 से वापस आ जाता है erlang:now/0 फ्रीज (यदि आप वास्तविक कॉल के कारण किए गए माइक्रोसेकेंड वेतन वृद्धि की उपेक्षा करते हैं) जब तक कि ओएस सिस्टम का समय erlang:now/0 द्वारा लौटाए गए अंतिम मान के बिंदु तक नहीं पहुंचता erlang:now/0 । यह फ्रीज लंबे समय तक जारी रह सकता है। फ्रीज बंद होने तक वर्षों, दशकों और यहां तक ​​कि इससे भी अधिक समय लग सकता है।

erlang:now/0 सभी उपयोग erlang:now/0 जरूरी नहीं कि समय से पहले असुरक्षित हो। यदि आप समय पाने के लिए इसका उपयोग नहीं करते हैं, तो यह समय ताना सुरक्षित है। हालाँकि, erlang:now/0 सभी उपयोग erlang:now/0 एक प्रदर्शन और मापनीयता के दृष्टिकोण से उप-रूपी हैं । तो आप वास्तव में इसके उपयोग को अन्य कार्यक्षमता के साथ बदलना चाहते हैं। erlang:now/0 के उपयोग को कैसे बदलें, इसके उदाहरण के लिए erlang:now/0 , How to Work with the New API अनुभाग देखें।

3.6 समय ताना मोड

वर्तमान Erlang system time वर्तमान erlang:time_offset/0 साथ वर्तमान erlang:monotonic_time() को जोड़कर निर्धारित किया जाता है। समय ऑफसेट का प्रबंधन अलग-अलग तरीके से किया जाता है, जिसके आधार पर आप समय-समय पर उपयोग किए जाने वाले ताना मोड का उपयोग करते हैं।

समय ताना मोड सेट करने के लिए, कमांड-लाइन तर्क +C [no_time_warp|single_time_warp|multi_time_warp] to erl(1)

कोई समय ताना मोड

समय ऑफसेट रनटाइम सिस्टम प्रारंभ पर निर्धारित किया जाता है और बाद में परिवर्तित नहीं होता है। यह डिफ़ॉल्ट व्यवहार है, लेकिन इसलिए नहीं कि यह सबसे अच्छा तरीका है (जो यह नहीं है)। यह केवल डिफ़ॉल्ट है क्योंकि यह है कि रनटाइम सिस्टम ईआरटीएस 7.0 तक व्यवहार करता है। सुनिश्चित करें कि आपका Erlang कोड जो किसी समय ताना के दौरान निष्पादित हो सकता है, अन्य मोड को सक्षम करने से पहले time warp safe है।

जैसा कि समय की ऑफसेट को बदलने की अनुमति नहीं है, समय सुधार को एरलैंग सिस्टम समय को सुचारू रूप से संरेखित करने के लिए एरलंग मोनोटोनिक घड़ी की आवृत्ति को समायोजित करना चाहिए। इस दृष्टिकोण का एक महत्वपूर्ण पहलू यह है कि अगर हम समायोजन की जरूरत है तो हम इस उद्देश्य पर एर्लांग मोनोटोनिक घड़ी पर दोषपूर्ण आवृत्ति का उपयोग करेंगे। यह त्रुटि 1% जितनी बड़ी हो सकती है। यह त्रुटि रनटाइम सिस्टम में सभी समय मापों में दिखाई देगी।

यदि समय सुधार सक्षम नहीं है, तो ओएस सिस्टम का समय पीछे की ओर होने पर एरलंग मोनोटोनिक समय जम जाता है। जब तक OS सिस्टम समय पकड़ता है तब तक मोनोटोनिक समय का फ्रीज जारी रहता है। फ्रीज लंबे समय तक जारी रह सकता है। जब ओएस सिस्टम का समय आगे की ओर बढ़ता है, तो एरलांग का मोनोटोनिक समय भी आगे बढ़ता है।

एकल समय ताना मोड

यह मोड कम या ज्यादा पिछड़ी संगतता मोड है जैसा कि इसके परिचय से है।

एक एम्बेडेड सिस्टम पर यह असामान्य नहीं है कि सिस्टम की कोई बिजली की आपूर्ति नहीं है, बैटरी भी नहीं है, जब यह बंद है। ऐसी प्रणाली पर सिस्टम क्लॉक आमतौर पर सिस्टम बूट होने पर रास्ता बंद कर देता है। यदि no time warp mode का उपयोग नहीं किया जाता है, और एरलैंग रनटाइम सिस्टम को शुरू किया जाता है इससे पहले कि ओएस सिस्टम का समय सही किया गया है, तो एर्लांग सिस्टम का समय लंबे समय, सदियों या उससे भी लंबे समय तक गलत हो सकता है।

यदि आपको Erlang कोड का उपयोग करने की आवश्यकता है जो time warp safe , और आपको OS सिस्टम समय ठीक होने से पहले Erlang रनटाइम सिस्टम शुरू करने की आवश्यकता है, तो आप सिंगल टाइम ताना मोड का उपयोग करना चाह सकते हैं।

ध्यान दें

जब आप इस मोड का उपयोग करके समय ताना असुरक्षित कोड निष्पादित कर सकते हैं तो सीमाएं हैं। यदि केवल समय ताना सुरक्षित कोड का उपयोग करना संभव है, तो इसके बजाय multi-time warp mode का उपयोग करना बेहतर है।

एकल समय ताना मोड का उपयोग करते हुए, समय ऑफसेट को दो चरणों में नियंत्रित किया जाता है:

प्रारंभिक चरण

यह चरण तब शुरू होता है जब रनटाइम सिस्टम शुरू होता है। वर्तमान OS सिस्टम समय के आधार पर प्रारंभिक समय ऑफसेट निर्धारित किया जाता है। यह ऑफसेट अभी से पूरे प्रारंभिक चरण के दौरान तय किया जाना है।

यदि समय सुधार सक्षम किया जाता है, तो इसकी आवृत्ति को यथासंभव सही रखने के लिए एरलंग मोनोटोनिक घड़ी में समायोजन किया जाता है। हालाँकि, कोई समायोजन Erlang सिस्टम समय और OS सिस्टम समय संरेखित करने की कोशिश कर रहे हैं। यही है, प्रारंभिक चरण के दौरान Erlang प्रणाली का समय और OS सिस्टम का समय एक दूसरे से अलग हो सकता है, और इसे रोकने के लिए कोई प्रयास नहीं किया जाता है।

यदि समय सुधार को अक्षम किया जाता है, तो ओएस सिस्टम समय में परिवर्तन उसी तरह से मोनोटोनिक घड़ी को प्रभावित करता है जब no time warp mode का उपयोग किया जाता है।

अंतिम चरण

यह चरण तब शुरू होता है जब उपयोगकर्ता erlang:system_flag(time_offset, finalize) को कॉल करके समय ऑफसेट को erlang:system_flag(time_offset, finalize) । अंतिम रूप केवल एक बार किया जा सकता है।

अंतिमकरण के दौरान, समय ऑफसेट समायोजित और तय किया जाता है ताकि वर्तमान एरलैंग सिस्टम का समय वर्तमान ओएस सिस्टम समय के साथ संरेखित हो। जैसा कि अंतिम समय के दौरान ऑफसेट में बदलाव हो सकता है, एर्लांग प्रणाली का समय इस बिंदु पर एक समय ताना जा सकता है। रनटाइम सिस्टम के समाप्त होने तक का समय ऑफसेट अभी से तय है। यदि समय सुधार सक्षम किया गया है, तो अब से समय का सुधार OS सिस्टम समय के साथ Erlang सिस्टम समय संरेखित करने के लिए समायोजन भी करता है। जब सिस्टम अंतिम चरण में होता है, तो यह ठीक उसी तरह व्यवहार करता है जैसे no time warp mode

इसे ठीक से काम करने के लिए, उपयोगकर्ता को यह सुनिश्चित करना चाहिए कि निम्नलिखित दो आवश्यकताएं पूरी हो गई हैं:

फॉरवर्ड टाइम ताना

टाइम ऑफसेट को अंतिम रूप देते समय किए गए टाइम ताना केवल समस्याओं का सामना किए बिना फॉरवर्ड किया जा सकता है। तात्पर्य यह है कि उपयोगकर्ता को यह सुनिश्चित करना चाहिए कि एरलैंग रनटाइम सिस्टम शुरू करने से पहले ओएस सिस्टम का समय वास्तविक POSIX समय से पहले या उसके बराबर सेट हो।

यदि आप सुनिश्चित नहीं हैं कि OS सिस्टम का समय सही है, तो इसे उस समय पर सेट करें, जो Erlang रनटाइम सिस्टम को शुरू करने से पहले वास्तविक POSIX समय से पहले की गारंटी है, बस सुरक्षित रहने के लिए।

ओएस सिस्टम समय को ठीक करें

उपयोगकर्ता द्वारा समय ऑफसेट को अंतिम रूप देने पर OS सिस्टम का समय सही होना चाहिए।

यदि ये आवश्यकताएं पूरी नहीं होती हैं, तो सिस्टम बहुत बुरा व्यवहार कर सकता है।

मान लें कि ये आवश्यकताएँ पूरी हो गई हैं, समय सुधार सक्षम है, और OS सिस्टम समय को NTP जैसे समय समायोजन प्रोटोकॉल का उपयोग करके समायोजित किया जाता है, सिस्टम के समय को अंतिम रूप देने के बाद Erlang monotonic समय के छोटे समायोजन की आवश्यकता होती है। जब तक सिस्टम को निलंबित नहीं किया जाता है, तब तक आवश्यक सबसे बड़ा समायोजन सम्मिलित (या हटाए गए) लीप सेकंड के लिए होता है।

चेतावनी

इस मोड का उपयोग करने के लिए, यह सुनिश्चित करें कि सभी चरणों में निष्पादित होने वाले सभी एर्लांग कोड time warp safe

केवल अंतिम चरण में कोड निष्पादित करने के लिए समय ताना झेलने में सक्षम नहीं होना चाहिए।

मल्टी-टाइम ताना मोड

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

समय की ऑफसेट सीमाओं के बिना किसी भी समय बदल सकती है। यही है, एर्लांग प्रणाली समय किसी भी समय आगे और पीछे दोनों समय के युद्धक प्रदर्शन कर सकती है। जैसा कि हमने समय ऑफसेट को बदलकर OS सिस्टम समय के साथ Erlang सिस्टम समय को संरेखित किया है, हम एक समय सुधार को सक्षम कर सकते हैं जो Erlang मोनोटोनिक घड़ी की आवृत्ति को यथासंभव सही करने की कोशिश करता है। यह एर्लांग मोनोटोनिक समय का अधिक सटीक और सटीक उपयोग करके समय माप करता है।

यदि समय सुधार अक्षम किया गया है, तो ओएस सिस्टम समय आगे छलांग लगाता है, एर्लांग मोनोटोनिक समय आगे बढ़ता है। यदि ओएस सिस्टम का समय पीछे की ओर बढ़ता है, तो एरलंग मोनोटोनिक समय थोड़े समय के लिए रुक जाता है, लेकिन यह समय की विस्तारित अवधि के लिए स्थिर नहीं होता है। इस समय के रूप में ओएस सिस्टम समय के साथ Erlang प्रणाली समय संरेखित करने के लिए समय ऑफसेट को बदल दिया जाता है।

चेतावनी

इस मोड का उपयोग करने के लिए, सुनिश्चित करें कि रनटाइम सिस्टम पर अमल करने वाले सभी Erlang कोड time warp safe

3.7 नया समय एपीआई

पुराना समय API erlang:now/0 पर आधारित है erlang:now/0 erlang:now/0 का उद्देश्य कई असंबंधित चीजों के लिए इस्तेमाल किया जाना था। इसने इन असंबंधित परिचालनों को एक साथ बांध दिया और उन परिचालनों के लिए प्रदर्शन, मापनीयता, सटीकता और सटीकता के साथ मुद्दों का कारण बना, जिन्हें ऐसे मुद्दों की आवश्यकता नहीं थी। इसे बेहतर बनाने के लिए, नया एपीआई कई कार्यों पर अलग-अलग कार्यक्षमता फैलाता है।

पिछड़े संगत होने के लिए, erlang:now/0 अवशेष "जैसा है" है, लेकिन आप इसका उपयोग करने से दृढ़ता से हतोत्साहित हैं erlang:now/0 कई उपयोग मामले erlang:now/0 आपको नए multi-time warp mode का उपयोग करने से रोकता multi-time warp mode , जो इस नए समय की कार्यक्षमता में सुधार का एक महत्वपूर्ण हिस्सा है।

कुछ प्रणालियों पर नए बीआईएफ में से कुछ, शायद आश्चर्यजनक रूप से, एक नए शुरू किए गए रनटाइम सिस्टम पर नकारात्मक पूर्णांक मान लौटाते हैं। यह बग नहीं है, लेकिन मेमोरी उपयोग अनुकूलन है।

नए API में निम्नलिखित नए BIF हैं:

नए API में निम्न मौजूदा BIF के एक्सटेंशन शामिल हैं:

नई एरलंग मोनोटोनिक समय

Erlang monotonic समय जैसे कि ERTS 7.0 से नया है। यह समय मापन को अलग करने के लिए पेश किया जाता है, जैसे कि कैलेंडर समय से बीता हुआ समय। कई उपयोग के मामलों में बीते समय को मापने की आवश्यकता है या यूटीसी में शामिल समय या किसी अन्य विश्व स्तर पर परिभाषित समय के पैमाने को जानने की आवश्यकता के बिना किसी अन्य बिंदु के सापेक्ष समय निर्दिष्ट करें। समय की एक स्थानीय परिभाषा के साथ एक समय पैमाने को शुरू करने से, जहां यह शुरू होता है, समय जो कैलेंडर के समय की चिंता नहीं करता है, उस समय के पैमाने पर प्रबंधित किया जा सकता है। Erlang मोनोटोनिक समय स्थानीय स्तर पर शुरू की गई शुरुआत के साथ ऐसे समय पैमाने का उपयोग करता है।

एरलंग मोनोटोनिक समय की शुरूआत हमें दो एर्लांग समय (एरलंग मोनोटोनिक समय और एरलंग सिस्टम समय) को अलग-अलग समायोजित करने की अनुमति देती है। ऐसा करने से बीते हुए समय की सटीकता को भुगतना नहीं पड़ता है क्योंकि सिस्टम का समय किसी समय गलत था। दो बार के अलग-अलग समायोजन केवल समय ताना मोड में किए जाते हैं, और केवल multi-time warp mode में पूरी तरह से अलग हो जाते हैं। बहु-समय ताना मोड की तुलना में अन्य सभी मोड पिछड़े संगतता कारणों के लिए हैं। इन मोड्स का उपयोग करते समय, एरलंग मोनोटोनिक समय की सटीकता को नुकसान होता है, क्योंकि इन मोड्स में एरलंग मोनोटोनिक समय का समायोजन कमोबेश एर्लैंग सिस्टम टाइम से जुड़ा होता है।

सिस्टम टाइम के समायोजन को टाइम ताना दृष्टिकोण का उपयोग करने से बेहतर बनाया जा सकता था, लेकिन हमें लगता है कि यह एक बुरा विकल्प होगा। जैसा कि हम व्यक्त कर सकते हैं और समय को माप सकते हैं जो एरलैंग मोनोटोनिक समय के उपयोग से कैलेंडर समय से जुड़ा नहीं है, एर्लांग सिस्टम समय में परिवर्तन को तुरंत उजागर करना बेहतर है। यह सिस्टम पर निष्पादित करने वाले एर्लांग अनुप्रयोगों के रूप में जल्द से जल्द सिस्टम समय में परिवर्तन पर प्रतिक्रिया कर सकता है। यह भी कमोबेश यही है कि अधिकांश ऑपरेटिंग सिस्टम इसे कैसे संभालते हैं (ओएस मोनोटोनिक समय और ओएस सिस्टम समय)। सिस्टम समय को सुचारू रूप से समायोजित करके, हम सिर्फ इस तथ्य को छिपाएंगे कि सिस्टम का समय बदल गया है और एर्लांग अनुप्रयोगों के लिए समझदार तरीके से परिवर्तन पर प्रतिक्रिया करना कठिन है।

Erlang प्रणाली समय में परिवर्तन पर प्रतिक्रिया करने में सक्षम होने के लिए, आपको यह पता लगाने में सक्षम होना चाहिए कि ऐसा हुआ था। एर्लांग प्रणाली के समय में परिवर्तन तब होता है जब वर्तमान समय ऑफसेट को बदल दिया जाता है। इसलिए हमने erlang:monitor(time_offset, clock_service) का उपयोग करते हुए ऑफ़सेट समय की निगरानी करने की संभावना पेश की है erlang:monitor(time_offset, clock_service) । समय ऑफसेट को बदलते समय ऑफसेट की निगरानी करने वाली एक प्रक्रिया को निम्न प्रारूप पर एक संदेश भेजा जाता है:

{'CHANGE', MonitorReference, time_offset, clock_service, NewTimeOffset}

अद्वितीय मान

रिपोर्टिंग समय के अलावा, erlang:now/0 भी अद्वितीय और सख्ती से नीरस रूप से बढ़ते मूल्यों का उत्पादन करता है। समय की माप से इस कार्यक्षमता को अलग करने के लिए, हमने erlang:unique_integer/1

न्यू एपीआई के साथ कैसे काम करें

पहले erlang:now/0 कई काम करने के लिए एकमात्र विकल्प था। यह खंड कुछ ऐसी चीजों से संबंधित है जो erlang:now/0 का उपयोग किया जा सकता है, और आप नए एपीआई का उपयोग कैसे करते हैं।

एर्लैंग सिस्टम टाइम को पुनः प्राप्त करें
नहीं

Erlang का उपयोग करें erlang:now/0 वर्तमान Erlang सिस्टम समय को पुनः प्राप्त करने के लिए erlang:now/0

करना

Erlang का प्रयोग करें erlang:system_time/1 अपनी पसंद की time unit पर वर्तमान Erlang सिस्टम समय को पुनः प्राप्त करने के लिए।

यदि आप erlang:now/0 द्वारा लौटाए गए समान प्रारूप चाहते erlang:now/0 , erlang:timestamp/0 उपयोग करें erlang:timestamp/0

उपाय बीता हुआ समय
नहीं

timer:now_diff/2 साथ समय टिकटों को लें erlang:now/0 और timer:now_diff/2 साथ समय में अंतर की गणना करें timer:now_diff/2

करना

erlang:monotonic_time() साथ समय टिकटों को लें erlang:monotonic_time() और साधारण घटाव का उपयोग करके समय के अंतर की गणना करें। परिणाम native time unit । यदि आप परिणाम को किसी अन्य समय इकाई में बदलना चाहते हैं, तो आप erlang:convert_time_unit/3 उपयोग कर सकते हैं।

ऐसा करने का एक आसान तरीका erlang:monotonic_time/1 का उपयोग करना है erlang:monotonic_time/1 वांछित समय इकाई के साथ erlang:monotonic_time/1 । हालांकि, फिर आप सटीकता और सटीक खो सकते हैं।

घटनाओं का क्रम निर्धारित करें
नहीं

erlang:now/0 साथ एक समय टिकट को सहेजकर घटनाओं के क्रम को निर्धारित करें erlang:now/0 जब घटना होती है तो erlang:now/0

करना

ईवेंट द्वारा लौटाए गए पूर्णांक को सहेजकर घटनाओं का क्रम निर्धारित करें erlang:unique_integer/1 जब घटना erlang:unique_integer/1 । ये पूर्णांक निर्माण समय के अनुसार वर्तमान रनटाइम सिस्टम उदाहरण पर सख्ती से नीरस रूप से आदेशित होते हैं।

घटना के समय के साथ घटनाओं का क्रम निर्धारित करें
नहीं

erlang:now/0 साथ एक समय टिकट को सहेजकर घटनाओं के क्रम को निर्धारित करें erlang:now/0 जब घटना होती है तो erlang:now/0

करना

एक टूपल युक्त erlang:monotonic_time() और erlang:unique_integer/1 रूप से erlang:unique_integer/1 को सहेजकर घटनाओं के क्रम को निर्धारित करें:

Time = erlang:monotonic_time(),
UMI = erlang:unique_integer([monotonic]),
EventTag = {Time, UMI}

इन ट्यूपल्स को निर्माण समय के अनुसार वर्तमान रनटाइम सिस्टम उदाहरण पर कड़ाई से नीरस रूप से आदेश दिया गया है। यह महत्वपूर्ण है कि मोनोटोनिक समय पहले तत्व में है (दो-ट्यूपल्स की तुलना करते समय सबसे महत्वपूर्ण तत्व)। टुपल्स में मोनोटोनिक समय का उपयोग करके, आप घटनाओं के बीच के समय की गणना कर सकते हैं।

यदि आप उस समय Erlang सिस्टम समय में रुचि रखते हैं, जब घटना हुई थी, तो आप erlang:time_offset/0 का उपयोग करके ईवेंट्स को सहेजने से पहले या बाद के समय को भी सहेज सकते हैं erlang:time_offset/0 । Erlang मोनोटोनिक समय ऑफसेट के साथ जोड़ा गया समय Erlang सिस्टम समय से मेल खाता है।

यदि आप एक ऐसे मोड में निष्पादित कर रहे हैं, जहां समय बदल सकता है, और आप वास्तविक एर्लांग सिस्टम समय प्राप्त करना चाहते हैं, जब घटना घटित होती है, तो आप समय को ऑफसेट के तीसरे तत्व के रूप में बचा सकते हैं (तीन की तुलना में कम से कम महत्वपूर्ण तत्व) tuples)।

एक अद्वितीय नाम बनाएँ
नहीं

erlang:now/0 से लौटे मूल्यों का उपयोग करें erlang:now/0 वर्तमान रनटाइम सिस्टम उदाहरण पर एक नाम बनाने के लिए erlang:now/0

करना

erlang:unique_integer/0 से लौटाए गए मान का उपयोग करें erlang:unique_integer/0 वर्तमान रनटाइम सिस्टम उदाहरण पर एक नाम बनाने के लिए। यदि आप केवल सकारात्मक पूर्णांक चाहते हैं, तो आप erlang:unique_integer/1 उपयोग कर सकते हैं।

एक अद्वितीय मूल्य के साथ बीज रैंडम संख्या पीढ़ी
नहीं

erlang:now() का उपयोग करके यादृच्छिक संख्या उत्पन्न करना erlang:now()

करना

erlang:monotonic_time() संयोजन का उपयोग करके बीज यादृच्छिक संख्या पीढ़ी erlang:monotonic_time() , erlang:time_offset/0 , erlang:unique_integer/0 , और अन्य कार्यक्षमता।

इस अनुभाग को erlang:now/0 उपयोग न करें erlang:now/0

3.8 नए और पुराने दोनों ओटीपी रिलीफ का समर्थन

यह आवश्यक हो सकता है कि आपका कोड विभिन्न ओटीपी रिलीज के विभिन्न ओटीपी प्रतिष्ठानों पर चलना चाहिए। यदि हां, तो आप बॉक्स से बाहर नए एपीआई का उपयोग नहीं कर सकते हैं, क्योंकि यह ओटीपी 18 से पहले रिलीज पर उपलब्ध नहीं होगा। समाधान नए एपीआई का उपयोग करने से बचने के लिए नहीं है, क्योंकि आपके कोड को स्केलेबिलिटी और सटीकता में सुधार से लाभ नहीं होगा। बनाया गया। इसके बजाय, उपलब्ध होने पर नए API का उपयोग करें, और erlang:now/0 पर वापस जाएं erlang:now/0 जब नया API अनुपलब्ध है।

सौभाग्य से अधिकांश नए एपीआई आसानी से मौजूदा आदिम का उपयोग करके लागू किए जा सकते हैं, सिवाय इसके:

एपीआई को erlang:now/0 पर गिरने वाले कार्यों के साथ एपीआई को लपेटकर erlang:now/0 जब नया एपीआई अनुपलब्ध है, और सीधे एपीआई का उपयोग करने के बजाय इन आवरणों का उपयोग करने से समस्या हल हो जाती है। उदाहरण के लिए, ये रैपर $ERL_TOP/erts/example/time_compat.erl रूप में लागू किए जा सकते हैं।