第二章(1) 进程与线程

一、进程的概念、组成和特征

1.1 进程的概念

程序:是静态的,就是个存放在磁盘里的可执行文件,如:QQ.exe

进程:是动态的,是程序的一次执行过程,
如:可同时启动多次QQ程序,同一程序多次执行会对应多个进程
进程实体相当于给进程拍了一次快照

1.2 进程的组成

进程实体由PCB程序段数据段构成,其中PCB是给操作系统用的程序段和数据段是给进程自己用的
引入进程实体的概念后,可把进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
PCB、程序段和数据段都在内存中
PCB是进程存在的唯一标志
每个进程的PCB都是存在于所有进程共享的内核空间中,操作系统管理进程也就是在内核空间中管理的。

1.2.1 进程控制块PCB

PCB是进程存在的唯一标志,当进程被创建时,操作系统为其创建PCB,当进程结束时,会回收其PCB。
操作系统对进程进行管理工作所需的信息都存在PCB中
在这里插入图片描述
进程描述信息进程标识符:标志各个进程,每个进程都有唯一的标识号。用户标识符:进程归属的用户,用户标识符主要为共享和保护服务。
进程控制和管理信息。进程当前状态:描述进程的状态信息,作为处理机分配调度的依据。进程优先级:描述进程抢占处理机的优先级,优先级高的进程可优先获得处理机。
资源分配清单。用于说明有关内存地址空间或虚拟地址空间的状况,所打开的文件的列表和所使用的输入/输出设备信息。
处理机相关信息,也称处理机的上下文,主要指处理机中各寄存器的值。当进程处于执行状态时,处理机的许多信息都在寄存器中。当进程被切换时,处理机状态信息都必须保存在相应的PCB中,以便在该进程重新执行时,能从断点继续执行。

1.2.2 程序段

程序段就是能被进程调度程序调度到CPU执行的程序代码段。注意,程序段可被多个进程共享,即多个进程可以运行同一个程序。

1.2.3 数据段

一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。

1.3 进程的特征

在这里插入图片描述
动态性:进程是程序的一次执行过程
并发性:内存中有多个进程实体,各进程可并发执行
独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位
异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题
小结:
在这里插入图片描述

二、进程的状态与转换

进程正在被创建时,它的状态是“创建态”,在这个阶段操作系统会为进程分配资源、初始化PCB
当进程创建完成后,便进入“就绪态”,处于就绪态的进程已经具备运行条件,但由于没有空闲CPU,就暂时不能运行,处于就绪状态的进程可能有多个,通常将它们排成一个就绪队列。
如果一个进程此时在CPU上运行,那么这个进程处于“运行态”。CPU会执行该进程对应的程序(执行指令序列)
阻塞态:又称等待态。进程在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。系统通常将处于阻塞态的进程也排成一个队列,甚至根据阻塞原因的不同,设置多个阻塞队列。
终止态:又称结束态。进程正从系统中消失,可能是进程正常结束或其他原因退出运行。进程需要结束运行时,系统首先将该进程置为终止态,然后进一步处理资源释放和回收等工作。
在这里插入图片描述
就绪态–>运行态:处于就绪态的进程被调度后,获得处理机资源(分派处理机时间片),于是进程由就绪态转换为运行态。
运行态–>就绪态:处于运行态的进程在时间片用完后,不得不让出处理机,从而进程由运行态转换为就绪态。此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程序将正在执行的进程转换为就绪态,让更高优先级的进程执行。
运行态–>阻塞态:进程请求某一 资源(如外设)的使用和分配或等待某一事件的发生 (如I/O操作的完成)时,它就从运行态转换为阻塞态。进程以系统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式。
阻塞态–>就绪态:进程等待的事件到来时,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞态转换为就绪态。
注:一个进程从运行态变成阻塞态是主动行为,而从阻塞态变为就绪态是被动的行为

三、进程控制

什么是进程控制?
进程控制就是要实现进程状态转换
如何实现进程控制?
原语实现
原语是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成,不可中断
为什么进程控制(状态转换)的过程要具有原子性?
如果不能“一气呵成”,就有可能导致操作系统中的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作
在这里插入图片描述

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

进程控制相关的原语

在这里插入图片描述
在这里插入图片描述
允许一个进程创建另一个进程,此时创建者称为父进程,被创建者称为子进程。子进程可以继承父进程所拥有的资源。当子进程被撤销时,应将从其父进程那里获得的资源归还给父进程。此外,在撤销父进程时,通常也会同时撤销其所有的子进程。
在这里插入图片描述
注意:阻塞原语和唤醒原语是一对作用刚好相反的原语,必须成对使用
在这里插入图片描述
在这里插入图片描述

四、进程的通信

进程通信是指进程之间的信息交换。PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方式主要有共享存储消息传递管道通信
为什么进程通信需要操作系统支持?
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。为了保证安全,一个进程不能直接访问另 进程P地址空间 一个进程的地址空间

4.1 共享存储

在这里插入图片描述
为避免出错,各个进程对共享空间的访问应该是互斥的。这里的互斥应该是只要遵守读者写者问题就行了
在这里插入图片描述

4.2 消息传递

进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
在这里插入图片描述

4.2.1 直接通信方式过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
仔细看以上三幅图

4.2.2 间接通信方式过程

间接通信方式,以“信箱”作为中间实体进行消息传递。
通过系统调用申请信箱,可以申请多个信箱
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3 管道通信

在这里插入图片描述
管道也是某个进程通过系统调用的方式向操作系统申请一个管道
“管道”是一个特殊的共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的内存缓冲区
这个大小固定的内存缓冲区本质上是一个循环队列
写进程以字符流的形式往管道文件写入数据,读进程则以字符流的形式从管道文件读出数据
管道通信要求数据的读写是FIFO

  1. 一个管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
  2. 各进程要互斥地访问管道(由操作系统实现)
  3. 管道写满时,写进程将阻塞,直到读进程将管道中的数据取走,即可唤醒写进程。
  4. 管道读空时,读进程将阻塞,直到写进程往管道中写入数据,即可唤醒读进程。
  5. 管道中的数据一旦被读出,就彻底消失。因此,当多个进程读同一个管道时,可能会错乱。对此,通常有两种解决方案:①一个管道允许多个写进程,一个读进程2014年408真题高教社官方答案);②允许有多个写进程多个读进程,但系统会让各个读进程轮流从管道中读数据(Linux 的方案)。
    小结
    在这里插入图片描述

五、线程的概念

5.1 线程的引入

如果说,在OS中引入进程的目的是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量,那么,在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
在没有引入线程时,进程有两个基本属性:
①进程是一个可拥有资源的独立单位,一个进程要能独立运行,它必须拥有一定的资源。
②进程同时又是一个可独立调度和分派的基本单元。
为了能使多个程序更好地并发执行,同时又尽量减少系统的开销,有不少研究操作系统的学者们想到,要设法将进程的上述两个属性分开,由OS分开处理,**即并不把作为调度和分派的基本单位同时作为拥有资源的单位,以做到“轻装上阵”;而对于拥有资源的基本单位,又不对之施以频繁的切换。**正是在这种思想的指导下,形成了线程的概念。

线程是一个基本的CPU执行单元,也是程序执行流的最小单位。

5.2 引入线程机制后的变化

在这里插入图片描述
1、在资源分配上:
引入线程前:进程是资源分配处理机调度的基本单位
引入线程后:进程是资源分配的基本单位,线程是处理机调度的基本单位
2、在并发性上:
引入线程前:只能进程间并发
引入线程后:线程间也能并发,提高了并发度
3、在系统开销上:
引入线程前:进程间并发,需要切换进程的运行环境,系统开销很大
引入线程后:线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小

5.3 线程的属性

在这里插入图片描述
线程本身并不拥有系统资源,仅有一点在运行中必不可少的资源。但它可与同属一个进程的其他线程共享进程所拥有的全部资源

5.4 线程的实现方式

5.4.1 用户级线程

在这里插入图片描述
用户级线程中,线程切换在用户态下完成,无需操作系统干预。
在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。“用户级线程”就是“从用户视角看能看到的线程”
一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。

5.4.2 内核级线程

在这里插入图片描述
线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
“内核级线程”就是“从操作系统内核视角看能看到的线程
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

5.4.3 组合方式

有些OS把用户级线程和内核级线程进行组合,形成了三种不同的模型:多对一模型一对一模型多对多模型

5.4.3.1 多对一模型

在这里插入图片描述
操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。

5.4.3.2 一对一模型

在这里插入图片描述

5.4.3.3 多对多模型

在这里插入图片描述
n 用户及线程映射到 m 个内核级线程(n >= m)

5.5 线程的状态转换和组织控制

5.5.1 线程的状态与转换

在这里插入图片描述

5.5.2 线程的组织与控制

在这里插入图片描述
(线程可以由所归属的进程组织,也可以由系统统一组织)

六、处理机调度

6.1 调度的概念与层次

6.1.1 调度的概念

在多道程序系统中,进程数量往往多于处理机个数,因此争用处理机的情况在所难免。处理机的调度是对处理机进行分配,即从就绪队列中按照一定的算法选择一个进程将处理机分配给它运行。

6.1.2 调度的层次

6.1.2.1 高级调度(作业调度)

在这里插入图片描述

按一定的原则从外存的作业后备队列中挑选一个作业调入内存并创建进程。每个作业只调入一次,调出一次。作业调入时会建立PCB,调出时才撤销PCB。

6.1.2.2 低级调度(进程调度)

在这里插入图片描述

按照某种策略从就绪队列中选取一个进程,将处理机分配给它。
进程调度是最基本的,不可或缺

6.1.2.3 中级调度(内存调度)

在这里插入图片描述
按照某种策略决定将哪个处于挂起状态的进程重新调入内存。
引入中级调度目的:提高内存利用率和系统吞吐量
在三种调度中,运行频率:进程调度>内存调度>作业调度
在这里插入图片描述
注意“挂起”和“阻塞”的区别,两种状态都是暂时不能获得CPU的服务,但挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中。

6.1.2.4 三层调度的对比

在这里插入图片描述
看这三个调度的方向都是单向的
高级调度面向作业
中级调度面向进程

6.2 调度的实现

6.2.1 调度程序(调度器)

在操作系统中,用于调度和分配CPU的组件叫调度程序,调度程序由三部分组成:排队器分派器上下文切换器
①排队器:将系统中的所有就绪进程按照一定的策略排成一个或多个队列,以便调度程序选择。每当有一个进程转变为就绪态时,排队器便将他插入到相应的就绪队列中。
②分派器:依据调度程序所选的进程,将其从就绪队列取出,将CPU分配给新进程
③上下文切换器:在切换处理机时,主要完成对原来运行进程各种数据的保存,对新的进程各种数据的恢复
在这里插入图片描述
调度程序的处理对象
①不支持内核级线程的操作系统:进程
②支持内核级线程的操作系统:内核线程

6.2.1 进程调度的时机

在这里插入图片描述
要注意的是:进程在操作系统内核程序临界区中时不能进行调度与切换
这个说法:“进程处于临界区时不能进行处理机调度 ”是错误的
在这里插入图片描述

6.2.2 调度方式

在这里插入图片描述

6.2.3 切换与过程

在这里插入图片描述
在进程切换时,如果系统中没有就绪进程,就会调度闲逛程序运行,闲逛程序优先级最低,闲逛程序不需要CPU之外的资源,它不会被阻塞。

6.3 调度算法的评价指标

在这里插入图片描述

6.3.1 CPU利用率

在这里插入图片描述

6.3.2 系统吞吐量

单位时间内完成作业的数量
在这里插入图片描述

6.3.3 周转时间

在这里插入图片描述
在这里插入图片描述

6.3.4 等待时间

在这里插入图片描述
对于进程来说,等待时间就是指进程建立后等待被服务的时间之和在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。
对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间。

6.3.5 响应时间

在这里插入图片描述
响应时间,指从用户提交请求到首次产生响应所用的时间。
小结
在这里插入图片描述

6.4 调度算法

调度算法的学习思路
在这里插入图片描述

6.4.1 先来先服务(FCFS)调度算法

在这里插入图片描述
非抢占式的算法
FCFS算法对长作业有利,对短作业不利

6.4.2 短作业优先(SJF)调度算法

在这里插入图片描述
抢占也有非抢占
非抢占式的:
短作业/进程优先调度算法:每次调度时选择当前已到达且运行时间最短的作业/进程。
抢占式的:
最短剩余时间优先算法:每当有进程加入就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度
在这里插入图片描述
如果题目中未特别说明,所提到的“短作业/进程优先算法”默认是非抢占式的

6.4.3 高响应比优先调度算法

在这里插入图片描述
非抢占式
注意抢占比的计算
在这里插入图片描述

6.4.4 时间片轮转调度算法

在这里插入图片描述
用于进程调度,因为只有建立了进程后,才能被分配处理机时间。
属于抢占式,时间到直接剥夺
如果时间片太大,则退化为先来先服务算法
如果时间片太小,会花大量时间来处理进程切换

6.4.5 优先级调度算法

在这里插入图片描述
抢占式和非抢占式都有
在这里插入图片描述
系统进程优先级 高于 用户进程
前台进程优先级 高于 后台进程
操作系统更偏好 I/O型进程(或称 I/O繁忙型进程)
注:与I/O型进程相对的是计算型进程(或称 CPU繁忙型进程)

6.4.6 多级反馈队列调度算法

在这里插入图片描述
抢占式算法在 k 级队列的进程运行过程中,若更上级的队列(1~k-1级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回 k 级队列队尾。
在这里插入图片描述

6.4.7 多级队列调度算法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木林_森林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值