购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.1 多线程的调度概述

操作系统调度如果反映到细颗粒度的线程上,实际上就是对多线程的调度。理解好系统调度的原理,对于认识多线程的调度是非常有帮助的。本节将由操作系统的调度入手简单介绍多线程的调度。

3.1.1 操作系统的调度原理

现在的操作系统绝大多数是支持多任务的,可以说每一个操作系统都有一定的调度原则,由内核来负责多个任务之间的处理切换。这里所说的多个任务间的切换,实际上是内核重新分配CPU时间片段到不同的任务。

如今的CPU的运算能力相比几十年前有了非常大的提升,而且能力非常强,其时钟频率(CIock Rate)非常高,单核能力一般能达到2~4GHz,即1秒就能运算数亿条指令。由于切换的过程是一瞬间的,而且每一个CPU时间片划分都非常短暂,因此一个任务的运行和切换一般在几十毫秒内就能完成,并且这几十毫秒内能处理上千万条指令。

由于系统调度的合理性,对于用户来说,使用计算机时一般感觉不到多个任务下的系统发生了任务间的切换,甚至觉得系统非常强大,能同时运行多个任务,满足自己多方面的需要,如边听歌、边查资料、边接收语音消息等。如果是多核多线程的CPU,其甚至能同时运行多个大型软件,如大型的设计工具、管理工具及大型游戏等,如图3.1所示。

图3.1 多核多线程的CPU运行多个大型软件

系统的调度的最小实体是线程,即系统调度中颗粒度最细的就是对线程的调度。实际上,一个应用软件能够同时让多线程协作运行,也正是系统调度在发挥着作用。

3.1.2 抢占式调度

线程的抢占式调度是指在多线程的情况下,系统要求各个线程都需要按照竞争抢占系统资源的方式来获得系统资源的使用权,例如,以竞争方式获取系统的一个CPU的时间片分配。由于时间片的划分一般都非常小,只有几十毫秒甚至几毫秒,因此对于人体的感知而言,这样的线程调度方式下的多线程就像是并行执行。但这样的调度方式能够让优先级高的线程更容易获得资源,所以优先级高的线程的执行效率会更有可能提高。抢占式调度如图3.2所示。

图3.2 抢占式调度

3.1.3 非抢占式调度

线程的非抢占式调度是指在多线程的情况下,系统对各个线程按照一定的排序方式分配系统资源,而且系统资源一旦分配到一个线程,就允许该线程使用资源直到完成了整个线程任务为止。这种调度方式适合简单而又大量的线程运算,能够快速地让线程完成当前的任务处理。但如果某一线程的运算大或存在逻辑缺陷导致资源无法释放,就会导致其他线程处于一直等待甚至出现死锁的问题。非抢占式调度如图3.3所示。

图3.3 非抢占式调度

3.1.4 多线程的上下文环境切换

阅读相关的技术文献时经常会出现“上下文”一词,上下文是计算机的专业术语,是对国外计算机文献常用词汇context的中文翻译。该词汇由字面上来看非常难理解,上下文,到底何为上,何为下,而文又是什么?对于初学者来说,“上下文”一词非常抽象,甚至查阅了许多资料和文献,也未能给出一个易于理解的概念。

虽然对context的中文替代词——上下文下定义和解释都非常抽象,但为了让读者多一个参考,笔者适当地给出一个解释,以说明context的中文翻译“上下文”一词的含义。

上下文是一种特定的计算机语境词,是特定环境的抽象化,其常用于命名程序代码中的某个全局变量或某作用域下的一种变量。该类变量能对某环境下的数据和配置进行管理,或者作为中间的重要环节,起到上层和下层内容的连接或交互,其可以贯穿某事物生命周期的上上下下、方方面面,所以称之为“上下文”。

如果觉得“上下文”一词太难意会,不妨将其扩展为另外几个词汇来帮助理解,如上下文环境、上下文容器、上下文信息(其中,“上下文环境”一词可以在多种场景下表达出context的含义,所以本书后面对context的中文翻译,将直接使用“上下文环境”替代“上下文”一词)。例如,一些企业级开发中经常用到的Spring框架的AppIicationContext就是一个上下文环境对象,它包含Spring项目的许多系统信息、对象信息和配置信息等,可以贯穿整个Spring项目,让用户可以方便得到。

同样,每一个线程都有自己的context,我们称之为线程的上下文环境。当在多线程的情况下,线程之间就可能会发生上下文环境切换。结合之前学习的线程的生命周期来看,在多线程的情况下,当其中一个线程由RUNNABLE状态转为BLOCKED、WAITING、TIMED_WAITING状态时,就会发生线程间的上下文环境切换。

我们可以给出这样的定义:线程的上下文环境切换是指在多线程的情况下,如果其中的一个线程进入了BLOCKED、WAITING及TIMED_WAITING状态,这时由另外的一个线程切换介入的过程就可以称为线程的上下文切换。 jXMOp6A5SffMnKVvTexaccwPTDdF7m7D2pEthXLSkezEOVWUV9J5ljynQsO6tR5O

点击中间区域
呼出菜单
上一章
目录
下一章
×