我想知道是否有人可以简单地告诉我(我知道这不是一个简单的主题)内核计时器对象如何用于同步对内核中数据结构的访问?
编辑:
内核计时器对象是内核调度程序对象的一部分,它们是内核的同步对象组。我还想知道计时器对象是否是线程在能够继续之前必须等待才能获得句柄的东西,或者它是当计时器到期时线程等待获取句柄时触发的回调?
我希望这是有道理的。内核是我的新主题。
答案 0 :(得分:2)
简短回答:定时器对象不用于同步对内核中数据结构的访问。为此,NT内核具有快速互斥,保护互斥,推锁,互斥对象等等。我不太明白你的问题 - 你在谈论什么数据结构?不过,我将继续假设您想知道如何使用计时器对象。
有两种方法可以使用计时器对象。首先是在指定的到期时间后发出信号。因此,一个线程可能会使用KeWaitForSingleObject在一个计时器对象上等待,它只会在到期时间之后唤醒。您还可以为定时器使用定期信令 - 您可能希望每次线程被其唤醒时重置为非信号状态,并且每隔几秒钟发出一次信号。
第二种(不常见的)用法是定时器对象可以将APC插入到设置定时器的线程中。如果您不知道APC是什么 - 它是异步过程调用。如果线程执行alertable wait,插入的APC将中断等待并开始执行。当然APC使用起来很棘手,这就是为什么人们喜欢用线程池注册计时器对象,它负责处理回调(但那是另一个主题)。
答案 1 :(得分:1)
这是通过避免同时访问来同步的一种方法。访问基本上由序列化控制,序列化发生在通过回调调用的单个处理函数中,在这种情况下是定时器回调。请参阅this。
管理访问的目的是防止两个线程同时访问(读取或写入)对象。有几种机制可以实现这一目标:
答案 2 :(得分:1)
你必须以这种方式查看它:当你在等待计时器时,你在计时器到期时同步。在计时器指定的到期时间结束之前,您的线程将不会运行(取决于系统时间的粒度,通常为15.6 ms)。
通常,将定时器称为“同步对象”更多地与用于查找线程上的到期时间而不是对象本身的实际功能的API系列有关。
在内核模式中,通常使用DPC回调消耗定时器到期(请参阅KeSetTimer的DPC参数)。这只是一个异步调用,它发生在内核中的某个任意线程上下文中,您可以在其中运行代码(但它不能阻塞,获取锁定,访问可分页内存等)。后面的限制对于设备驱动程序来说并不是一个问题,设备驱动程序通常只是想定期触摸它们的设备。