2013-04-02 1 views
1

"1ms sleep"에 걸리는 시간을 알고 싶었습니다. 내가 가진CPU의 클럭 주파수 및 측정 시간이 경과 됨

rdtscl(aj); 
msleep(1); 
rdtscl(b); 
printk(KERN_INFO "Difference = %lu", (b-a));// Number of clock cycles consumed 

출력 :

커널 모듈이 퀘스트 란 고양이/proc 디렉토리에 대한

Difference = 13479219 

출력/그와

cpu MHz : 1197.000 

cpuinfo의를, 나는 지연을 계산 , 나는 11.26 밀리 초를 얻었다.

왜 1ms 정도 걸리지 않을까요?

UPDATE : 고양이

프로세서 주파수/proc 디렉토리/cpuinfo의 sholud 다음 줄에서 가져온 수 :

model name : Intel(R) Core(TM) i3 CPU   540 @ 3.07GHz 

=> 프로세서 주파수가 3.07 GHz의입니다. 이 줄 "cpu MHz : 1197.000"의 의미는 무엇인지 알 수 없습니다.

감사

프로세스 해상도는 테스트 코드를 실행 한 시스템에 구성된 HZ 값에 따라 달라집니다

답변

1

. HZ 값은 100 또는 1000 일 수 있으며, 100이면 스케쥴러가 10ms에 한 번만 깨어납니다. 주로 데스크탑 시스템에서 최근 배포판에서는 1000으로 설정됩니다 (Fedora의/boot에있는 구성 파일을 체크인 할 수 있습니다). 스케쥴러는 스케쥴러 만 기반으로 스케쥴러가 스케쥴러가 매 10ms마다 한 번씩 깨어 난다면 10ms보다 작은 해상도를 얻을 방법이 없습니다. 또는 커널에서 HR 타이머를 사용해야합니다. 당신이 정말로 지연하지만 수면없이 원하는 경우

kernel-3.4.5 (u3-1 *)$ cat /boot/config-3.6.10-4.fc18.x86_64 | grep HZ 
CONFIG_NO_HZ=y 
# CONFIG_RCU_FAST_NO_HZ is not set 
# CONFIG_HZ_100 is not set 
# CONFIG_HZ_250 is not set 
# CONFIG_HZ_300 is not set 
CONFIG_HZ_1000=y 
CONFIG_HZ=1000 

, 다음, mdelay을 사용할 수있는 것입니다 시간과 수익의 지정된 시간 동안 만 루프.

+0

{=> '의미하는'} 내 경우의 HZ 값은 250입니다. => 계산할 수있는 최소 간격은 4ms입니다.> 1ms 간격은 계산할 수 없습니다. => 다음과 같은 방식으로 추정합니다. 간격을 늘릴 필요가 있습니다 (sleep (5)). 게다가 프로세서 주파수가 3.05 GHz => 32 비트 변수가 0.76 초마다 오버플로되므로 우리는 간격을 더 많이 지정할 수 없습니다. -> 솔루션 : 가변 크기를 64 비트로 늘리십시오. 감사 – Kernel