[Linux] jiffies를 밀리 초로 변환


Answers

이전 답변에서 말한 것처럼 jiffies 증가하는 비율은 고정되어 있습니다.

jiffies 를 받아들이는 함수의 시간을 지정하는 표준 방법은 상수 HZ 사용하는 것입니다.

그것은 Hertz의 약어 또는 초당 틱 수입니다. 타이머 틱이 1ms로 설정된 시스템에서 HZ = 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 */

마지막 두 개는 10ms 타이머 틱이있는 시스템 에서처럼 HZ/100 이 1이고 정밀도가 떨어지기 시작하는 것과 같이 약간 문제가 있습니다. 0.0001에서 1.999 사이의 타이머 틱 (0-2 ms, 본질적으로) 사이의 지연이 발생할 수 있습니다. 10ms 진드기 시스템에서 HZ/200 을 사용하려고하면, 정수 나누기가 0 인 jiffies를 제공합니다!

따라서 엄지 법칙은 매우 작은 값 (1 개의 jiffie에 접근하는 값)에 대해 HZ를 사용하여 매우 조심해야합니다.

다른 방법으로 변환하려면 다음을 사용합니다.

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

밀리 세컨드 정밀도보다 나은 것을 기대해서는 안됩니다.

Question

Linux에서 수동으로 jiffies를 밀리 초 또는 그 반대로 변환하는 방법은 무엇입니까? 나는 커널 2.6이이 기능을 가지고 있지만 2.4 (숙제)에 대해 연구 중이다. 그리고 코드에서 2.4를 정의했는지 전혀 알 수없는 많은 매크로 상수를 사용한다.







이 샘플 코드는 kernelnewbies 에서 발견되었습니다. -lrt 와 연결되어 있는지 확인하십시오 -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;
 }



Jiffies는 Linux 2.4에서 하드 코딩되어 있습니다. 아키텍처 특정 param.h 정의 된 HZ 의 정의를 확인하십시오. 이것은 종종 100Hz입니다. 매 10ms마다 1 틱 (1 초 / 100 틱 * 1000 ms / 초)입니다.

이것은 i386에 해당하며 HZ는 include/asm-i386/param.h 정의됩니다.

include/linux/time.h timespec_to_jiffiesjiffies_to_timespec 이라는 include/linux/time.h 가 있습니다. timespec_to_jiffiesjiffies_to_timespecstruct timespecjiffies 사이에서 앞뒤로 변환 할 수 있습니다.

    #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에서 확인했습니다.