2011-01-26 18 views
22

यहां एक छोटा सा परीक्षण है जिसे मैंने यह सत्यापित करने के लिए लिखा है कि वास्तव में केवल लिनक्स में ही आगे बढ़ता है।लिनक्स पर पीछे की ओर चलने से समय कैसे रोकें?

#include <time.h> 
#include <sys/time.h> 

bool timeGoesForwardTest2() 
{ 
    timeval tv1, tv2; 
    double startTime = getTimeSeconds(); // my function 

    while (getTimeSeconds() - startTime < 5) 
    { 
     gettimeofday(&tv1, NULL); 
     gettimeofday(&tv2, NULL); 

     if (tv2.tv_usec == tv1.tv_usec && 
      tv2.tv_sec == tv1.tv_sec) 
     { 
     continue; // Equal times are allowed. 
     } 

     // tv2 should be greater than tv1 
     if (!(tv2.tv_usec>tv1.tv_usec || 
       tv2.tv_sec-1 == tv1.tv_sec)) 
     { 
     printf("tv1: %d %d\n", int(tv1.tv_sec), int(tv1.tv_usec)); 
     printf("tv2: %d %d\n", int(tv2.tv_sec), int(tv2.tv_usec)); 
     return false; 
     }   
    } 
    return true; 
} 

परीक्षण परिणाम के साथ विफल रहता है।

tv1: 1296011067 632550 
tv2: 1296011067 632549 

ummm ....

इस क्यों होता है?

Linux version 2.6.35-22-generic ([email protected]) (gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu4)) #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 (Ubuntu 2.6.35-22.33-generic 2.6.35.4) 
... running inside VirtualBox 3.2.12, in Windows 7. 
+1

इसे वीएम के साथ करना पड़ सकता है। क्या आपने इसे वास्तविक लिनक्स इंस्टॉल के साथ करने का प्रयास किया है? –

+0

सुनिश्चित करें कि आप tv_sec और tv_usec पर पूर्णांक रोलओवर की जांच कर रहे हैं जब भी उनके साथ कोई गणना कर रहे हों। –

+26

मुझे संदेह है क्योंकि यह समय आपके सीपीयू पर दो अलग-अलग कोरों पर जाता है और उनमें से एक लघु ब्लैक होल के आसपास है।घर से निकल जाओ। जितनी जल्दी हो सके आप कर सकते हैं। गंभीरता से! – paxdiablo

उत्तर

17

एक open issue at the VirtualBox Bug Tracker है। वे बताते हुए क्यों you shouldn't use gettimeofday() समय बीतने को मापने के लिए एक ब्लॉग पोस्ट से लिंक:

समय सही ढंग से clock_gettime हो रहा है को मापने के लिए सबसे पोर्टेबल रास्ता (CLOCK_MONOTONIC, ...)

+1

बगट्रैकर लिंक यह भी बताता है कि 'CLOCK_MONOTONIC' एक ही समस्या प्रदर्शित करता है - जैसा वर्चुअलबॉक्स के तहत फ्रीबीएसडी चल रहा है। यह वर्चुअलबॉक्स बग प्रतीत होता है। – caf

+0

वीएम पर समय वैसे भी सुंदर फल लगता है। काम पर मेरे वीएमवेयर इंस्टॉल ने अचानक फैसला किया कि यह सही दर पर 1/2 पर टिक टिकेगा। –

+0

यह सही लगता है। gettimeofday देशी और आभासी मशीनों पर मेरे लिए समस्याग्रस्त है। clock_gettime हालांकि वर्चुअलबॉक्स के लिए भी विफल रहता है। बग वर्चुअलबॉक्स में है। – user48956

5

यह है कि यह पीछे की ओर चल रहा है नहीं है:

यहाँ मेरी सेटअप है। यह कहना बेहतर होगा कि यह सही समय की रिपोर्ट नहीं कर रहा है। ऐसा इसलिए है क्योंकि एक समर्पित समय उपप्रणाली की सहायता के बिना कंप्यूटर, बस एकल मिलीसेकंद अंतराल में बहुत सटीक समय रिपोर्ट करने में सक्षम नहीं हैं।

हार्डवेयर, ओएस और यहां तक ​​कि बिजली की आपूर्ति के साथ परिशुद्धता अलग-अलग होगी। यहां एक article for starters है। थोड़ा पुराना लेकिन विचार अच्छी तरह से संवाद करता है।

+0

यह उत्तर बकवास है। कोई भी आधुनिक यूनिक्स जैसी प्रणाली 10 मिलीसेकंद संकल्प या बेहतर के लिए सटीकता प्रदान करेगी, और नैनोसेकंद संकल्प असामान्य नहीं है। मैंने सुना है कि विंडोज़ भी खराब काम नहीं करता है ... –

+0

@R: जब मैंने मूल संकल्प उद्धृत किया था तो मैं पुराने विंडोज़ इंटरप्ट टाइमर की लाइनों के साथ सोच रहा था। आधुनिक समय के लिए मेरा जवाब अपडेट किया गया ... –

10

अधिकांश मशीनों पर मशीन टाइमर केवल 15 उपयोगक परिशुद्धता (यहां तक ​​कि मूल कोड तक) हैं। समय 'पिछड़ा' समय अजीब है, लेकिन आप वास्तव में उस स्तर (1 usec) पर भरोसा नहीं कर सकते हैं। (यह भी ध्यान दें: सटीकता और सटीकता के बीच एक अंतर है; अधिकांश टाइमर की सटीकता इसकी सटीकता से भी बदतर है)। वर्चुअल मशीन का उपयोग इससे भी बढ़ सकता है।

अद्यतन: टाइपो

+0

परिशुद्धता बनाम सटीकता के बारे में महान बिंदु। मामले में मामला: आरडीटीएससी में अत्यधिक सटीकता (कई आधुनिक मशीनों पर उप-नैनोसेकंद) है, फिर भी किसी भी सामान्य टाइमकीपिंग कार्यों की तुलना में संभावित रूप से बहुत खराब सटीकता है। – ephemient

30

gettimeofday() monotonic होने की गारंटी नहीं है। यदि आपको उस गारंटी की आवश्यकता है तो clock_gettime(CLOCK_MONOTONIC) का उपयोग करें।

+0

यह सच है, लेकिन @ vz0 द्वारा पोस्ट किया गया बगट्रैकर लिंक कहता है कि वर्चुअलबॉक्स के तहत 'CLOCK_MONOTONIC' के साथ एक ही समस्या होती है, इसलिए यहां एक बग भी है। – caf

1

समय असली हार्डवेयर पर पीछे नहीं चलना चाहिए; एक वीएम पर आपका लाभ भिन्न हो सकता है।

किसी भी मामले में, आपके आवेदन को शायद यह नहीं मानना ​​चाहिए कि समय बहुत कम राशि (लगता है, शायद 1 सेकंड) द्वारा पीछे नहीं चलाया जाना चाहिए।

हां, घड़ी_gettime अच्छा है, लेकिन दोषपूर्ण हार्डवेयर (या आपके उदाहरण में एक वीएम) के मामले में पीछे की ओर चला सकता है।

मैंने एक हार्डवेयर बग देखा है जो समय-समय पर चल रहा है (हालांकि कभी-कभी), यह कुछ बहुत ही अनोखी समस्याओं का कारण था।

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

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