主动切换 一个线程可能因为进入等待状态而主动放弃处理器的使用此时Windows /XP将选杼一个新线程开始运行许多WIN等待函数调用(如WaitForSingkObject或WaitFor MultipkObjects等)都使线程等待某个对象等待的对象可能有事件互斥信号量资源信号MI/O操作进程线程窗口消息等如果进入等待线程的时间配额有剩余在等待事件出现时线程的时间配额被减相当于/个时钟间隔;如果线程的优先级大于等于在等待事件出现时线程的优先级被重置 抢先 当一个高优先级线程的等待完成即一个线程等待的事件出现高优先级线程进入就绪状态或者一个线程的优先级被增加或减少出现正在处于运行状态的低优先级线程低于就绪队列中的某个线程时系统都要确定是否让当前线程继续运行或当前线程是否要被一个高优先级线程抢先在Windows /XP中的用户态下运行的线程也可以抢先内核态下运行的线程在判断一个线程是否被抢先时并不考虑线程处于用户态还是内核态调度器只是依据线程优先级进行判断 当线程被抢先时它被放回相应优先级的就绪队列的队首处于实时优先级的线程在被抢先时时间配额被重置为一个完整的时间片;而处于动态优先级的线程在被抢先时时间配额不变重新得到处理器使用权后将运行到剩余的时间配额用完 时间配额用完 当一个处于运行状态的线程用完它的时间配额时Windows /XP首先必须确定是否需要降低该线程的优先级然后确定是否需要调度另一个线程进入运行状态 如果刚用完时间配额的线程的优先级被降低了Windows /XP将寻找一个更适合的线程进入运行状态所谓更适合的线程是指优先级高于刚用完时间配额的线程的新设S值的就绪线程如果刚用完时间配额的线程的优先级没有降低并且有其他优先级相同的就绪线程Windows /XP将选杼相同优先级的就绪队列中的下一个线程进入运行状态刚用完时间配额的线程被排到就绪队列的队尾(即分配一个新的时间配额并把线程状态从运行状态改为就绪状态如果没有优先级相同的就绪线程可运行刚用完时间配额的线程将得到一个新的时间配额并继续运行 线程运行结束 当线程完成运行时它的状态从运行状态转到终止状态此时系统将处理器调度给另一个线程线程完成运行的原因可能是通过调用ExhThread而从主函数中返回或被其他线程通过调用TerminateThread来终止如果处于终止状态的线程对象上没有未关闭的句柄则该线程将被从进程的线程列表中删除相关数据结构将被释放 |