xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2139回复:11

驱动中开的线程运行在那个中断级上??

楼主#
更多 发布于:2005-01-26 19:30
在开线程以后,在线程函数中,调用KeSetPriority()来设置线程的优先级,这个优先级是不是就是指它的中断级?
按照DDK,系统线程的优先级应该是LOW_REALTIME_PRIORITY,这个是不是等于让这个线程运行在DISPATCH_LEVEL上呢?
这个线程除非自己将自己挂起(如调用KeWaitForSingleObject()),他将一直得到cpu时间,导致应用得不到cpu时间,是这样子吗??
能有高手比较一下在驱动中开线程和设置计时器各自的优缺点吗?
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-27 10:00
谢谢各位大虾的讲解,我以前清楚中断级和优先级是两回事,不过看ddk的时候,kesetpriority()中的第二个参数low_real_time我一直以为系统是通过提高线程的中断级来实现高的优先级的。
我现在知道驱动中开的线程是运行在passive_level中断级了。只是拥有较高的优先级。
还有一个问题,就是驱动中计时器的DPC例程是否运行在dispatch_level中断级?
现在我在和下位机交互是这样子的:
我在驱动中开了一个计时器,每隔5ms计时器超时,然后在计时器的DPC例程中向下位机要一次数据,存储在驱动开的缓冲区中。同时当应用和驱动要数据的时候将从设备受到的数据传给它。
现在的问题是驱动和下位机要数据的速度很快,但是应用和驱动要数据的速度慢,我在softice的打印消息中发现基本要驱动向设备要十次数据以后应用才向驱动要一次数据,导致了驱动中开的缓冲区很快满了而不能和设备继续要数据。
是不是因为DPC例程的中断级在dispatch_level上导致了应用得不到cpu?
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-27 16:06
在开线程以后,在线程函数中,调用KeSetPriority()来设置线程的优先级,这个优先级是不是就是指它的中断级?
不是,优先级和中断级不一样

按照DDK,系统线程的优先级应该是LOW_REALTIME_PRIORITY,这个是不是等于让这个线程运行在DISPATCH_LEVEL上呢?
不是,系统线程在PASSIVE_LEVEL中断级上运行,而优先级不一样。


这个线程除非自己将自己挂起(如调用KeWaitForSingleObject()),他将一直得到cpu时间,导致应用得不到cpu时间,是这样子吗??
不是,系统会调度,但会表现为系统很缓慢,因为系统线成优先级高,所以会更优先调度,但调度算法很多,按优先级调度只是其中一种,windows内部使用了包括优先级在内的多种方法,而这些实现细节在不同版本的windows中都可能有所不同

能有高手比较一下在驱动中开线程和设置计时器各自的优缺点吗?
系统线成
简单的将,这个和应用程序使用时钟和线程非常相似


开线程和设置计时器的方法的优缺点能帮我再解释一下吗??
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-27 18:22
非常感激大家的关注!给分了:)
再稍带着问一下,驱动中开线程和计时器的区别,因为驱动中计时器DPC例程运行在dispatch_level上的,而开的线程运行在passive_level,只是优先级比较高罢了。
这样子的话,应该是开线程占用cpu少一些了,也可以省掉中断切换时间。


游客

返回顶部