今天复习操作系统,觉着windows的线程调度策略应该写在一起,加上一个整体的认识比较好,就来写篇博客也当做复习笔记了,有些地方可能略显零散。
Windows 实现了一个由优先级驱动,抢占式的调度系统,调度过程结合实践配额调整,调度单位是线程。Windows 在单处理机系统和多处理机系统中的线程调度是不同的。
Windows采用多优先级队列,windows为每个优先级的线程都准备了优先级队列,同一优先级各线程按时间片轮转进行调度,多处理器可以多线程并行。
Windows的没有单独的调度模块或程序,调度的代码是在内核中实现的,广泛分布在内核中那些与调度相关的事件发生的地方。这些负责调度的程序被总称为“内核的调度器”。线程调度发生在DPC/Dispatch级别。
以下这些事件发生时会触发线程调度:
- 变成就绪状态的线程。例如:一个新创建的线程,或者从等待状态释放出来的线程。
- 因其时间片结束而离开运行状态的线程,它或者结束了,或者进入等待状态。
-
线程的优先级改变了,是因为系统调用,或者是Windows自己改变了优先级。
- 正在运行的线程的处理器亲合性改变了。
Windows内部使用32个优先级别,从0-31。这些数值被分成以下几类:
- [实时优先级]16个实时级别(16-31)
- [动态优先级]15个变化的级别(1-15) (一般交互式线程优先级最高)
- 1个系统级别(0), 被保留用作0页线程(零页线程:用于对系统中空闲物理页面清零)
需要注意的是Windows这里的实时优先级只是一种windows内部的命名(windows很多的命令和理论课或unix中的命名不同),并不是通常意义上的实时。
对于具备实时优先级的线程在被其他线程抢占时,具有实时优先级线程与具有可变优先级线程的行为是不同的,下面会介绍到。在应用程序中,用户可在一定范围内升高或降低线程优先级,但要把线程的优先级提升到实时优先级,用户必须有升高线程优先级的权限,如果用户进程在实时优先级运行时间过多,可能阻塞关键系统功能的执行,阻塞系统线程的运行。
在Win32 API中,每个线程的优先级都是它所属的进程的优先级和自己相关的线程优先级二者的组合。从Win32优先级映射到Windows内部数字式的优先级如图所示:
(转载自http://www.programfan.com/blog/article.asp?id=44350)
前面提到了一个概念叫做时间配额,时间配额不是一个时间长度值,而一个称为配额单位的整数。(每次从检查调度间的运行时间,很好理解,不多解释)多说一下,时间配额的作用就是可以在不提升优先级的情况下区分不同线程的运行时间,如果提升优先级来做可能导致一些线程饥饿。
调度方式有三种:
- 主动切换
- 抢占(当线程被抢占时,它被放回到相应的优先级就绪队列的队首;对实时优先级线程被抢占后分配一个完整的是时间配额,而动态优先级线程不变,下次仅运行剩余时间配额)
- 时间配额用完(没有同优先级线程会继续分配一个新的时间配额)
windows线程有优先级提升机制(总的来说是因为能更好利用CPU资源或饥饿而提高优先级):
- I/O操作完成
- 信号量或事件等待结束
- 前台进程中的线程完成一个等待操作
- 由于窗口活动而唤醒图形用户接口线程
-
线程处于就绪状态超过一定时间,但没能进入运行状态(处理机饥饿)
特别说明下饥饿状态下的优先级提升:
系统线程“平衡集管理器(balance set manager)” 会每秒钟检查一次就绪队列,是否存在一直在就绪队列中排队超过300个时钟中断间隔的线程。如果找到这样的线程,平衡集管理器将把该线程的优先级提升到15,并分配给它一个长度为正常值4倍的时间配额。一旦运行完重新回到原来的优先级。
以上都是对于单核情况,对于多核的情况下假如有N个处理器,则N-1个处理器上活跃的线程为最高优先级的线程N-1个,独占运行,剩下的低优先级线程会共享剩余的一个处理器。但这个原则又收到处理器关联属性的影响。如果一个线程准备执行,但是唯一可用的处理器不在它的处理器关联结合中,则该线程也只能被迫等待,执行体调度下一个可以得到的线程执行。
分享到:
相关推荐
在Windows操作系统中,线程调度和运行机制是内核的重要组成部分,对于系统的性能和响应速度有着深远影响。本文将深入探讨“漫谈兼容内核之二十二 Windows 线程的调度和运行”这一主题,主要关注Windows线程的创建、...
线程调度是多任务操作系统中的一个关键概念,它决定了如何在多个并发运行的线程之间分配CPU的时间片。线程调度的优先级是决定哪些线程应该先获得执行权的重要因素,尤其对于Java这样的多线程编程环境。下面将详细...
通过本实验,学生可以了解操作系统的线程调度机制,并掌握线程的创建、调度和管理等技术。同时,学生也可以学习使用 Processmonitor 软件工具来监控线程的活动图,并对线程的调度机制进行分析和讨论。 在实验报告的...
《Windows XP线程调度策略》 Windows XP操作系统采用线程调度策略来实现优先级驱动的抢先式多任务处理。在单处理器系统中,线程调度主要涉及四种情况:主动切换、抢先、时间配额用完以及线程运行结束。下面我们将...
Windows XP作为一款经典的桌面操作系统,在其内部实现上采用了许多高效的机制和技术,其中线程调度策略是保证系统响应性和多任务处理能力的关键因素之一。本文将深入探讨Windows XP线程调度策略的工作原理,包括主动...
Windows线程调度机制 Windows操作系统采用基于动态优先级的抢占式调度策略,具有以下特点: - **调度单位:** Windows以线程为调度单位。 - **优先级:** Windows内部分为32个优先级,其中16个为实时级别(16-31)...
#### 四、Windows线程调度机制 1. **调度方式**:Windows采用了抢占式的调度机制,这意味着即使一个线程正在运行,如果有更高优先级的线程就绪,那么当前线程会被暂停,而高优先级线程会被调度执行。 2. **优先级...
线程调度机制决定了系统对进程的执行顺序和优先级。 Windows XP 中的线程调度特征包括: * 多线程调度:系统可以同时对多个线程进行调度,以提高系统的并发性和性能。 * 优先级调度:系统可以根据线程的优先级来...
Windows消息机制是操作系统的核心组成部分,它是Windows应用程序之间以及应用程序与操作系统之间进行通信的主要方式。在Windows环境下,所有的用户界面交互,如键盘输入、鼠标点击、窗口移动等,都会被转换成特定的...
在Windows内核中,线程的系统空间堆栈的重要性还体现在它如何影响线程调度和执行。例如,当前CPU运行在系统空间时,特定的线程会成为“当前线程”,而系统空间堆栈的使用则表明了当前线程的状态。在进行线程切换时,...
在本示例程序中,我们将深入探讨Windows线程的概念、创建、同步以及管理。 首先,我们需要了解线程的生命周期。线程的生命周期包括创建、就绪、运行、等待、结束等几个阶段。在Windows API中,我们通常使用`...
线程调度由操作系统负责,根据线程优先级和资源需求来决定哪个线程应获取处理器资源。 在实际应用中,多线程处理可以用于各种场景,如下载和播放媒体文件的同时处理,或者在垃圾回收过程中,程序的其他部分仍能继续...
然而,随着项目规模的扩大,可能需要更高级的线程调度机制,例如支持抢占式调度、实时调度等特性。对于大型的、性能要求高的系统,可能需要利用更强大的线程库,如POSIX线程(pthread)或Windows的API。 总结起来,...
5. **线程调度**:了解Windows的调度策略,如优先级、时间片等,合理安排线程执行顺序。 6. **异常处理**:确保线程在发生异常时能够正确清理资源,避免资源泄漏。 通过封装这些概念和方法,开发者可以更容易地在...
由于线程调度的不确定性,可能导致一个线程读取到旧的账户状态,而另一个线程读取到新的状态,造成账户余额之和不为0,即数据混乱。为了防止这种情况,引入了线程同步机制。 实验要求2中,使用了Windows的互斥量...
6. **性能优化**:如果发现性能问题,可能需要根据Windows的特性调整线程调度或同步机制。 总之,Windows POSIX线程库(pthreads-w32)是Windows平台上实现跨平台多线程编程的重要工具,它使得Linux的pthreads代码...
在WINDOWS中的线程调度机制中,对于线程的管理和调度线程是这样的:在WINDOWS NT以后,WINDOWS实现了一个基于优先级的抢先式多处理器调度系统。调度系统总是运行优先级最高的就绪线程。 三、死锁 在WINDOWS操作...
Windows系统允许设置线程的优先级,以影响调度顺序。优先级越高,被调度的机会越大。但是过度依赖优先级可能导致优先级反转和死锁问题,因此应谨慎使用。 五、线程通信 线程间通信通常涉及数据共享和消息传递: 1. ...
6. **MultiThread8**:可能通过`Sleep`函数来演示线程调度和优先级的概念。 7. **MultiThread6**:可能涉及到线程的优先级设置,以及如何影响线程的执行顺序。 8. **MultiThread10**:可能是一个更复杂的例子,结合...
- **线程调度**:Windows内核根据线程的优先级和其他因素决定线程何时获得CPU时间片。 ##### 5. 线程的生命周期 - **创建**:通过调用CreateThread或其他创建线程的函数完成。 - **就绪**:线程已准备好运行,等待...