Windows线程调度机制

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Windows线程调度机制

线程是程序指令可被操作系统单独执行的最小单元,一个线程被包含在进程中,多线程可以存在于同一进程并分享进程的资源诸如内存等,然而进程却不可以。在一个单独的进程中,多线程由操作系统将时间片段化依次执行,这一过程之快以至于让用户认为多个任务的线程在同时执行,当然,线程确实可以同时进行考虑到每个进程同时执行单独的线程。

一. 线程与进程的不同

线程与传统的多任务进程的操作系统不同之处在于:

1.进程独立而线程作为进程的一部分

2.进程比线程包括更多的状态信息,然而一个进程中的多线程共享这些信息,内存以及其他资源。

3.进程有分离的地址空间,而线程共享他们的地址空间

4.进程只能通过系统提供的内部交流机制沟通

5.在同一进程中线程的环境变换快于进程

二. 多线程

多线程是一个广泛的编程和执行模型,它允许多线程在同一进程环境,这些线程共享进程的资源,但却能够独立的执行。线程的这一理念允许开发者对同时执行有了新的抽象。多线程也可被应用于单独的进程以便实现在多进程的操作系统上完成平行执行的任务。

多线程使得拥有多CPU的电脑系统可以运行更快,因为程序的线程可将自己借出实现同时执行。在这类情况下,程序需要注意避免冲突。为了使数据被正确使用,线程需经常约定次序以便数据被以正确的顺序处理。线程也可能需要相互的外部操作去避免共用的数据被同时修改或读取。类似的粗心错误将导致死锁。多线程的另一个即便是单CPU也能用得上的功能是有能力保持对外部输入保持响应。在单线程的程序中,如果主要的执行线程在长任务中死了,整个应用就都瘫痪了。但如果将这一任务移至一个与主线程同时执行的线程,那么这一应用就有可能对用户的输入做出反应。另一方面,在普遍情况下,多线程并不是解决程序响应的唯一出路。

操作系统用以下一或两种方式调度线程:

1.抢先多任务处理被普遍认为是最好的处理方式,它允许操作系统决定什么时候进行环境变换。但不足是抢先多任务处理可能在不合适的时间改变环境导致优先级翻转等一些不好的结果。

2.合作多任务处理依靠线程遇到断点自己放弃控制,这将在线程等待可用资源时出现问题。

直到90年代末,台式机的CPU仍然没有对多线程给予足够的支持,然而线程仍然被使用在这样的电脑上,因为线程之间的环境转换远快于进程上的环境转换,在嵌入式操作系统中的那些对实时行为有高要求的进程有可能通过减少线程转换的时间来支持多线程,这可能是通过为每个线程安排特定的注册表而非普通的注册表来实现。最终,在90年代末尾,被称作同时多线程,即多线程同时执行数条指令通过英特尔奔腾4处理器在台式机完成,

三. 内核线程和用户线程

内核线程是内核调度中“最轻”的单元。其建立和销毁都是由操作系统负责、通过系统调用完成。操作系统在调度时,参考各进程内的线程运行情况做出调度决定,如果一个进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU。如果多内核线程可以同时存在于同一个进程,并且它们分享共同的内存和文件资源,那么内核线程在操作系统的进程是抢先多任务处理时也是抢先多任务处理的。内核线程不拥有自己的资源除非是一个堆,即注册表的一份拷贝包括程序计数器和本地线程分配。内核可以安排一个线程去系统中的每一个逻辑层面的核(因为每个支持多线程的进程将自己分为多个逻辑层面的核,或者在它不支持多线程的情况下在每一个物理上的核只支持一个逻辑核的运行),然后可以去除那些已经死掉的线程。然而,内核线程比用户线程花费更多的时间

线程有时也被用在用户空间,这就叫做用户线程。内核并不知道它们,所以它们被在用户空间执行和调度。

四.并发和数据结构

由于同一进程中的各线程分享相同的地址,这就允许同时运行多条代码,当线程间的数据结构被共享时,即便最简单的数据结构,由于他们要求超过一条的CPU 指令去更新也可能倾向于竞争:两个线程可能最终由于同时企图更新数据却未意识到原始数据已被更改而终止。

为防止这类情况的发生,线程的API函数提供同步原语去锁住数据结构以防两个线程可以同时得到。在单处理机系统上,一个进入互斥体的线程必须等待并且触发一个环境改变。在多进程系统中,线程可以以自旋锁代替互斥体。

五.I/O和调度

用户线程实现通常完全在用户空间。其结果是,用户在同一进程中线程的环境切换是极其有效的,因为它可以通过在本地保存当前正在执行的用户线程所使用的CPU寄存器的环境切换,不要求在内核中的任何交互:然后由用户要执行的线程加载所需要的寄存器。由于调度发生在用户空间,调度策略可以更容易地根据程序的工作量的要求变化。然而,使用阻塞的系统调用在用户线程(而不是内核线程)可能会有问题。如果用户线程或光纤进行系统调用块,其他用户线程和纤维的过程中都无法运行,直到系统调用返回。

总结:Windows调度单位是线程而不是进程,采用严格的抢先式动态优先级调度,依据优先级和分配时间片来调度。每一个优先级的就绪进程排成一个先进先出队列,当一个线程状态变成就绪时,它可能立即运行或排到相应优先级队列的尾部,并且系统总运行优先级最高的就绪进程。Windows在内核中实现线程调度代码,采用完全的事件驱动机制,在被抢先前没有保证的运行时间。对于多处理机系统,Windows可以实现多个线程并行运行。

相关文档
最新文档