微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

内核定时器对象和同步

我想知道是否有人可以简单地告诉我(我知道这不是一个简单的主题)如何使用内核计时器对象来同步访问内核中的数据结构?

编辑:

内核定时器对象是内核调度器对象的一部分,调度器对象是内核的同步对象组。 我也想知道定时器对象是线程在能够继续之前必须等待的句柄,还是定时器到期时触发的callback,线程等待处理?

我希望这是有道理的。 内核对我来说是一个新的课题。

如何从陷阱帧中抓取错误代码

Linux中用户空间地址的嵌套页面错误

内联assembly可以closures保护模式吗?

如何访问我的英特尔芯片组的特定registry?

编写新的系统调用时可用的function

如何重命名内核模块名称,而不重命名传递给insmod的.ko。

构buildLinux内核

linux / init.h:没有这样的文件或direcotry

如何在Linux上显示当前的磁盘IO队列长度?

定时Linux内核启动时间优化

简短回答:定时器对象不用于同步对内核中数据结构的访问。 为此,NT内核具有快速互斥锁,守护互斥锁,推锁,互斥对象等等。我不太了解你的问题 – 你在说什么数据结构? 不过,我会继续假设你想知道如何使用计时器对象。

有两种方法可以使用计时器对象。 首先是在指定的时间之后发出信号。 所以一个线程可能会使用KeWaitForSingleObject等待一个定时器对象,并且只会在到达时间之后才会唤醒。 您也可以使用定时器的定期信号 – 每当某个线程被唤醒时,您可能希望它重置为非信号状态,并每隔几秒钟发送一次信号。

第二种(不太常见的)用法是定时器对象可以将APC插入到设置定时器的线程中。 如果你不知道APC是什么 – 这是一个异步程序调用。 如果一个线程执行了一个可警告的等待 ,插入的APC将中断等待并开始执行。 当然,APC使用起来很麻烦,这就是为什么人们喜欢在线程池中注册定时器对象,并且负责处理回调(但这是另一个话题)。

这是通过避免同时访问来同步的一种方法。 访问主要是通过序列化来控制的,这个序列化发生在一个通过回调调用的处理函数中,在这种情况下是一个定时器回调。 看到这个

管理访问的重点是防止两个线程同时访问(读取或写入)对象。 有几个机制可以完成这个工作:

只有一个线程:争夺是不可能的,因为只有一个演员。

互斥体:操作系统机制与编码技术相结合,使得访问形式化,使得每一个线程说我想控制互斥体。 当授予控制权时,意味着在互斥体的所有者释放它之前,没有其他人可以访问关联的对象。

序列化:这与仅有一个线程类似。 一个典型的方案允许请求排队。 一旦更高优先级的请求完成,则处理您的请求。 在完成之前,不会处理对象的其他请求。

您必须以这种方式查看它:当您在等待计时器时,您将在计时器到期时进行同步 。 您的线程将不会运行,直到计时器指定的到期时间(以系统时间的粒度(通常为15.6毫秒)为准)。

一般来说,将计时器称为“同步对象”,更多的是与用于查找线程上的到期时间的API系列有关,而不是对象本身的实际功能

通常在内核模式下,定时器超时实际上是使用DPC回调消耗的(参见KeSetTimer的DPC参数)。 这只是一个异步的调用,发生在内核的某些任意线程上下文中,您可以运行代码(但不能阻塞,锁定,访问可分页的内存等)。 后面的限制对于设备驱动程序来说并不是问题,设备驱动程序主要是想定期触摸设备。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐