本文目录一览:
- 1、请问Windows NT线程调度的策略
- 2、为什么在windows XP下,优先级为NORMAL的线程不会高于IDLE的线程
- 3、线程的优先级如何调高,让多CPU核为一个线程服务?
- 4、解析windows线程调度策略
- 5、windows下线程什么优先级最高
请问Windows NT线程调度的策略
分类: 电脑/网络 程序设计 其他编程语言
问题描述:
各位高手帮帮忙啊,课上要求写的。
50分相送。
解析:
每个线程都有一个从0到31的优先级号码。系统优先观察优先级为31的线程,并以循环的方式对他们进行调度。只要优先级为31的线程是可调度的,系统就绝对不会将优先级为0到30的线程分配给cpu。
高优先级线程将抢在低优先级线程之前运行。如果一个优先级为5的线程正在运行,系统发现一个高优先级的线程准备要运行,那么系统就会立刻暂停低优先级县城的运行(即使它处于它的时间片中),并且将cpu分配给高优先级线程。-windowsxp线程优先级
以上文字出自《Windows 核心编程》by Jeffrey Richter,这只是Windows线程调度算法的两个(通过实验观测到的)特性,并不完整。
而下面这段话则是Microsoft的官方发言:
Microsoft没有将调度程序的行为特性完全固定下来
Microsoft没有让应用程序充分利用调度程序的特性
Microsoft的调度程序的算法是变化的,在编写代码时应该有所准备
简单来讲,您老师出的问题是没有办法回答的,除了Microsoft设计这一部分的工程师之外......
为什么在windows XP下,优先级为NORMAL的线程不会高于IDLE的线程
和双核有关系。当一个等待运行的线程在一段时间内没有运行起来(没有被分配时间片),Windows会临时提高这个线程的优先级,Windows的线程调度机制就是这样的。
printf也会导致线程进入等待,把时间交给其他线程。
输入输出、或者其他一些并不完全依靠cpu的操作上,一个高优先级的线程可能会进入等待状态,此时windows会调度其他线程上来运行。
线程的优先级如何调高,让多CPU核为一个线程服务?
1.
首先关闭现有的所有任务管理器;
2.
到开始菜单(Start)->运行(Run...),敲入
cmd,系统会弹出一个DOS命令窗口;
3.
在DOS命令窗口中敲入:
ntsd
-c
qd
taskmgr,系统会弹出一个新的任务管理器;
4.
在这个新弹出的任务管理器中,你应当可以改变优先级和服务核数目。
Windows
7
把附件中的ntsd.exe拷贝到系统盘windows\system32目录下即可。
附件:ntsd.exe
解析windows线程调度策略
1.主动切换
一个线程可能因为进入等待状态而主动放弃处理器的使用,此时Windows 2000/XP将选杼一个新线程开始运行。许多WIN32等待函数调用(如WaitForSingkObject或WaitFor-MultipkObjects等)都使线程等待某个对象,等待的对象可能有事件、互斥信号量、资源信号M、I/O操作、进程、线程、窗口消息等。如果进入等待线程的时间配额有剩余,在等待事件出现时,线程的时间配额被减1,相当于1/3个时钟间隔;如果线程的优先级大于等于14,在等待事件出现时,线程的优先级被重置。-windowsxp线程优先级
2.抢先
当一个高优先级线程的等待完成,即一个线程等待的事件出现,高优先级线程进入就绪状态,或者一个线程的优先级被增加或减少,出现正在处于运行状态的低优先级线程低于就绪队列中的某个线程时,系统都要确定是否让当前线程继续运行或当前线程是否要被一个高优先级线程抢先。在Windows 2000/XP中的用户态下运行的线程也可以抢先内核态下运行的线程。在判断一个线程是否被抢先时,并不考虑线程处于用户态还是内核态,调度器只是依据线程优先级进行判断。-windowsxp线程优先级
当线程被抢先时,它被放回相应优先级的就绪队列的队首。处于实时优先级的线程在被抢先时,时间配额被重置为一个完整的时间片;而处于动态优先级的线程在被抢先时,时间配额不变,重新得到处理器使用权后将运行到剩余的时间配额用完。-windowsxp线程优先级
3.时间配额用完
当一个处于运行状态的线程用完它的`时间配额时,Windows 2000/XP首先必须确定是否需要降低该线程的优先级,然后确定是否需要调度另一个线程进入运行状态。
如果刚用完时间配额的线程的优先级被降低了,Windows 2000/XP将寻找一个更适合的线程进入运行状态,所谓更适合的线程是指优先级高于刚用完时间配额的线程的新设S值的就绪线程。如果刚用完时间配额的线程的优先级没有降低,并且有其他优先级相同的就绪线程,Windows 2000/XP将选杼相同优先级的就绪队列中的下一个线程进入运行状态,刚用完时间配额的线程被排到就绪队列的队尾(即分配一个新的时间配额并把线程状态从运行状态改为就绪状态如果没有优先级相同的就绪线程可运行,刚用完时间配额的线程将得到一个新的时间配额并继续运行。-windowsxp线程优先级
4.线程运行结束
当线程完成运行时,它的状态从运行状态转到终止状态。此时系统将处理器调度给另一个线程。线程完成运行的原因可能是通过调用ExhThread而从主函数中返回或被其他线程通过调用TerminateThread来终止。如果处于终止状态的线程对象上没有未关闭的句柄,则该线程将被从进程的线程列表中删除,相关数据结构将被释放。-windowsxp线程优先级
windows下线程什么优先级最高
WINDOWS核心编程之线程的调度、优先级和亲缘性:
里面讲的很详细
每个线程都会被赋予一个从0(最低)到3 1(最高)的优先级号码。当系统确定将哪个线程分配给C P U时,它首先观察优先级为3 1的线程,并以循环方式对它们进行调度。如果优先级为3 1的线程可以调度,那么就将该线程赋予一个C P U。在该线程的时间片结束时,系统要查看是否还有另一个优先级为3 1的线程可以运行,如果有,它将允许该线程被赋予一个C P U。 -windowsxp线程优先级
只要优先级为3 1的线程是可调度的,系统就绝对不会将优先级为0到3 0的线程分配给C P U。这种情况称为渴求调度( s t a r v a t i o n)。当高优先级线程使用大量的C P U时间,从而使得低优先级线程无法运行时,便会出现渴求情况。在多处理器计算机上出现渴求情况的可能性要少得多,因为在这样的计算机上,优先级为3 1和优先级为3 0的线程能够同时运行。系统总是设法使C P U保持繁忙状态,只有当没有线程可以调度的时候, C P U才处于空闲状态。 -windowsxp线程优先级
人们可能认为,在这样的系统中,低优先级线程永远得不到机会运行。不过正像前面指出的那样,在任何一个时段内,系统中的大多数线程是不能调度的。例如,如果进程的主线程调用G e t M e s s a g e函数,而系统发现没有线程可以供它使用,那么系统就暂停进程的线程运行,释放该线程的剩余时间片,并且立即将C P U分配给另一个等待运行的线程。 -windowsxp线程优先级
如果没有为G e t M e s s a g e函数显示可供检索的消息,那么进程的线程将保持暂停状态,并且决不会被分配给C P U。但是,当消息被置于线程的队列中时,系统就知道该线程不应该再处于暂停状态。此时,如果没有更高优先级的线程需要运行,系统就将该线程分配给一个C P U。 -windowsxp线程优先级
现在考虑另一个问题。高优先级线程将抢在低优先级线程之前运行,不管低优先级线程正在运行什么。例如,如果一个优先级为5的线程正在运行,系统发现一个高优先级的线程准备要运行,那么系统就会立即暂停低优先级线程的运行(即使它处于它的时间片中),并且将C P U分配给高优先级线程,使它获得一个完整的时间片。 -windowsxp线程优先级
还有,当系统引导时,它会创建一个特殊的线程,称为0页线程。该线程被赋予优先级0,它是整个系统中唯一的一个在优先级0上运行的线程。当系统中没有任何线程需要执行操作时,0页线程负责将系统中的所有空闲R A M页面置0。-windowsxp线程优先级