شرح - linux ماهو




تحويل جيفيز إلى ملي ثانية (3)

كما قال الجواب السابق، المعدل الذي الزيادات 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 مس، أساسا). إذا حاولت استخدام HZ/200 على نظام علامة 10ms، قسم صحيح يمنحك 0 جيفيز!

وبالتالي فإن قاعدة الإبهام هو، تكون حذرا جدا باستخدام هز لقيم صغيرة (تلك تقترب 1 جيفي).

لتحويل الطريقة الأخرى، يمكنك استخدام:

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

يجب أن لا نتوقع أي شيء أفضل من الدقة ميلي ثانية واحدة.

كيف يمكنني تحويل جيفيز يدويا إلى ميلي ثانية، والعكس بالعكس في لينوكس؟ أعرف نواة 2.6 لديه وظيفة لهذا، ولكن أنا أعمل على 2.4 (الواجبات المنزلية) وعلى الرغم من أنني نظرت إلى التعليمات البرمجية أنه يستخدم الكثير من الثوابت الكلية التي ليس لدي أي فكرة إذا كانت محددة في 2.4.


جيفيز هي مرمزة في لينكس 2.4. تحقق من تعريف HZ ، الذي يعرف في param.h المعمارية محددة. انها في كثير من الأحيان 100 هرتز، وهو علامة واحدة كل (1 ثانية / 100 القراد * 1000 مللي ثانية / ثانية) 10 مللي ثانية.

ينطبق هذا على i386، وتعرف هز في include/asm-i386/param.h .

هناك وظائف في include/linux/time.h timespec_to_jiffies يسمى timespec_to_jiffies و jiffies_to_timespec حيث يمكنك تحويل ذهابا وإيابا بين struct timespec و struct timespec :

    #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;
    }

ملاحظة: راجعت هذه المعلومات في الإصدار 2.4.22.






linux-kernel