【Chapter2】进程、线程与作业,计算机操作系统教程,第四版,左万利,王英

文章目录

    • @[toc]
  • 一、多道程序设计
    • 1.1单道程序设计的缺点
    • 1.2多道程序设计的提出
    • 1.3多道程序设计存在的问题
  • 二、进程的引入
    • 2.1进程的概念
    • 2.2进程的组成
      • 2.2.1进程控制块
      • 2.2.2程序
    • 2.3进程的类型及特征
      • 2.3.1进程的类型
      • 2.3.2进程的特征
    • 2.4进程的状态及转换
      • 2.4.1进程的状态
        • 创建态
        • 就绪态
        • 阻塞态
        • 运行态
        • 终止态
      • 2.4.2进程的状态转换
      • 2.4.3进程的组织——链接方式
      • 2.4.4进程的组织——索引方式
    • 2.5进程控制
      • 2.5.1进程控制基本概念
      • 2.5.2进程控制相关的原语
        • 2.5.2.1创建原语
        • 2.5.2.2撤销原语
        • 2.5.2.3阻塞原语和唤醒原语(成对出现)
        • 2.5.2.5切换原语
    • 2.6进程间的相互联系与相互作用
      • 2.6.1进程间的相互联系
      • 2.6.2进程间的相互作用
    • 2.7 进程的创建、撤销
      • 2.7.1进程创建
      • 2.7.2进程撤销
    • 2.8UNIX进程的创建、撤销(待补充)
    • 2.9 进程与程序的联系和差别
      • 2.9.1.进程与程序的联系
      • 2.9.2.进程与程序的差别
  • 三、线程与轻线程
    • 3.1为什么要引入线程
    • 3.2线程的基本概念
    • 3.3线程的状态与切换
    • 3.4线程的组织与控制
      • 3.4.1线程控制块
      • 3.4.2线程的创建
      • 3.4.3线程的终止
    • 3.5线程的实现
      • 3.5.1用户级别线程(ULT)
      • 3.5.2内核级别线程(KLT)
      • 3.5.3混合线程
    • 3.6多线程模型
      • 3.6.1一对一模型
      • 3.6.2多对一模型
      • 3.6.3多对多模型
    • 3.7线程的应用
      • 3.7.1例一Word文字处理程序
      • 3.7.2例二Web 服务器的服务模式
  • 四、作业
    • 4.1作业相关概念
    • 4.2批处理作业
    • 4.3交互式作业
  • 五、系统举例(待补充)
    • 5.1 Java 线程
    • 5.2 Linux 进程与线程
    • 5.3 Windows 10 的进程、线程与纤程

一、多道程序设计

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多道程序设计(multi-progamming)是操作系统所采用的最基本、最重要的技术,其根本目的在于提高计算机系统的效率。

衡量系统效率的一个尺度就是吞吐量
吞吐量 = 作业道数 全部处理时间 吞吐量=\frac{作业道数}{全部处理时间} 吞吐量=全部处理时间作业道数
当系统中处理器等资源利用率高,则单位时间内完成的有效工作就高,继而吞吐量大。所以提高吞吐量应该从提高系统的资源利用率入手。

1.1单道程序设计的缺点

单道程序设计即 一次只允许一道程序进入系统的程序设计方法。

这显然有一个严重缺点——资源利用率极低:

  1. 设备资源利用率低。计算机系统配备了许多外围设备,如扫描仪、绘图仪、打印机、磁带、磁盘等,一道程序一般只能用到这些设备的子集,这样导致很多设备资源被浪费。
  2. 内存资源利用率低。现代内存容量较大,而一道程序的长度远远小于内存容量,因此内存浪费十分惊人。
  3. 处理器资源利用率低。程序大多要与外围设备打交道,这使得单道程序在进行外围设备的操作时,处理器空闲,这时处理器实际上是可以做其它工作的。

1.2多道程序设计的提出

为了应对上述缺点,人们提出多道程序设计的思想,即让多个程序同时进入系统并投入执行的一种程序设计方式。

这有很多好处:

  1. 设备资源利用率提高。如果允许若干个搭配合理的程序同时进入内存,这些程序分别使用不同的设备资源,则系统中的各种设备资源都会被用到并经常处于忙碌状态。
  2. 内存资源利用率提高。允许多道程序同时进入系统可以避免单道程序过短而内存空间过大所造成的存 储空间的浪费,从而提高内存资源的利用率。同时,进入系统的多个程序可以保存在内存的不同区域中。
  3. 处理器资源利用率提高。如果将两道程序同时放入内存,在一个程序 等待输入输出操作完成期间,处理器执行另一个程序,这样便可提高处理器的利用率。

1.3多道程序设计存在的问题

多道程序设计提高了系统资源利用率的同时也引入了一个新问题——资源竞争。多道程序设计必须协调好程序与资源之间的关系,在不发生混乱的情况下,使得各资源利用率提高。具体而言,要解决如下问题:

  1. 处理器资源管理问题。由于可运行程序的数量一般远远多于处理器的数量, 这就需要解决可运行程序与处理器资源竞争的问题,或者说,需要对处理器资源加以管理,实 现处理器资源在各个程序之间的分配和调度。
  2. 内存资源管理问题。为使多个程序在一个系统中共存,需要按某种原则对内存空间进行划分,并划分给程序。由于一个程序在内存中的实际存放位置在其装入系统之前无法确定,而且在程序运行 过程中地址还可能发生变化,因而程序只能使用相对地址,不能使用绝对地址。操作系统负责 存储空间的分配与管理,并在硬件的支持下将程序产生的逻辑地址映射到内存空间的物理地址 上,即实现程序的重定位。此外,还应防止内存中多道程序之间的相互干扰或者对操作系统的干扰,即不允许一个程序侵犯另一个程序的地址空间或操作系统空间。
  3. 设备资源管理问题。多个程序同时要求使用同一资源的情况经常发生,这就要求操作系统确定适当的分配策略,并对资源加以管理。

二、进程的引入

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.1进程的概念

**进程(Process)**这一概念最早于20世纪60年代初期被MIT的Multics系统和IBM公司的CTSS/360系统引入,虽然如今成为操作系统乃至并发程序设计中一非常重要的概念,但究竟什么是进程,目前尚无统一定义。

进程有许多解释但并非完全等价:

  1. 进程是程序的一次执行
  2. 进程是可以参与并发执行的程序
  3. 进程是程序与数据一道通过处理器执行时所发生的活动
  4. 所谓进程,就是一个程序在给定的空间和初始环境下,在一个处理器上执行的过程。

1978年,庐山召开的国内操作系统研讨会上给出的进程定义如下:

**进程(process)**是具有一定独立功能的程序关于一个数据集合的一次运行活动。

进程 VS 程序

程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。

进程(process):是动态的,是程序的一次执行过程。

2.2进程的组成

2.2.1进程控制块

打开任务管理器我们能看到进程的许多信息,操作系统作为进程的管理者自然要记录许多信息来区分这些i进程。

当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的“身份证号”——PID (Process ID,进程ID)。

操作系统要记录PID,进程所属用户ID(UID)。用于区分不同的进程、不同的用户。

还要记录给进程分配了哪些资源(如:分配了多少内存、正在使用哪些I/O设备、正在使用哪些文件)。可实现操作系统对于资源的管理。

还要记录进程的运行情况( 如:CPU使用时间、磁盘使用情况、网络流量使用情况等)。可用于实现操作系统对进程的控制、调度。

这些信息都被保存在一个数据结构PCB(Process Control Block)中,即进程控制块。操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中

对于不同的操作系统来说,进程控制块中信息的内容和数量不尽相同。 **一般来说,系统规模越大,功能越强,其进程控制块中信息的数量就越多。**一般操作系统的PCB中包含如下项目:

  1. 进程标识,通常为一个整数,称为PID,用于区分不同的进程。
  2. 用户标识,通常为一个整数,称为UID,用于区分不同的进程。
  3. 进程状态,“进程状态”在就绪、运行、等待之间动态变化。(进程状态后续会介绍)。
  4. 调度参数,用于确定下一个运行的进程。
  5. 现场信息,用于保存进程暂停的断点信息,包括通用寄存器、地址映射寄存器、PSW、PC。
  6. 家族联系,记载本进程的父进程。
  7. 程序地址,记载进程所对应程序的存储位置和所占存储空间大小,具体内容与存储管理方式有关。
  8. 当前打开文件,用于记载进程正在使用的文件,通过它与内存文件管理表目建立联系,通过该表可以找到保存在外存中 的文件。
  9. 消息队列指针,指向本进程从其他进程接收到的消息所构成消息队列的链头。
  10. 资源使用情况,记载该进程生存期间所使用的系统资源和使用时间,用于记账。
  11. 进程队列指针,用于构建进程控制块队列,它是系统管理进程所需要的。

2.2.2程序

如果说PCB是进程的”灵魂“,那么程序就是进程的”躯体“,包含代码数据两部分。进程的程序(代码和数据)被称为进程映像

代码即程序的代码(指令序列),现代操作系统都支持程序共享的功能,这就要求代码是“纯”的,即在运行期间不会修改自身。另外,在多道程序系统中,内存中同时存在多个程序,这些程序在内存中的存放位置是随机的,而且在运行过程中可能会发 生变化,因而代码必须能够浮动,即不采用绝对地址。

数据一般包括静态变量、动态堆、动态栈。堆用来保存动态变量,栈用来保存用户子程序相互调用时的参数、局部变量、返回值、断点等。数据一般是进程私用,当然有的系统也可以提供进程间的共享数据的功能,以实现进程间的信息交换。

代码和数据虽然属于进程空间,但是操作系统程序必须可以访问它,如进程执行输入输出操作的时候,通过系统调用进入系统,由操作系统将待输出的数据由进程空间取出并送给指定的外围设备。

进程控制块属于操作系统空间,而程序(代码和数据)是属于用户空间的!!!

进程是进程实体(PCB,数据,代码)的运行过程,是系统进行资源分配调度的一个独立单位。

2.3进程的类型及特征

2.3.1进程的类型

系统进程

这类进程属于操作系统的一部分,它们运行操作系统程序,完成操作系统 的某些功能,也被称为守护(daemon)进程

一个系统进程所完成的任务是相对独立和具体的, 而且在进程的生存周期内保持不变,因而它们通常对应一个无限循环程序,在系统启动后便一直存在,直到系统关闭。现代操作系统内设很多系统进程,完成不同的系统管理功能。系统进程运行于管态可以执行包括特权指令在内的所有机器指令。由于系统进程承担系统的管理和 维护性任务,它们的优先级别通常高于一般用户进程的优先级别

用户进程

这类进程运行用户程序,直接为用户服务

注意,所谓“用户程序”,不一定是用户自己编写的程序:例如用户在编译一个 C 程序时,他需要运行 C 语言的编译程序,该程序在目态运行,但并不是用户自己编写的。也就是说,在操作系统之上运行的所有应用程序都被称为 用户进程

2.3.2进程的特征

程序是静态的,进程是动态的,相比于程序,进程拥有如下特征:

  1. 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的
  2. 并发性:内存中有多个进程实体,各进程可并发执行
  3. 独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位
  4. 交互性。进程在运行过程中可能会与其他进程发生直接或间接的相互作用。
  5. 异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供"进程同步机制"来解决异步问题
  6. 结构性:每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成

2.4进程的状态及转换

2.4.1进程的状态

创建态

进程被创建的时候,它的状态时**”创建态“**,在这个阶段操作系统会为进程分配资源、初始化PCB。

就绪态

就绪(ready)态:进程本身具备运行条件,但是由于处理器的数量少于可运行进程的数量,暂未投入运行,即相当于等待处理器资源

阻塞态

也称为挂起(suspend)态、等待(wait)态、睡眠(sleep)态进程本身不具备运行条件,即使分给其处理器也不能运行。进程正在等待某一事件的发生,如等待某一资源被释放,等待与该进程相关的数据传输的完成信号等。

运行态

进程占有处理器资源,正在运行。显然,在单处理器系统中任一时刻 只能有一个进程处于此种状态

终止态

一个进程可以执行exit系统调用,请求操作系统终止该进程。此时该进程会进入**“终止态”**, 操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收该进程的PCB。

2.4.2进程的状态转换

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阻塞态->就绪态不是进程自身能控制的,是一种被动行为

运行态->阻塞态是一种进程自身做出的主动行为

注意:不能由阻塞态直接转换为运行态也不能由就绪态直接转换为阻塞态(因为进入阻塞态是进程主动请求的必然需要进程在运行时才能发出这种请求)

PCB中通常会有一个变量state来表示进程的当前状态。如:1表示创建态、2表示就绪态、3表示运行态……为了对同一个状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来。

2.4.3进程的组织——链接方式

链接方式是操作系统实现对进程的管理的最常用方式。

系统需要按照某种策略将进程组织成若干队列。由于进程控制块是进程的代表,因而进程队列实际上是由进程控制块构成的队列。

因为该队列通常是以链的形式实现的,所以也称为 PCB 链。该链既可以是单向的,也可以是双向的,依照使用方法而定。

如下图是单向PCB链的例子

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通常,系统中的进程队列分为以下 3 类:

  1. 就绪队列。一般整个系统中有一个就绪队列。所有处于就绪态的进程按照某种组织方式排在这一队列 中,进程入队列和出队列的次序与处理器调度算法有关。在某些系统中,就绪队列可能有多个用以对就绪进程进行分类,以方便某种调度策略的实施。
  2. **阻塞队列。**每个等待事件有一个等待队列。**当进程等待某一事件发生时,进入与该事件相关的等待队列中;当某事件发生时,与该事件有关的一个或多个进程离开相应的等待队列,进入就绪队列。
  3. 运行队列。在单处理器系统中只有一个运行队列,在多处理器系统中每个 CPU 各有一个运行队列,每 个队列中只有一个进程。指向运行队列头部的指针被称为运行指示字

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.4.4进程的组织——索引方式

操作系统给各种状态的进程建立相应的索引表,而索引表的表项又指向相应的PCB。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.5进程控制

2.5.1进程控制基本概念

进程控制就是要实现进程状态的转换

操作系统通过原语来实现进程控制。

原语是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成 ,不可中断

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么进程控制(状态转换)的过程需要一气呵成?

假设当前就绪队列和阻塞队列中有如下PCB

假设此时进程等待的时间发生,那么操作系统中,负责进程控制的内核程序至少要做两件事:

  1. 将PCB2的state设为1
  2. 将PCB2从阻塞队列放到就绪队列

但不幸的是,如果刚刚完成操作1,此时接收到了中断信号,那么PCB2的state变成了1,但是却没有离开阻塞队列进入就绪队列:

如何实现原语操作的“原子性”?

原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。可以用”关中断指令“和”开中断指令“这两个特权指令实现原子性。

CPU执行了关中断指令后,就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查。

这样,关中断、开中断之间的这些指令序列就是不可被中断的,这就实现了”原子性“。

2.5.2进程控制相关的原语

2.5.2.1创建原语

创建态->就绪态

  • 申请空白PCB
  • 为新进程分配所需资源
  • 初始化PCB
  • 将PCB插入到就绪队列

引起创建的事件

  • 用户登录。分时系统中,用户登录成功,系统会建立为其建立一个新的进程
  • 作业调度。多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
  • 提供服务。用户向操作系统提出某些请求时,会新建一一个进程处理该请求
  • 应用请求。由用户进程主动请求创建一个子进程
2.5.2.2撤销原语

就绪态/阻塞态/运行态->终止态->无

  • 从PCB集合中找到终止进程的PCB
  • 若进程正在运行,立刻剥夺CPU,将CPU分配给其他进程 。
  • 终止其所有子进程(进程间关系是树形结构 )
  • 将该进程拥有的所有资源归还给父进程或操作系统
  • 删除PCB

引起撤销的事件

  • 正常结束。进程自己请求终止(exit系统调用)
  • 异常结束 。整数除0、非法使用特权指令然后被操作系统强行杀掉等。
  • 外界干预。Ctrl+Alt+delete,用户选择杀死进程
2.5.2.3阻塞原语和唤醒原语(成对出现)

阻塞原语

运行态->阻塞态

  • 找到阻塞的进程对应的PCB
  • 保护进程运行现场,将PCB状态信息设置为”阻塞态“,暂时停止进程运行
  • 将PCB插入到相应事件的等待队列

引起阻塞的事件

  • 需要等待系统分配某种资源
  • 需要等待相互合作的其他进程完成工作

唤醒原语

阻塞态->就绪态

  • 在事件等待队列中找到PCB
  • 将PCB从等待队列中移除,设置进程为就绪态
  • 将PCB插入就绪队列,等待被调度

引起唤醒的事件

  • 等待的事件发生
2.5.2.5切换原语

运行态->就绪态 就绪态->运行态

  • 将运行环境信息(进程上下文,context)存入PCB
  • PCB移入相应队列
  • 选择另一个进程执行,并更新其PCB
  • 根据PCB恢复新进程所需的运行环境

引起进程切换的事件

  • 当前进程时间片先到
  • 有更高优先级的进程到达
  • 当前进程主动阻塞
  • 当前进程终止

无论是哪个进程控制原语,要做的无非三件事情:

  1. 更新PCB中的信息(修改进程状态,保存/恢复运行环境)
  2. 将PCB插入合适的队列
  3. 分配/回收资源

2.6进程间的相互联系与相互作用

多道程序系统中同时运行的并发进程一般有多个,在逻辑上,这些进程之间既可能存在某种联系,也可能相对独立。

2.6.1进程间的相互联系

相关进程

在逻辑上具有某种联系的进程称为相关进程。例如,进程 P0 在运行过程中 创建了两个子进程 P1和 P2,进程 P1所产生的输出作为进程 P2的输入,则 P1 和 P2是相关进程。此外,进程 P1和 P2与进程 P0之间存在“父子”关系,因而它们都是相关进程。一般来说,属 于同一进程家族内的所有进程都是相关的。

无关进程

在逻辑上没有任何联系的进程称为无关进程。例如,对于两个相互之间没有交往的用户来说,其进程是无关的。

2.6.2进程间的相互作用

直接相互作用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进程之间不需要通过媒介而发生的相互作用,这种相互作用通常是有意识的。例如,进程 P1将一个消息发送给进程 P2,进程 P1 的某一步骤 S1 需要在进程 P2 的某 一步骤 S2执行完毕之后才能继续等。直接相互作用只发生在相关进程之间。

间接相互作用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进程之间需要通过某种媒介而发生的相互作用,这种相互作用通常是无意识的。进程 P1欲使用打印机,该设备当前被另一进程 P2所占用,此时进程 P1只好 等待,以后进程 P2 用完并释放该设备时,将进程 P1 唤醒。间接相互作用可能发生在任意进程 之间。

2.7 进程的创建、撤销

除一些系统进程之外,用户进程都是通过系统调用来创建的。一般至少包 括两个相关的系统调用,一个用于创建进程,另一个用于撤销进程。这两种命令在不同系统中的实现各异。在 UNIX 系统中的命令格式如下。

2.7.1进程创建

pid = fork()

创建子进程所要完成的主要工作如下:

  • 建立一个进程控制块(PCB),并对其内容进行初始化:
    • 为该进程分配必要的存储空间
    • 加载所要执行的程序(在 UNIX 系统中需要通过另一个系统调 用 execl(prog, args) 实现)
    • 将进程控制块送入就绪队列

2.7.2进程撤销

exit(status) 

撤销进程所要完成的主要工作如下:

  1. 对进程进行善后处理(收集进程状态 信息、通知其父进程等)
  2. 收回进程占用资源(打开文件、内存等)
  3. 撤销PCB

对于地址越界,非法指令,来自用户或父进程的kill信号等原因也可能导致进程的非正常终止

除初始进程外,其它进程由(父)进程创建,并形成进程家族。

2.8UNIX进程的创建、撤销(待补充)

2.9 进程与程序的联系和差别

进程和程序是既有联系,又有差别的两个概念。

2.9.1.进程与程序的联系

程序是构成进程的组成部分之一,一个进程存在的目的就是执行其所对应的程序。如果没有程序,进程就失去了其存在的意义。

2.9.2.进程与程序的差别

  • 程序是静态的,而进程则是动态的。
  • 序可以写在纸上或在某种存储介质上长期保存,而进程具有生存周期,创建后存在, 撤销后消亡。
  • 一个程序可以对应多个进程,但是一个进程只能对应一个程序

三、线程与轻线程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.1为什么要引入线程

早期操作系统基于进程,一个进程中只包含一个执行流,进程是处理器调度的基本单位,当处理器由一个进程切换到另一个进程时,整个上下文都要发生变化,系统开销大,相关进程间的耦合度差。

3.2线程的基本概念

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线程(thread)又称轻进程(light weight process,LWP),是进程内一个相对独立的执行流

线程的属性

  1. 线程是一个轻型实体,它不拥有系统资源,但每个线程都应有一个唯一的标识符和一个线程控制块,线程控制块记录线程执行的寄存器和栈等现场状态。
  2. 不同的线程可以执行相同的程序,即同一个服务程序被不同的用户调用时,操作系统将它们创建成不同的线程。
  3. 同一进程中的各个线程共享该进程所拥有的资源。
  4. 线程是 CPU的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中各线程可交替地占用 CPU;在多 CPU 的计算机系统中,各线程可同时占用不同的 CPU,若各个 CPU 同时为一个进程内的各线程服务,则可缩短进程的处理时间。
  5. 一个线程被创建后,便开始了它的生命周期,直至终止。线程在生命周期内会经历阻塞态、就绪态和运行态等各种状态变化。

线程与进程的比较

  1. 调度。在传统的操作系统中,拥有资源和独立调度的基本单位都是进程,每次调度都要进行上下文切换,开销较大。在引入线程的操作系统中,线程是独立调度的基本单位,而线程切换的代价远低于进程。在同一进程中,线程的切换不会引起进程切换。但从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
  2. 并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且一个进程中的多个线程之间亦可并发执行,甚至不同进程中的线程也能并发执行,从而使操作系统具有更好的并发性,提高了系统资源的利用率和系统的吞吐量。
  3. 拥有资源。进程是系统中拥有资源的基本单位,而线程不拥有系统资源(仅有一点必不可少、能保证独立运行的资源),但线程可以访问其隶属进程的系统资源,这主要表现在属于同一进程的所有线程都具有相同的地址空间。要知道,若线程也是拥有资源的单位。则切换线程就需要较大的时空开销,线程这个概念的提出就没有意义。
  4. 独立性。每个进程都拥有独立的地址空间和资源,除了共享全局变量,不允许其他进程访问。某个进程中的线程对其他进程不可见。同一进程中的不同线程是为了提高并发性及进行相互之间的合作而创建的,它们共享进程的地址空间和资源
  5. 系统开销。在创建或撤销进程时,系统都要为之分配或回收进程控制块 PCB 及其他资源如内存空间、I/0 设备等。操作系统为此所付出的开销,明显大于创建或撤销线程时的开销。类似地,在进程切换时涉及进程上下文的切换,**而线程切换时只需保存和设置少量寄存器内容,开销很小。**此外,由于同一进程内的多个线程共享进程的地址空间,因此这些线程之间的同步与通信非常容易实现,甚至无须操作系统的干预。
  6. 支持多处理器系统。对于传统单线程进程,不管有多少个CPU,进程只能运行在一个 CPU上。对于多线程进程,可将进程中的多个线程分配到多个 CPU 上执行。

3.3线程的状态与切换

与进程一样,各线程之间也存在共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。相应的,线程在运行时也具有下面三种基本状态:

  1. 执行态:线程已获得CPU并正在运行
  2. 就绪态:线程已具备各种执行条件,只需获取CPU便可立即执行
  3. 阻塞态:线程在执行中因某事件受阻而处于暂停状态

线程这三种基本状态之间的转换和进程基本状态之间的转换是一样的。

3.4线程的组织与控制

3.4.1线程控制块

与进程相似,线程也是并发执行的,即时断时续的。为此需要一个类似于PCB的数据结构以保存现场等控制信息,这个控制结构称为线程控制块(thread control block,TCB)

线程控制块中内容一般较少。因有关资源分配等信息已经记录于所属进程的PCB中。线程控制块中主要信息一般包括:

  • 线程标识符,TID
  • 一组寄存器,包括PC,状态寄存器和通用寄存器
  • 线程运行状态,用于描述线程正处于何种状态
  • 优先级(和调度有关)
  • 线程专有存储区,线程切换时用于保存现场
  • 堆栈指针,用于过程调用时保存局部变量及返回地址等

3.4.2线程的创建

线程也是具有生命期的,它由创建而产生,由调度而执行,由终止而消亡。相应地,在操作系统中就有用于创建线程和终止线程的函数(或系统调用)。

用户程序启动时,通常仅有一个称为初始化线程的线程正在执行,其主要功能是用于创建新线程在创建新线程时,需要利用一个线程创建函数,并提供相应的参数,如指向线程主程序的入口指针、堆栈的大小、线程优先级等。线程创建函数执行完后,将返回一个线程标识符。

3.4.3线程的终止

当一个线程完成自己的任务后,或线程在运行中出现异常而要被强制终止时,由终止线程调用相应的函数执行终止操作。但是有些线程(主要是系统线程)一旦被建立,便一直运行而不会被终止。通常,线程被终止后并不立即释放它所占有的资源,只有当进程中的其他线程执行了分离函数后,被终止线程才与资源分离,此时的资源才能被其他线程利用。

被终止但尚未释放资源的线程仍可被其他线程调用,以使被终止线程重新恢复运行。

3.5线程的实现

3.5.1用户级别线程(ULT)

早期的线程都是用户级别线程(userlevelthread,ULT),由系统库支持(如:早期Unix只支持进程不支持线程。当时的“线程”是由线程库实现的。)。
线程的创建和撤销,以及线程状态的变化都由库函数控制并在目态完成。

  1. 用户级线程由应用程序通过线程库实现:所有的线程管理工作都由应用程序负责(包括线程切换)
  2. 用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。
  3. 在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。“用户级线程”就是“从用户视角看能看到的线程
  4. 对于用户级别线程,若同一进程中的多个线程中至少有一个处于运行态,则该进程的状态为运行态;若同一进程中的多个线程均不处于运行态,但是至少有一个线程处于就绪态,则该进程的状态为就绪态;若同一进程中的多个线程均处于等待态,则该进程的状态为等待态。

这种实现方式的优点如下:

  1. 线程切换不需要转换到内核空间,节省了模式切换的开销。
  2. 调度算法可以是进程专用的,不同的进程可根据自身的需要,对自己的线程选择不同的调度算法。
  3. 用户级线程的实现与操作系统平台无关,对线程管理的代码是属于用户程序的一部分。

这种实现方式的缺点如下:

  1. 系统调用的阻塞问题,当线程执行一个系统调用时,不仅该线程被阻塞,而且进程内的所有线程都被阻塞。
  2. 不能发挥多 CPU的优势,内核每次分配给一个进程的仅有一个 CPU,因此进程中仅有一个线程能执行。

3.5.2内核级别线程(KLT)

内核级别线程(Kernel Level Thread,KLT,又称“内核支持的线程”)。

  1. 内核级线程的管理工作操作系统内核完成。
  2. 线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
  3. 线程是CPU调度的基本单位,进程状态无意义。
  4. 操作系统会为每个内核级线程建立相应的TCB(Thread ControlBlock,线程控制块),通过TCB对线程进行管理。“内核级线程”就是“从操作系统内核视角看能看到的线程”

这种实现方式的优点如下:

  1. 能发挥多CPU的优势,内核能同时调度同一进程中的多个线程并行执行。
  2. 如果进程中的一个线程被阻塞,内核可以调度该进程中的其他线程占用 CPU,也可运行其他进程中的线程。
  3. 内核支持线程具有很小的数据结构和堆栈,线程切换比较快、开销小。
  4. 内核本身也可采用多线程技术,可以提高系统的执行速度和效率。

这种实现方式的缺点如下:

同一进程中的线程切换,需要从用户态转到核心态进行,系统开销较大。这是因为用户进程的线程在用户态运行,而线程调度和管理是在内核实现的。

3.5.3混合线程

Solaris中的进程被称为任务(task),为结合用户级别线程与核心级别线程的优点,Solaris系统采用混合线程(hybridthread)结构。关于线程有以下3种实体与之相对应。

  1. 用户级别线程(ULT):是用户程序并发或并行执行的基本单位,每个任务中至少包含一个 ULT,ULT对用户可见,对操作系统不可见;
  2. 核心级别线程(KLT):是操作系统调度执行的基本单位,对操作系统可见,对用户不可见KLT与处理器(可多个)之间可以是多对多关系,也可以是一对一关系(如专用处理器);
  3. 轻进程(LWP):对用户可见,对操作系统也可见,每个进程至少包含一个轻进程,用户级别线程与轻进程之间可以是一对一关系,也可以是多对多关系只有与轻进程动态绑定的用户级别线程能够与核心通信轻进程与核心级别线程之间具有一对一关系

如果任务中包含多个用户级别线程,但只含有一个轻进程,用户程序动态绑定用户级别线程与轻进程之间的关系,即哪个用户级别线程与轻进程绑定,则哪个用户级别线程可以运行。如果任务中每个用户级别线程都有一个轻进程与之绑定,则这些用户级别线程可以并行执行,即相当于核心级别线程。如果用户级别线程与轻进程具有多对多绑定关系,则对应更一般的线程控制结构,可见Solaris线程提供了非常灵活的线程控制模式。

3.6多线程模型

在同时支持用户级线程和内核级线程的系统中,由于用户级线程和内核级线程连接方式的不同,从而形成了下面三种不同的多线程模型。

3.6.1一对一模型

一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

3.6.2多对一模型

多个用户级线程映射到一个内核级线程且一个进程只被分配一个内核级线程。退化为了用户级线程。

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行

重点重点重点:
操作系统只“看得见”内核级线程,**因此只有内核级线程才是处理机分配的单位。**故此方案一个进程只能分配一个核心。

3.6.3多对多模型

n用户级线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程

特点:既克服了多对一模型并发度不高的缺点,又克服了一对一模型的一个用户进程占用太多内核级线程而开销太大的缺点。此外,还拥有上述两种模型各自的优点。

可以理解为:用户级线程是“代码逻辑”的载体,内核级线程是“运行机会”的载体

内核级线程中可以运行任意一个有映射关系的用户级线程代码,上图中只有两个内核级线程中正在运行的代码逻辑都阻塞时,这个进程才会阻塞。

3.7线程的应用

许多计算任务和信息处理任务在逻辑上涉及多个控制流,这些控制流具有内在的并发性。 **当其中一些控制流被阻塞时,另一些控制流仍可继续。**在没有线程支持的条件下,只能采用单进程或多进程模式。单进程不能表达多控制流,多进程开销大而且在无共享存储空间的条件下进程间的交互困难。采用多线程一方面可以提高应用程序的并行性,另一方面也使程序设计简洁、明晰。

3.7.1例一Word文字处理程序

该程序在运行时一方面需要接收用户输入的信息,另一 方面需要对文本进行词法检查,同时需要定时将修改结果保存到临时文件中以防意外事件发生。 易见,这个应用程序涉及 3 个相对独立的控制流,这 3 个控制流共享内存缓冲区中的文本信息。 以单进程或多进程模式都难以恰当地描述和处理这一问题,而同一进程中的 3 个线程是最恰当 的模型。

3.7.2例二Web 服务器的服务模式

一个 Web 服务器可以同时为许多 Web 用户服务,对应每个Web请求,Web 服务器将为其建立一个相对独立的控制流。若以进程模式实现,由于开销大将影响响应速度,以线程模式实现则更为便捷。对应每个 Web 请求,系统可以动态弹出(pop up)一个线程。为使响应速度更快,也可以事先将线程建立起来,当请求到来时选派一个服务线程。这些服务线程执行相同的程序,因而对应同一个进程。

通过以上分析可以归纳出引入多线程(multithread)程序设计的原因。

  1. 某些应用具有内在的多个控制流结构,这些控制流具有合作性质,需要共享内存。采用多线程易于对问题建模,从而得到最自然的解决算法。
  2. 在需要多控制流的应用中,多线程比多进程在速度上具有更大优势。统计测试结果表明,线程的建立速度比进程的建立速度快 100 倍,进程内线程间的切换速度与进程间的切换速 度也有数量级之差。
  3. **采用多线程可以提高处理器与设备之间的并行性。**在单控制流的情形下,启动设备的 进程进入核心后将被阻塞,此时该进程的其他代码也不能执行。若此时无其他可运行程序,处 理器将被闲置。多线程结构在一个线程等待时,其他线程可以继续执行,从而使设备和处理器 并行工作。
  4. 在有多个处理器的硬件环境中,多线程可以并行执行,既可提高资源利用效率,又可提高进程推进速度。

四、作业

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.1作业相关概念

用户要求计算机系统为其完成的计算任务的集合称为作业(job)

一般来说,作业是比进程还大的一个概念,一个作业通常包含多个计算步骤,作业中的一个相对独立的处理步骤称为一个作业步(job step)

作业步之间具有顺序或并发关系一个作业步通常可以由一个进程来完成,这样一个作业在内存处理时通常与多个进程相对应,即作业与进程之间具有一对多的关系。

4.2批处理作业

为实现对作业的管理,需要保持相关的信息,这些信息包括作业名称、作业状态、调度参 数、资源需求、相关进程、作业长度、在输入井与输出井中的存放位置、记账信息等,这些信息被保存在一个称为**作业控制块(job control block,JCB)**的数据结构中。

作业控制块是标志作业存在的数据结构,包含系统对作业进行管理所需要 的全部信息。

作业由**假脱机输入程序(SPOOL 输入程序)**控制进入输入井,经操作系统的作业调度程序选择进入内存,并为其建立作业控制进程。作业控制进程解释作业说明书的语句,根据作业步 的要求为其建立进程。

4.3交互式作业

对分时系统来说,**通常将分时用户的一次登录称为一个作业。**一次登录可以向系统提出多个请求,每个请求都可能对应一个进程,这样分时作业与进程之间也是一对多的关系。

为实现对分时用户的管理,系统设置一个口令文件,在 UNIX 系统中该文件保存在/etc/ passwd 中,可称为 passwd 文件。它一般包括注册用户的所有信息。

passwd 文件为系统文件,只有特权用户才能访问它,而一般用户不能访问它。这是系统保 护与安全的基本要求。

注册用户可以随时登录系统。登录成功后,系统为该用户创建一个服务进程。对于命令行 界面,该进程执行命令解释程序,读入终端命令并解释处理,处理过程可能调用操作系统,甚至可能创建子进程。UNIX 系统 shell(外壳)的工作原理如下图所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 UNIX 系统中以“&”为结束符的终端命令为后台命令,对于后台命令 shell 在输出进程号后便可给出提示符并读取下一个终端命令。这样的进程在后台运行,以后用户可以根据进程号检查后台进程的运行状况。容易看出,在分时系统中,对于一个终端用户,在内存中可以同 时有多个进程为其服务。考虑处理器是按进程(线程)分配的,不同终端实际获得 CPU 的时间一般是不同的。

五、系统举例(待补充)

5.1 Java 线程

5.2 Linux 进程与线程

5.3 Windows 10 的进程、线程与纤程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【对比golang和java的区别】

🌈个人主页:程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

【LeetCode: 330. 按要求补齐数组 + 贪心 + 构造区间】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Beans模块之工厂模块DisposableBean

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

【STM32嵌入式系统设计与开发】——12IWDG(独立看门狗应用)

这里写目录标题 一、任务描述二、任务实施1、ActiveBeep工程文件夹创建2、函数编辑(1)主函数编辑(2)USART1初始化函数(usart1_init())(3)USART数据发送函数( USART1_Send_Data(&…

2025中国跨境电商交易会(春季福州)

2025中国跨境电商交易会(春季福州) 时间:2025年3月18-20日 地点:福州海峡国际会展中心 预订以上展会详询陆先生 I38(前三位) I82I(中间四位) 9I72(后面四位&#x…

系统慢查询的思考

系统慢查询的思考 在一个系统中发现慢查询的功能或很卡的现象。你是怎么思考的?从哪几个方面去思考?会用什么工具? 一个系统使用了几年后都可能会出现这样的问题。原因可能有以下几点。 数据量的增加。系统中平时的使用中数据量是有一个累…

数据结构——优先级队列及多服务台模拟系统的实现

一、优先级队列的定义和存储 优先级队列定义:优先级高的元素在队头,优先级低的元素在队尾 基于普通线性表实现优先级队列,入队和出队中必有一个时间复杂度O(n),基于二叉树结构实现优先级队列,能够让入队和出队时间复杂度都为O(log…

正多边形拓扑与泛函

(原创:Daode3056) 也许,关于“拓扑”,“泛函”几本书上的内容与实例都是大同小异,总是那么点内容,数学要开拓一些新领域与新内容才能满足不断发展的社会与工业各种需要。本文就以人工智能生成对…

喜报!湖南创远荣获“2023年度中国有色金属工业科技进步奖”二等奖

近日,一则喜讯传来,湖南创远再创佳绩,联合中南大学、山西紫金合作的“智能矿山穿孔装备智能作业系统”项目荣获“中国有色金属工业科学技术奖二等奖”。 穿孔作业是传统非煤矿山开采的关键环节,穿孔效率、穿孔质量,直接…

nextjs+shadcn学习

1、安装nextjs 创建文件夹next-shadcn 在文件夹中执行 npx create-next-applatest . --typescript --tailwind --eslint安装后,跑起来 2、安装shadcn 在刚才目录下,运行命令 npx shadcn-uilatest init目录中会增加两个目录 components 和lib 替换原…

MySql实战--行锁功过:怎么减少行锁对性能的影响

在上一篇文章中,我跟你介绍了MySQL的全局锁和表级锁,今天我们就来讲讲MySQL的行锁。 MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁&#xf…

通天星CMSV6 车载定位监控平台 任意文件上传漏洞复现(XVE-2023-23454)

0x01 产品简介 通天星CMSV6车载定位监控平台拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队,专注于为定位、无线视频终端产品提供平台服务,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频综合平台。 0x02 漏洞概述 …

【Chiplet】技术总结

Chiplet基本知识点汇总 1. Wafer, die, chip, cell的区分2. MCM, SiP, SoC, Chiplet的区别4. Chiplets的先进封装5. Chiplet发展阶段 Chiplet基本知识点汇总 1. Wafer, die, chip, cell的区分 Wafer: 晶圆,指一整个晶圆硅片。 Die: 从晶圆上切分下来的小方格&a…

Vue3+.NET6前后端分离式管理后台实战(十)

1,Vue3.NET6前后端分离式管理后台实战(十)已经在订阅号发布有兴趣的可以关注一下! 感兴趣请关注订阅号谢谢! 代码已经上传gitee

C++--内联函数

当调用一个函数时,程序就会跳转到该函数,函数执行完毕后,程序又返回到原来调用该函数的位置的下一句。 函数的调用也需要花时间,C中对于功能简单、规模小、使用频繁的函数,可以将其设置为内联函数。 内联函数&#xff…

【SQL】1667. 修复表中的名字(UPPER()、LOWER()、SUBSTRING()、CONCAT())

前述 SQL中字符串截取函数(SUBSTRING) SQL 字母大小写转换函数UPPER()、UCASE()、LOWER()和LCASE() 题目描述 leetcode题目:1667. 修复表中的名字 Code select user_id, concat(upper(substring(name, 1, 1)),lower(substring(name, 2)) ) as name from Users o…

基于springboot+vue+Mysql的篮球论坛系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

K8S之Configmap的介绍和使用

Configmap Configmap概述Configmap的简介Configmap能解决的问题Configmap应用场景局限性 Configmap创建方法通过命令行直接创建通过文件创建指定目录创建编写Configmap资源清单Yaml文件 Configmap的使用案例通过环境变量引入:使用configMapKeyRef通过环境变量引入&a…

零刻sei12 windows10 限制cpu最高频率,降低cpu功耗,调整风扇转速

为什么要降低cpu功耗 虽然风扇声音本身不大,但是我想在自习室用电脑,突然的风扇声音还是会影响到他人. 由于迷你主机集成度比较高不太可能换散热器,所以只能降低cpu功耗. 我的系统 版本 Windows 10 IoT 企业版 LTSC 版本号 21H2 安装日期 ‎2023/‎12/‎18 操作系统…

数据分析之Tebleau 的度量名称和度量值

度量名称 包含所有的维度 度量值 包含所有的度量 度量名称包含上面所有的维度,度量值包含上面所有的度量 当同时创建两个或两个以上度量或维度时,会自动创建度量名称和度量值 拖入省份为行(这会是还没有值的) 可以直接将销售金额拖到数值这里 或者将销售…