阅读:2128回复:11
驱动中开的线程运行在那个中断级上??
在开线程以后,在线程函数中,调用KeSetPriority()来设置线程的优先级,这个优先级是不是就是指它的中断级?
按照DDK,系统线程的优先级应该是LOW_REALTIME_PRIORITY,这个是不是等于让这个线程运行在DISPATCH_LEVEL上呢? 这个线程除非自己将自己挂起(如调用KeWaitForSingleObject()),他将一直得到cpu时间,导致应用得不到cpu时间,是这样子吗?? 能有高手比较一下在驱动中开线程和设置计时器各自的优缺点吗? |
|
沙发#
发布于:2005-01-26 20:04
驱动中开的线程运行在PASSIVE_LEVEL
|
|
|
板凳#
发布于:2005-01-26 20:06
这个线程除非自己将自己挂起(如KeWaitForSingleObject()),他将一直得到cpu时间,导致应用得不到cpu时间,是这样子吗??
不是,线程进行切换要么是主动放弃比如KeWaitForSingleObject()),或者时间片用完,由调度器自动切换...... |
|
|
地板#
发布于:2005-01-26 21:25
在开线程以后,在线程函数中,调用KeSetPriority()来设置线程的优先级,这个优先级是不是就是指它的中断级?
不是,优先级和中断级不一样 按照DDK,系统线程的优先级应该是LOW_REALTIME_PRIORITY,这个是不是等于让这个线程运行在DISPATCH_LEVEL上呢? 不是,系统线程在PASSIVE_LEVEL中断级上运行,而优先级不一样。 这个线程除非自己将自己挂起(如调用KeWaitForSingleObject()),他将一直得到cpu时间,导致应用得不到cpu时间,是这样子吗?? 不是,系统会调度,但会表现为系统很缓慢,因为系统线成优先级高,所以会更优先调度,但调度算法很多,按优先级调度只是其中一种,windows内部使用了包括优先级在内的多种方法,而这些实现细节在不同版本的windows中都可能有所不同 能有高手比较一下在驱动中开线程和设置计时器各自的优缺点吗? 系统线成 简单的将,这个和应用程序使用时钟和线程非常相似 |
|
|
地下室#
发布于:2005-01-27 09:19
优先级和中断级是不同的概念。
中断级概念是针对内核而言的。 |
|
|
5楼#
发布于:2005-01-27 10:00
谢谢各位大虾的讲解,我以前清楚中断级和优先级是两回事,不过看ddk的时候,kesetpriority()中的第二个参数low_real_time我一直以为系统是通过提高线程的中断级来实现高的优先级的。
我现在知道驱动中开的线程是运行在passive_level中断级了。只是拥有较高的优先级。 还有一个问题,就是驱动中计时器的DPC例程是否运行在dispatch_level中断级? 现在我在和下位机交互是这样子的: 我在驱动中开了一个计时器,每隔5ms计时器超时,然后在计时器的DPC例程中向下位机要一次数据,存储在驱动开的缓冲区中。同时当应用和驱动要数据的时候将从设备受到的数据传给它。 现在的问题是驱动和下位机要数据的速度很快,但是应用和驱动要数据的速度慢,我在softice的打印消息中发现基本要驱动向设备要十次数据以后应用才向驱动要一次数据,导致了驱动中开的缓冲区很快满了而不能和设备继续要数据。 是不是因为DPC例程的中断级在dispatch_level上导致了应用得不到cpu? |
|
6楼#
发布于:2005-01-27 11:49
谢谢各位大虾的讲解,我以前清楚中断级和优先级是两回事,不过看ddk的时候,kesetpriority()中的第二个参数low_real_time我一直以为系统是通过提高线程的中断级来实现高的优先级的。 DPC必须运行在dispatch_level,但是它要在计时器超时时才运行,一旦运行完毕,系统又会降低中断级,应用程序就会运行,如果你的DPC例程拖拖拉拉,很慢,5ms的时间被全部用光,肯定应用程序得不到CPU |
|
|
7楼#
发布于:2005-01-27 16:06
在开线程以后,在线程函数中,调用KeSetPriority()来设置线程的优先级,这个优先级是不是就是指它的中断级? 开线程和设置计时器的方法的优缺点能帮我再解释一下吗?? |
|
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之间中只调度了一次,如果你要处理非常紧急的事情,你可以使用线程来跟踪,而不使用定时器,因为它不会很精确。 |
|
|
9楼#
发布于:2005-01-27 18:22
非常感激大家的关注!给分了:)
再稍带着问一下,驱动中开线程和计时器的区别,因为驱动中计时器DPC例程运行在dispatch_level上的,而开的线程运行在passive_level,只是优先级比较高罢了。 这样子的话,应该是开线程占用cpu少一些了,也可以省掉中断切换时间。 |
|
10楼#
发布于:2005-01-27 21:40
非常感激大家的关注!给分了:) DPC例程运行在dispatch_level上的,而开的线程运行在passive_level这个是正确的, 但占用CPU和这个无关,线程你可以自己通过其它方式调度,比如触发事件等等,而计时器是有专门的调度程序去处理,至于CPU使用率,执行系统的指令(包括循环次数)消耗的CPU是差不多的。 |
|
|
11楼#
发布于:2005-01-28 09:30
非常感激大家的关注!给分了:) 因为驱动中计时器DPC例程运行在dispatch_level上的,但是它只是在计时器超时后,CPU才提升运行级运行它。开的线程虽然运行在passive_level,但只要CPU有空儿就可能会被调用 |
|
|