2010-04-28 19 views
36

मैं जेफियों को मिलीसेकंड में मैन्युअल रूप से कैसे परिवर्तित कर सकता हूं और इसके विपरीत लिनक्स में? मुझे पता है कि कर्नेल 2.6 के लिए एक फ़ंक्शन है, लेकिन मैं 2.4 (होमवर्क) पर काम कर रहा हूं और हालांकि मैंने कोड को देखा है, यह मैक्रो स्थिरांक का उपयोग करता है, जिसे मुझे नहीं पता कि 2.4 में परिभाषित किया गया है या नहीं।जिफियों को मिली सेकंड में कनवर्ट करना

+1

कर्नेल 2.6 में उपयोग किया गया फ़ंक्शन क्या है? –

+0

@kaciula हार्ड-कोडित जिफिस को याद दिलाने के लिए/linux/jiffies.h – tonylo

उत्तर

37

जैसा कि पिछले उत्तर में कहा गया था, जिस दर पर jiffies वेतन वृद्धि तय की गई है।

jiffies स्वीकार करने वाले फ़ंक्शन के लिए समय निर्दिष्ट करने का मानक तरीका निरंतर HZ का उपयोग कर रहा है।

यह हर्ट्ज का संक्षिप्त नाम है, या प्रति सेकंड टिकों की संख्या है। एक टाइमर टिक के साथ एक सिस्टम पर 1ms, एचजेड = 1000 सेट। कुछ वितरण या आर्किटेक्चर एक और संख्या का उपयोग कर सकते हैं (100 आम होने के लिए इस्तेमाल किया जाता है)।

एक समारोह के लिए एक jiffies गिनती निर्दिष्ट करने के लिए मानक तरीका HZ उपयोग कर रहा है, इस तरह:

schedule_timeout(HZ/10); /* Timeout after 1/10 second */ 

सबसे सरल मामलों में, यह ठीक काम करता है।

2*HZ  /* 2 seconds in jiffies */ 
HZ  /* 1 second in jiffies */ 
foo * HZ /* foo seconds in jiffies */ 
HZ/10 /* 100 milliseconds in jiffies */ 
HZ/100 /* 10 milliseconds in jiffies */ 
bar*HZ/1000 /* bar milliseconds in jiffies */ 

उन पिछले दो एक 10 एमएस घड़ी टिक के साथ एक सिस्टम पर के रूप में, HZ/100 1, एक समस्या का एक सा है, तथापि, और सटीक पीड़ित शुरू होता है। आपको 0.0001 और 1.999 टाइमर टिक (0-2 एमएस, अनिवार्य रूप से) के बीच कहीं भी देरी हो सकती है। यदि आपने 1012 टिक सिस्टम पर HZ/200 का उपयोग करने का प्रयास किया है, तो पूर्णांक विभाजन आपको 0 jiffies देता है!

तो की एक बात, छोटे मूल्यों (1 jiffie आ गया है) के लिए हर्ट्ज का उपयोग कर बहुत सावधान रहना है।

अन्य तरीके से बदलने के लिए, आप का प्रयोग करेंगे:

jiffies/HZ   /* jiffies to seconds */ 
jiffies * 1000/HZ /* jiffies to milliseconds */ 

तुम कुछ भी मिलीसेकंड परिशुद्धता की तुलना में बेहतर उम्मीद नहीं करनी चाहिए।

+0

क्या सीएलआई का उपयोग कर एचजेड मूल्य प्राप्त करना संभव है? जैसे 2.6 कर्नेल पर/proc/[pid]/stat से utime पढ़ने के बाद, क्या मैं आसानी से इसे सी कोड से संकलित करने की आवश्यकता के बिना सेकंड में परिवर्तित कर सकता हूं? –

+1

यदि आप उपयोगकर्ता स्पेस से एचजेड के साथ बातचीत कर रहे हैं, तो इसके बजाय USER_HZ का उपयोग करें। 'मैन 7 टाइम' इस मान को लाने के लिए sysconf (_SC_CLK_TCK) का उपयोग करने के लिए कहता है। –

+1

मुझे शेल स्क्रिप्ट से ऐसा करने का एक स्पष्ट तरीका दिखाई नहीं देता है, लेकिन यह आमतौर पर एक स्थिर है जब तक कि आप अपने कर्नेल को अप्राकृतिक चीजें नहीं कर रहे हैं। X86 यूएसER_एचजेड पर 100 है। –

13

लिफ़िक्स 2.4 में जिफियों को हार्ड-कोड किया गया है। HZ की परिभाषा की जांच करें, जिसे आर्किटेक्चर-विशिष्ट param.h में परिभाषित किया गया है। यह अक्सर 100 हर्ट्ज होता है, जो प्रत्येक पर एक टिक (1 सेकंड/100 टिक * 1000 एमएस/सेकंड) 10 एमएस होता है।

यह i386 के लिए सच है, और एचजेड include/asm-i386/param.h में परिभाषित किया गया है।

#define MAX_JIFFY_OFFSET ((~0UL >> 1)-1) 

    static __inline__ unsigned long 
    timespec_to_jiffies(struct timespec *value) 
    { 
      unsigned long sec = value->tv_sec; 
      long nsec = value->tv_nsec; 

      if (sec >= (MAX_JIFFY_OFFSET/HZ)) 
        return MAX_JIFFY_OFFSET; 
      nsec += 1000000000L/HZ - 1; 
      nsec /= 1000000000L/HZ; 
      return HZ * sec + nsec; 
    } 

    static __inline__ void 
    jiffies_to_timespec(unsigned long jiffies, struct timespec *value) 
    { 
      value->tv_nsec = (jiffies % HZ) * (1000000000L/HZ); 
      value->tv_sec = jiffies/HZ; 
    } 

नोट::

timespec_to_jiffies और jiffies_to_timespec बुलाया include/linux/time.h में कार्य जहां आगे और पीछे एक struct timespec और jiffies के बीच परिवर्तित कर सकते हैं कर रहे हैं मैं संस्करण 2.4.22 में इस जानकारी की जाँच की।

+0

^में jiffies_to_msecs() को शामिल करें। – PypeBros

4

मैं kernelnewbies पर यह कोड का नमूना पाया जा सकता है। सुनिश्चित करें कि आप -lrt

#include <unistd.h> 
#include <time.h> 
#include <stdio.h> 

int main() 
{ 
    struct timespec res; 
    double resolution; 

    printf("UserHZ %ld\n", sysconf(_SC_CLK_TCK)); 

    clock_getres(CLOCK_REALTIME, &res); 
    resolution = res.tv_sec + (((double)res.tv_nsec)/1.0e9); 

    printf("SystemHZ %ld\n", (unsigned long)(1/resolution + 0.5)); 
    return 0; 
} 
संबंधित मुद्दे