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

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

楼主#
更多 发布于:2005-01-26 19:30
在开线程以后,在线程函数中,调用KeSetPriority()来设置线程的优先级,这个优先级是不是就是指它的中断级?
按照DDK,系统线程的优先级应该是LOW_REALTIME_PRIORITY,这个是不是等于让这个线程运行在DISPATCH_LEVEL上呢?
这个线程除非自己将自己挂起(如调用KeWaitForSingleObject()),他将一直得到cpu时间,导致应用得不到cpu时间,是这样子吗??
能有高手比较一下在驱动中开线程和设置计时器各自的优缺点吗?
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2005-01-26 20:04
驱动中开的线程运行在PASSIVE_LEVEL
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2005-01-26 20:06
这个线程除非自己将自己挂起(如KeWaitForSingleObject()),他将一直得到cpu时间,导致应用得不到cpu时间,是这样子吗??


不是,线程进行切换要么是主动放弃比如KeWaitForSingleObject()),或者时间片用完,由调度器自动切换......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-26 21:25
在开线程以后,在线程函数中,调用KeSetPriority()来设置线程的优先级,这个优先级是不是就是指它的中断级?
不是,优先级和中断级不一样

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


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

能有高手比较一下在驱动中开线程和设置计时器各自的优缺点吗?
系统线成
简单的将,这个和应用程序使用时钟和线程非常相似
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-27 09:19
优先级和中断级是不同的概念。
中断级概念是针对内核而言的。
[b]万水千山总是情,回个帖子行不行?[/b]
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-27 10:00
谢谢各位大虾的讲解,我以前清楚中断级和优先级是两回事,不过看ddk的时候,kesetpriority()中的第二个参数low_real_time我一直以为系统是通过提高线程的中断级来实现高的优先级的。
我现在知道驱动中开的线程是运行在passive_level中断级了。只是拥有较高的优先级。
还有一个问题,就是驱动中计时器的DPC例程是否运行在dispatch_level中断级?
现在我在和下位机交互是这样子的:
我在驱动中开了一个计时器,每隔5ms计时器超时,然后在计时器的DPC例程中向下位机要一次数据,存储在驱动开的缓冲区中。同时当应用和驱动要数据的时候将从设备受到的数据传给它。
现在的问题是驱动和下位机要数据的速度很快,但是应用和驱动要数据的速度慢,我在softice的打印消息中发现基本要驱动向设备要十次数据以后应用才向驱动要一次数据,导致了驱动中开的缓冲区很快满了而不能和设备继续要数据。
是不是因为DPC例程的中断级在dispatch_level上导致了应用得不到cpu?
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-27 11:49
谢谢各位大虾的讲解,我以前清楚中断级和优先级是两回事,不过看ddk的时候,kesetpriority()中的第二个参数low_real_time我一直以为系统是通过提高线程的中断级来实现高的优先级的。
我现在知道驱动中开的线程是运行在passive_level中断级了。只是拥有较高的优先级。
还有一个问题,就是驱动中计时器的DPC例程是否运行在dispatch_level中断级?
现在我在和下位机交互是这样子的:
我在驱动中开了一个计时器,每隔5ms计时器超时,然后在计时器的DPC例程中向下位机要一次数据,存储在驱动开的缓冲区中。同时当应用和驱动要数据的时候将从设备受到的数据传给它。
现在的问题是驱动和下位机要数据的速度很快,但是应用和驱动要数据的速度慢,我在softice的打印消息中发现基本要驱动向设备要十次数据以后应用才向驱动要一次数据,导致了驱动中开的缓冲区很快满了而不能和设备继续要数据。
是不是因为DPC例程的中断级在dispatch_level上导致了应用得不到cpu?
 

DPC必须运行在dispatch_level,但是它要在计时器超时时才运行,一旦运行完毕,系统又会降低中断级,应用程序就会运行,如果你的DPC例程拖拖拉拉,很慢,5ms的时间被全部用光,肯定应用程序得不到CPU
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-27 16:06
在开线程以后,在线程函数中,调用KeSetPriority()来设置线程的优先级,这个优先级是不是就是指它的中断级?
不是,优先级和中断级不一样

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


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

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


开线程和设置计时器的方法的优缺点能帮我再解释一下吗??
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-27 16:58
简单的将,这个和应用程序使用时钟和线程非常相似

开线程和设置计时器的方法的优缺点能帮我再解释一下吗??

如果你能理解使用SetTimer这样的Api设置定时器和CreateThread创建的线成的不同,就可以理解这个

定时器是每x时间调度一次,而线程是一直run的,你可以这样写一个线程过程
//注意这里简单的写的App层的线程
DWORD ThreadProc(PVOID p)
{
   int    i ;

   while(1)
       i++ ;
}

这样这个线程就会进入死循环,也就是说它在x时间内可能多次被CPU调度(如果x比较大),当然时钟过程也可能被其它线程中断执行。
但在x之间中只调度了一次,如果你要处理非常紧急的事情,你可以使用线程来跟踪,而不使用定时器,因为它不会很精确。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
xiaorain
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2005-11-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-27 18:22
非常感激大家的关注!给分了:)
再稍带着问一下,驱动中开线程和计时器的区别,因为驱动中计时器DPC例程运行在dispatch_level上的,而开的线程运行在passive_level,只是优先级比较高罢了。
这样子的话,应该是开线程占用cpu少一些了,也可以省掉中断切换时间。


AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-01-27 21:40
非常感激大家的关注!给分了:)
再稍带着问一下,驱动中开线程和计时器的区别,因为驱动中计时器DPC例程运行在dispatch_level上的,而开的线程运行在passive_level,只是优先级比较高罢了。
这样子的话,应该是开线程占用cpu少一些了,也可以省掉中断切换时间。


 

DPC例程运行在dispatch_level上的,而开的线程运行在passive_level这个是正确的,
但占用CPU和这个无关,线程你可以自己通过其它方式调度,比如触发事件等等,而计时器是有专门的调度程序去处理,至于CPU使用率,执行系统的指令(包括循环次数)消耗的CPU是差不多的。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-01-28 09:30
非常感激大家的关注!给分了:)
再稍带着问一下,驱动中开线程和计时器的区别,因为驱动中计时器DPC例程运行在dispatch_level上的,而开的线程运行在passive_level,只是优先级比较高罢了。
这样子的话,应该是开线程占用cpu少一些了,也可以省掉中断切换时间。


 

因为驱动中计时器DPC例程运行在dispatch_level上的,但是它只是在计时器超时后,CPU才提升运行级运行它。开的线程虽然运行在passive_level,但只要CPU有空儿就可能会被调用
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
游客

返回顶部