进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动 ,是系统进行资源分配和调度的一个独立单位。
要点
控制块(PCB)
进程唯一标识(最重要的)
数据段
存放原始数据(程序加载的)、中间数据(运行产生的)
程序段
存放在文本区域,可被多个进程共享
线程
线程(Thread)是进程的轻型实体,也叫“轻量级进程”,是一些类活动按设定好的顺序依次执行的过程,是一系列指令的集合。
是一条执行路径,不能单独存在,必须包含在进程中。
线程是操作系统运算调度的最小单位。
为什么引入线程
提高操作系统的并发性,并减少资源的分配
属性
操作系统调度的最基本单位是线程
一个进程中包含多个线程,操作系统可以在多个线程间切换,这不会造成进程的调度。
线程使用的资源都是进程的,线程只有使用权。
线程进一步提高了并发性。
同一个进程中的线程,共享进程的内存空间和其他资源
重点:线程相对于进程,大大降低了创建、撤销和切换可执行实体的成本和难度。
线程如果在用户空间实现的,就是用户级线程(ULT),线程如果在内核空间实现,就是内核级线程(KLT)。
用户级线程
所有操作,包括线程创建,撤销,调度都在用户空间完成。
操作系统提供了线程库来进行这些线程的操作。
内核级线程
线程控制块在内核空间,切换是在线程之间,比用户级更快。
三种基本状态
就绪(Ready)
简单来说就是可运行但是未运行的状态。
执行
就绪的进程获取CPU执行权,就进入了执行状态。
就绪到执行的步骤叫做进程调度。
执行的进程,执行结束又回到就绪状态。
阻塞
执行状态的进程,由于I/O请求,进程进入阻塞状态。
I/O完成后,进程又从阻塞到就绪状态。
进程的五种状态
创建
创建时读取进程的数据,创建 PCB 或者填写其他东西等
就绪
执行
阻塞
终止
正常情况:当前进程执行结束后,会执行终止指令,产生一个中断,通知操作系统进程结束,终止进程。
异常情况:出现严重的错误,进程强制终止。
进程控制是操作系统对进程实现有效的管理,包括创建新进程、撤销已有进程、挂起、阻塞和唤醒进程切换等多种操作。
操作系统通过原语(Primitive)操作实现进程控制
原语:由若干条指令组成的,完成特定的功能,是一种原子操作(Action Operation)
原语的特点
原语有很多,这里主要介绍进程控制中的原语
创建原语:create
用户登录,作业调度,提供服务,应用请求,都会创建一个进程。
阻塞原语:block
在运行状态时,在请求某种服务,启动某种操作,数据未到达或者无工作可做等,都会执行block原语进入阻塞状态。
唤醒原语:wakeup
阻塞的进程可以继续执行,就会执行wakeup原语继续执行。
撤销原语:destroy
正常终止(运行结束)、异常结束(程序内部出错)、外界干预(其他情况,一个进程关闭另一个进程等),会执行destroy原语。
为了系统和用户观察和分析进程,我们将当前进程挂起,保存当前进程的状态。
将挂起的进程恢复期状态,称为激活。
挂起原语:suspeng(进程从内存拿到外存)
激活原语:active
注:挂起和激活不是状态,它们是操作,静止就绪和禁止阻塞是状态
进程调度也称为处理机调度。
是根据一定的算法和原则将处理机资源进行重新分配的过程。
前提
作业/进程数远远大于处理机数
目的
提高资源利用率,减少处理机空闲时间,增加操作系统吞吐量。
程序调度
一方面要满足特性系统用户的需求(快速响应),另一方面要考虑系统整体效率(系统平均周转时间)和调度算法本身的开销。
高级调度/作业调度
把磁盘(外存)上的应用程序,加载到内存中,创建成进程的过程。
中级调度/内存调度
执行suspend原语,进程从内存到外存中挂起,执行Active原语,进程从外存到内存,挂起和激活的操作都是内存调度。
低级调度/进程调度
剥夺式/抢占式调度
调度原则可以一次遵循多个
非剥夺/非抢占式调度
细节
作业调度:作业从外存到内存以及从内存到外存都称为作业调度,属于高级和中级调度
进程调度:属于低级调度
算法内容
调度作业/就绪队列中最先入队者,等待操作完成或阻塞
算法原则
按作业/进程到达顺序服务
调度方式
非抢占式调度
适用场景
作业/进程调度
优点
有利于 CPU 繁忙型作业,充分利用 CPU 资源(没必要调来调去的,浪费很多等待时间)
缺点
不利于 I/O 繁忙型作业(需要大量的读写操作),一直等待I/O操作,非常 耗时,其它进程饥饿
算法内容
所需要服务时间最短的作业/进程优先服务(执行)
算法原则
追求最少的平均(带权)周转时间(完成一个作业需要的时间)
调度方式
SJF/SPF 非抢占式
适用场景
作业/进程调度
优点
平均等待/周转时间最少
缺点
长作业周转时间会增加或饥饿
估计时间不准确,不能保证紧迫任务及时处理
算法内容
结合先来先服务(FCFS)和短作业优先(SJF),综合考虑等待时间和服务时间计算响应比,高得优先调度。
算法原则
综合考虑作业/进程的等待时间和服务时间
调度方式
非抢占式
适用场景
作业/进程调度
响应比计算
算法内容
又叫优先权调度,按作业/进程的优先级(紧迫程度)进行调度
算法原则
优先级高(最紧迫)的作业/进程先调度
调度方式
抢占/非抢占式(并不能获得及时执行)
适用场景
作业/进程调度
优先级设置原则
算法内容
按进程到达就绪队列的顺序,轮流分配一个时间片去执行,时间片用完则剥夺。
算法原则
公平、轮流为每个进程服务,进程在一定时间内都能得到响应
调度方式
抢占式,由时钟中断确定时间到
适用场景
进程调度
优点
公平,响应快,适用于分时系统
缺点
时间片决定因素:系统响应时间(响应时间越长,效率越低,时间片越小)、就绪队列进程数量(数量越多,时间片越短)、系统处理能力(能力越强,时间片越长)。
时间片太大,相当于先来先服务;太小,处理机切换频繁,开销增大
算法内容
设置多个按优先级排序的就绪队列,优先级从高到低,时间片从小到大
新进程采用队列降级法,进入第一级队列,按 FCFS 分时间片,没有执行完,移到第二级,第三级。。
前面队列不为空,不执行后续队列进程
算法原则
集前几种算法的优点,相当于 优先级调度算法加上时间片轮转调度。
调度方式
抢占式
适用场景
进程调度
优点
对各类型相对公平;快速响应
终端型作业(交互型)用户:短作业优先,一般交互操作在第一个队列就运行完了
批处理作业用户:周转时间短
长批处理作业用户:长作业在前几个队列部分执行,不会导致饥饿
概念
进程通信即进程间的信息交换。
特点
有直接通信和间接通信两种,基于send 和 receive 这两个原语进行操作,这也是与共享存储(操作数据结构或者共享空间)的区别。
直接通信:点到点发送
发送和接收时指明双反进程的ID
每个进程维护一个消息缓冲队列
间接通信:广播信箱
管道用于连接/写进程的共享文件,pipe 文件(文件大小固定),本质是内存中固定大小的缓冲区。只能两个进程间建立,效率比较高,也比共享存储安全。
以流的形似读写,如果管道未满,不读数据;如果管道已经满了,就不能写了;如果管道里的数据并没有被读进程全读出去,就不能写进管道;如果管道是空的,就不读了;如果管道读完了,就删除管道的内容。
管道是半双工通信
协调进程间的相互制约关系,使它们按照预期的方式执行的过程
前提
两种相互制约形式
访问过程
访问原则
单标志法:违背“空闲让进”
两个进程必须交互的进入临界区,如果一个不进临界区了,会影响另一个进程进入临界区。
双标志先检查:违背“忙则等待”
先检查是先检查后赋值。
但在第一次进入的时候,可能在p0进程flag[0]改为true之前,p1进程的判断已经执行,两个进程都会进入临界区
双标志后检查:违背”空闲让进“、“有限等待”
后检查是先赋值后检查
在一开始,p0和p1进程都赋值为true,死循环阻塞。
皮特森算法:违背“让权等待”,会发生“忙等”
p0和p1如果进入了while,会一直自旋。
中断屏蔽:关中断/开中断
优点
缺点
Test-And-Set
付出标志并设置为 true,返回旧值,是原子操作
缺点
Swap指令(EXCHANGE,XCHG指令)
交换两个变量的值,是原子操作
缺点
PV操作:
整型信号量:违背“让权等待”,会发生忙等。
记录型信号量:进程进入阻塞状态,不会忙等。
管程也可以称为监视器。
字面理解为“管理进程”,即用于实现进程同步的工具。是由代表共享资源的数据结构和一组过程(进行PV操作的函数)组成的管理程序(封装)。
组成
基本特征
条件变量
定义
多个进程由于竞争资源而造成的阻塞现象,若无外力作用,这些进程将无法继续推进。
原因
多个进程竞争系统资源,并且推进顺序非法,进程执行顺序有问题。
必要条件
死锁避免:安全性算法
让系统处于安全状态,安全状态一定不会出现死锁,不安全状态可能会产生死锁,也不是一定的。
安全性算法最典型的就是银行家算法
死锁检测
死锁解除
资源剥夺
挂起死锁进程,剥夺其资源,将资源分配给其它进程,也就是挂起
撤销进程
强制showdown,强制释其资源
进程回退
回退到足以避免死锁的地步,但是要回退就需要记录进程历史信息,设置还原点