可等待定时器

科技工作者之家 2020-11-17

可等待定时器对象是Windows操作系统的一种同步对象,当设定的期限到了时,对象被置为signaled状态。

简介可创建两种可等待定时器对象:

手工重置(manual-reset):保持signaled状态直至调用SetWaitableTimer函数设置了新的期限。

同步(synchronization):保持signaled状态直至一个线程在该对象上完成了等待操作。

两种可等待定时器对象都可以是周期定时器(periodic timer)。周期定时器在每次周期到期时可重新激活,直至它被重置或者被取消。周期定时器或者是手工重置定时器或者是同步定时器。

当定时器变为signaled状态, 处理器须执行相关的指令(如completion routine)。高频率的定时器使得处理器处于繁忙状态,阻止其进入低能耗状态。考虑在程序中使用事件通知而不是定时器通知。如果必须使用定时器,考虑使用一次性定时器而不是周期定时器。或者设置周期定时器的间隔大于1秒钟。

线程使用CreateWaitableTimer或CreateWaitableTimerEx函数创建定时器对象,并指明是手工重置定时器还是同步定时器,还可指定定时器的名字. 其他进程中的线程可以指出定时器的名字,用OpenWaitableTimer函数打开一个已经存在的定时器。任何线程可以给出一个定时器的句柄,用等待函数(wait function)在该定时器对象上等待其状态变为signaled.

线程调用SetWaitableTimer函数来激活定时器,使用CancelWaitableTimer函数设置定时器为无效(inactive)状态。使用完定时器后,调用CloseHandle函数关闭它.

Windows操作系统对定时器对象的处理过程为:

当一个定时器被启动(set),定时器对象的状态为nonsignaled, 并被放在内核定时器队列中。

当一个定时器到期,定时器对象置为signaled状态。如果定时器有(绑定的)完成过程(completion routine), 该完成过程被放入启动该定时期的线程的异步过程调用(APC)队列,直至该线程进入可唤醒等待状态(alertable wait state)时操作系统按照异步过程调用方式执行该过程. 如果为周期定时器,它再次被放入内核定时器队列。

当一个定时器被取消,如果它处于等待期间,会从内核定时器队列中删除。如果定时器已经到期了并且在启动该定时期的线程有一个APC处于排队中,在线程APC队列中删除这个未执行的APC。 定时器的信号态(signaled state)不受影响。1

异步过程调用异步过程调用(asynchronous procedure call)是函数(过程)在特定线程中被异步执行。在Microsoft Windows操作系统中, APC是一种并发机制,用于异步IO或者定时器。

Windows NT操作系统中有3种APC:

内核模式特殊APC:相应的APC函数为内核函数。在IRQL=APC_LEVEL级上有可调度的活动时,执行此类APC。会抢先所有的用户模态以及IRQL = PASSIVE_LEVEL的内核模态下的代码的执行。

内核模式常规APC:在所有的内核模式特殊APC执行完毕后,内核模式常规APC在IRQL = PASSIVE_LEVEL下开始执行。会抢先所有的用户模式代码的执行。用于文件系统。

用户模式APC:是指相应的 APC 函数位于用户空间、在用户空间执行。线程处于alertable wait状态该APC才可以被调度执行。用户模式下调用系统API如SleepEx,SignalObjectAndWait,WaitForSingleObjectEx,WaitForMultipleObjectsEx,MsgWaitForMultipleObjectEx等,可以使线程进入alertable状态。这些API函数最终都是调用了内核中的KeWaitForSingleObject,KeWaitForMultipleObjects,KeWaitForMutexObject,KeDelayExecutionThread,KeTestAlertThread等函数。线程在alertable wait状态所有内核模式API执行完毕,返回用户模式时,内核转去执行APC,完成后再继续线程的原来执行。1

Windows操作系统Microsoft Windows是微软公司推出的一系列操作系统。它问世于1985年,起初是MS-DOS之下的桌面环境,其后续版本逐渐发展成为主要为个人电脑和服务器用户设计的操作系统,并最终获得了世界个人计算机操作系统的垄断地位。此操作系统可以在几种不同类型的平台上运行,如个人计算机(PC)、移动设备、服务器(Server)和嵌入式系统等等,其中在个人计算机的领域应用内最为普遍。在2004年国际数据信息公司一次有关未来发展趋势的会议上,副董事长Avneesh Saxena宣布Windows拥有终端操作系统大约70%的市场份额。

Windows操作系统目前最新的稳定版是于2015年7月29日发布的Windows 10。Windows Server目前最新的稳定版是2016年9月26日发布的Windows Server 2016。2

本词条内容贡献者为:

王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。