转载自  http://www.yiiyee.cn/Blog/clock-interval/    【作者:张佩】

系统时钟间隔是个很少被关心到的系统标量,它反映了系统产生时钟中断的频率,间隔越小频率越高,反之亦然。每当时钟中断产生,系统相关的中断函数将会处理这个中断。时钟中断处理函数会更新系统时间,检查内核调试信息等。

1. 时钟间隔

系统时钟间隔和另一个极重要的系统标量关联在一起:线程调度时限。按照Windows系统的设计,线程调度时限被分为普通程序和后台服务两种类型。前者运行2个时钟间隔,后者运行12个时钟间隔,用户可以在系统属性中手动更改时限类型。

不同硬件平台定义有不同的最小、最大时钟间隔值。对于X86平台而言,最小时钟间隔是0.5ms,最大值大概是15.6001ms。在内部,时钟间隔以100ns为单位进行表述,所以0.5ms被表示为5000个100ns单位,15.6ms被表示为156001个100ns单位。

使用ClockInterval工具可以查看/设置系统时钟频率(类似的工具是Sysinternal的ClockRes工具,可以查看当前值)。下图是运行ClockInterval后的界面截图:

图1 获取时钟频率

线程调度时限是一个重要的系统标量,对不同功能的应用而言,它的取值具有矛盾性。如果调度时限太小,系统就会频繁切换线程(因为时间片很快用完),从而导致性能降低。而如果调度时限太长,某些对于实时性要求很高的任务则不能接受。

系统把一个时钟间隔分成三份,以其中的一份(1/3时钟间隔)作为线程调度的基本时间片段,称为一个时限单元。如果一个线程在运行过程中放弃剩余的时间片,则它用掉和放弃的,都是时限单元的倍数。

哪些任务需要很强的实时性呢?包括:音视频软件、实时监控软件等。MediaPlayer是一个强实时要求的音频软件,笔者在测试机上(Win7 64)做实验时发现,每当运行MediaPlayer程序,它都会把系统时钟频率调低到10ms;而当退出MediaPlayer,时钟频率又会恢复至原值。类似的软件还有WinAMP和鲁大师等,读者有空可以实测一下,这两款软件会把系统时间间隔设置成1ms(如果读者使用这些软件时,未测试出相同的时钟间隔,可能是由于版本差异引起,笔者对此不做特别保证)。

2. 如何设置

用户程序如要控制系统时钟间隔,最简单的办法是调用Windows MMLib库的接口函数timeBeginPeriod和timeEndPeriod。前者用来设置一个新的最小时钟间隔,后者用来结束当前设置。这两个函数原型定义如下:

MMRESULT timeBeginPeriod(UINT uPeriod );
MMRESULT timeEndPeriod(UINT uPeriod );

程序执行期间这两个函数应当成对调用。据笔者观察,退出程序时如果忘记调用timeEndPeriod函数,系统时钟间隔也会自动恢复。这两个函数较简单,下面是一段演示代码:

UINT newInverval = 1;
MMRESULT r = timeBeginPeriod( newInverval ); // 设置当前系统时钟间隔为1ms//do something here...if(r == TIMER_NOERROR)
{timeEndPeriod(newInterval);// 最后,再恢复到原频率
}

如要获取当前的时钟间隔值,可使用Win32 API:GetSystemTimeAdjustment。其函数声明如下:

BOOL WINAPI GetSystemTimeAdjustment(__out         PDWORD lpTimeAdjustment,__out         PDWORD lpTimeIncrement,__out         PBOOL lpTimeAdjustmentDisabled
);

这个函数没有一个参数是用来输入的,全部是输出参数。第二个参数lpTimeIncrement返回的就是当前的时钟频率(100ns单位)。下面的实例代码是工具ClockRes V1.0的源码,使用了这个函数:

void main( int argc, char *argv[] )
{DWORD adjustment,clockInterval;BOOL  adjustmentDisabled;GetSystemTimeAdjustment(&adjustment,&clockInterval,&adjustmentDisabled );printf( "The systemclock interval is %d ms\n", clockInterval / 10000 );
}

除了上述公开的API接口外,另外有两个未文档函数:NtQueryTimerResolution和NtSetTimerResolution,也可用来获取和设置时钟频率。在此不做详细分析。

3. 关于恢复

前文说过应成对地使用timeBeginPeriod和timeEndPeriod函数,忘记调用timeEndPeriod会导致系统无法将时钟间隔恢复到较大值。当一个进程设置了系统时钟间隔后,系统中的其他进程只能继续将时钟间隔设置成更低值,而无法恢复为较大值。可以用ClockInterval做下面的实验:

  1. 开启ClockInterval,假设你当前得到的时钟间隔是16ms,将它设置成一个较小的值10ms。
  2. 开启另一个ClockInterval实例,此时将看到当前的时钟间隔是10ms。尝试将当前时钟间隔设置成最大值15.6ms,会发现设置失败。
  3. 关闭第一个ClockInterval实例后,在第二个ClockInterval实例中,再次将当前时钟间隔设置成最大值15.6ms,可以成功!

打开ClockInterval程序后,界面上显示的当前时钟间隔值是你所能重设的时钟间隔的上限。点击ClockInterval界面的“测试”按钮,会提示最大可设置的时钟间隔值。

图2 Test测试

图中信息所示:在系统中的其它进程/线程结束其所设置的1ms时钟间隔前,当前进程无法设置>1ms的时钟间隔。

Windows系统时钟间隔相关推荐

  1. Windows的系统时钟间隔

    引用注明>> [作者:张佩][原文:www.yiiyee.cn/blog] 工具下载:http://www.yiiyee.cn/Blog/clock-interval/ 系统时钟间隔是个一 ...

  2. 《Windows》Windows系统的日期和时间设置

    文章目录 Windows系统的日期和时间设置 Windows10系统 Windows11系统 如何设置windows系统时钟读秒 Windows系统的日期和时间设置 Windows10系统 windo ...

  3. windows系统开机自动进行NTP时间同步和系统时间修正

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.环境介绍 二.使用步骤 1.SymmTime配置 运行情况 前言 NTP是一种常用的时间同步方式,同步精度可以达到 ...

  4. 设计一个脉冲发生器,已知系统时钟为50MHz,生成脉冲宽度为1ms,脉冲间隔可调,最大间隔为1s

    设计一个脉冲发生器,已知系统时钟为50MHz,生成脉冲宽度为1ms,脉冲间隔可调,最大间隔为1s Design a pulse generator. The system clock is known ...

  5. 超级任务栏让你轻松玩转Windows 7系统时钟

    不知道大家有这样的经历没有,当我们在使用电脑的时候,要想知道现在几点了,第一反应是什么?对,就是看右下角的时钟.但是由于各种原因,比如:长时间不调整啦,或者主板电池电量不足啦.都会导致时间不准,这是件 ...

  6. 修改Windows系统同步网络时间的频率

    Windows系统默认的时间同步间隔是7天,如果我们需要修改同步的时间间隔(同步频率),我们可以通过修改注册表来手动修改它的自动同步间隔以提高同步次数,保证时钟的精度,windows7,Windows ...

  7. Windows 系统API 函数快速查找

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

  8. windows10 oracle自动备份,Windows系统下oracle 自动备份数据库

    Windows系统下oracle 自动备份数据库 1.创建批处理文件(.bat) 2.建立windows 定时任务 2.1创建任务 2.2 常规处 ->填写任务名称 2.3触发器 2.4 操作 ...

  9. 且看电脑高手如何优雅的使用windows系统

    有人问道: 我从 08 年的 MacBook 到现在的 MacBook Air,用 Mac 也有4年多了.苹果系统的优雅给人良好的体验,但是在单位和其他场合不可避免的要回归 Windows,请问有哪些 ...

最新文章

  1. 关于肠道菌群研究的7大事实和5大倡议
  2. Windows与Linux共享文件夹互相访问
  3. 阿里设计师出品!B端产品文案指南
  4. php cli spl_autoload_register,PHP spl_autoload_register 自动加载方法浅析
  5. 【Boost】boost库asio详解1——io_service::run函数无任务时退出的问题
  6. r语言 运算符_R语言运算符
  7. 探索Office 2010新特性
  8. flex white-space: nowrap,撑大盒子问题
  9. 小程序登录及用户信息和手机号的获取
  10. 凸台可以延伸吗_知道对比度、清晰度和锐化的差别吗?操作不好,让一张照片报废...
  11. 案例7-3 统计工龄 (20 分)(简单)
  12. canvas练习 - 七巧板绘制
  13. 034 Rust死灵书之为Vec实现Drain
  14. WIN系统仿MAC任务栏工具分享——RocketDock
  15. OSChina 周五乱弹 —— duang ~ duang ~ duang~
  16. 圆面积计算公式,这样理解起来超简单!
  17. C语言程序设计教程的读后感,c语言程序设计观后感
  18. 一款客服系统有哪些必备的功能模块?
  19. 微信小程序毕业设计 基于微信校园跑腿小程序系统开题报告
  20. 可以完美在 wps中使用zotero的方法

热门文章

  1. MT8183核心板 MTK8183处理器规格参数
  2. MQ报错2009/2085解决方法
  3. 面对疫情过度惶恐,想自我调节,怎么办?
  4. Access 数据库防下载 for IIS 6.0
  5. 打造金融新生态、做一只落地利民的金融独角兽——犹太链(JEC)
  6. MySQL之jdbc以及shell链接
  7. 张家界计算机学院排名,张家界初中没读学人工智能机器人2021年专业排名
  8. android夏令时,android 对夏令时的处理
  9. Java基础——夯实基础
  10. pyecharts可视化神器使用与避坑指南