第二章 处理器管理(第一部分)
2.1 进程的概述
2.1.1 进程的定义
程序段、数据段、PCB三部分组成了进程实体(进程映像)。一般情况下,把进程实体就简称为进程。
注意:PCB是进程存在的唯一标志
从不同的角度,进程可以有不同的定义:
1、进程是程序的一次执行过程
2、进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
3、进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
引入进程实体的概念后,进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
注意:严格来说,进程实体和进程并不一样,进程实体是静态的,进程则是动态的。
2.1.2 进程的组成
2.1.3 进程的组织方式
在一个系统中,通常有数十、数百乃至数千个PCB。为了能对它们加以有效的管理,应该用适当的方式把这些PCB组织起来。
链接方式
索引方式
2.1.4 进程的特征
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1e24b11bb4656d6984d6d4ccfcc2847c.png)
2.2 进程的状态与转换
2.2.1 进程的状态
2.2.2 进程状态间的转换
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/771587f4e5c55f104bea45f7895a77bd.png)
2.3 进程控制
2.3.1 进程控制基本概念
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能
进程控制用原语实现
1、原语用关/开中断来实现
2、原语是一种特殊的程序
3、原语的执行必须一气呵成,不可中断
2.3.2 进程控制相关的原语
技巧:进程控制会导致进程状态的变换。无论哪个原语,要做的无非三类事情:
1、更新PCB的信息
- a、所有的进程控制原语一定都会修改进程状态标志
- b、剥夺当前运行进程的CPU使用权必然需要保存其运行环境
- c、某进程开始运行前必然要恢复其运行环境
2、将PCB插入到合适的队列
3、分配/回收资源
拥塞和唤醒要成对出现。
2.4 进程通信
进程通信就是指进程之间的信息交换。
进程是分配系统资源的单位,因此各进程拥有的内存地址空间相互独立。
为了保证安全,一个进程不能直接访问另一个进程的地址空间。
2.4.1 共享存储
两个进程对共享空间的访问必须是互斥的。
操作系统只负责提供共享空间和同步互斥工具。
基于数据结构的共享:这种共享方式速度慢,限制多,是一种低级通信方式
基于存储区的共享:在内存中划出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快、是一种高级通信方式。
2.4.2 管道通信
“管道”是指用于链接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区。
1、管道只能采用半双工通信,某一时间段内只能实现单向传输。如果要实现双向同时通信,则需要设置两个管道。
2、各进程要互斥地访问管道
3、数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
4、如果没写满,就不允许读。如果没读空,就不允许写
5、数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会读错数据的情况。
2.4.3 消息传递
1、传递结构化的信息(消息头/消息体)
2、系统提供“发送/接受原语”
3、两种方式:
- a、直接通信方式:消息直接挂到接收方的消息队列里
- b、间接(管道)通信方式:消息先发到中间体(管道),也称为“信箱通信方式”
消息头:发送进程ID、接受进程ID、消息类型、消息长度等格式化的信息
2.5 线程概念与多线程模型
2.5.1 线程的概念
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程后,不仅进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升系统的并发度,使得一个进程内也可以并发处理各种任务。
引入线程后,进程只作为除CPU之外的系统资源的分配单位,线程则作为处理器的分配单位。
2.5.2 线程的实现方式
用户级线程(User-Level Thread, ULT)
用户级线程由应用程序通过线程库实现。
所有的线程管理工作都由应用程序负责
用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。
在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。
内核级线程(Kernel-Level Thread, KLT)
内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此,内核级线程的切换必然需要在核心态下才能完成。
在同时支持用户级线程和内核级线程的系统中,可采用二者组合的方式:将n个用户级线程映射到m个内核级线程上(n>=m)
操作系统只“看得见”内核级线程,因此只有内核级线程才是处理器分配的单位。
2.5.3 多线程模型
多对一模型
多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理器上并行运行。
一对一模型
一个用户及线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理器上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
多对多模型
N个用户及线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程。
克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
2.6 处理器调度的概念、层次
2.6.1 基本概念
处理机调度
从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。
2.6.2 三个层次
高级调度(作业调度)
按一定的原则从外存上处于后备队列的作业中挑选一个(多个)作业,给它们分配内存等必要资源,建立相应的进程,以使它们获得竞争处理机的权利。
高级调度使辅存(外存)与内存之间的调度。每个作业只调入一次,作业调入时会建立相应的PCB,作业调出时才撤销PCB。
中级调度(内存调度)
要决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高
引入了虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。这样是为了提高内存利用率和系统吞吐量。
低级调度(进程调度)
按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。
进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。
2.6.3 三层调度的联系、对比
2.6.4 补充知识
挂起态是将进程映射调到外存
阻塞态下进程映像还在内存中。
为减轻系统负载,提高资源利用率,暂时不执行的进程会被调到外存从而变为“挂起态”
七状态模型:在五状态模型的基础上加入了“就绪挂起”和“阻塞挂起”两种状态
2.7 进程调度
2.7.1 进程调度的时机
需要进行进程调度与切换的情况
1、当前运行的进程主动放弃处理机
- a、进程正常终止
- b、运行过程中发生异常而终止
- c、进程主动请求阻塞
2、当前运行的进程被动放弃处理机
- a、分给进程的时间片用完
- b、有更紧急的事需要处理
- c、有更高优先级的进程进入就绪队列
不能进行进程调度与切换的情况
1、在处理中断的过程中。中断处理过程复杂,与硬件密切有关,很难做到在中断处理过程中进行进程切换。
2、进程在操作系统内核程序临界区中
3、在原子操作过程中。原子操作不可中断,要一气呵成。
2.7.2 切换与过程
侠义的进程调度
从就绪队列中选中一个要运行的进程。
进程切换:只一个进程让出处理机,由另一个进程占用处理机的过程。
广义的进程调度
1、对原来运行进程各种数据的保存
2、对新的进程各种数据的恢复
进程调度、切换是有代价的,并不是调度越频繁,并发度就越高。
2.7.3 调度方式
非剥夺调度方式
又称为非抢占方式。只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
剥夺调度方式
又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。
2.8 调度算法的评价指标
2.8.1 CPU利用率
CPU“忙碌”的时间占总时间的比例。
利用率=忙碌的时间/总时间
2.8.2 系统吞吐量
单位时间内完成作业的数量
系统吞吐量=总共完成了多少道作业/总共花了多少时间
2.8.3 周转时间
从作业被提交给系统开始,到作业完成为止的这段时间间隔。
四个部分:作业在外存后备队列上等待作业调度(高级调度)的时间、进程在就绪队列上等待进程调度(低级调度)的时间、进程在CPU上执行的时间、进程等待I/O操作完成的时间
周转时间=作业完成时间-作业提交时间
平均周转时间=各作业周转时间之和/作业数
带权周转时间=作业周转时间/作业实际运行的时间=(作业完成时间-作业提交时间)/作业实际运行的时间
平均带权周转时间=各作业带权周转时间之和/作业数
2.8.4 等待时间
进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。
平均等待时间:各个进程/作业等待时间的平均值
2.8.5 响应时间
从用户提交请求到首次产生响应所用的时间
2.9 调度算法
2.9.1 先来先服务
先来先服务(First Come First Serve, FCFS)
2.9.2 最短作业优先
短作业优先(Shortest Job First, SJF)
2.9.3 最高响应比优先
高响应比优先(Highest Response Ratio Next, HRRN)
2.9.4 时间片轮转
时间片轮转(Round-Robin, RR)
2.9.5 优先级调度
补充:
根据优先级是否可以动态改变,可将优先级分为静态优先级和动态优先级
1、静态优先级:创建进程时确定,之后一直不变。
2、动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级。
2.9.6 多级反馈队列
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/acb3a86809103cb1e5d7b9fb82a5d3ee.png)
2.10 进程同步与互斥
2.10.1 进程同步
异步性:各并发执行的进程以各自独立的、不可预知的速度向前推进。
同步:亦称直接制约关系,为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系。
进程间的直接制约关系就是源于它们之间的相互合作。
2.10.2 进程互斥
互斥:亦称间接制约关系,进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源后,另一个进程才能去访问临界资源。
四个部分
1、进入区:检查是否可进入临界区,若可进入,需要“上锁”
2、临界区:访问临界资源的那段代码
3、退出区:负责“解锁”
4、剩余区:其余代码部分
需要遵循的原则
1、空闲让进:临界区空闲时,应允许一个进程访问
2、忙则等待:临界区正在被访问时,其他试图访问的进程需要等待
3、有限等待:要在有限时间内进入临界区,保证不会饥饿
4、让权等待:进不了临界区的进程,要释放处理机,防止忙等