操作系统引论
操作系统的目标和作用
操作系统的目标
- 方便性
- 有效性
- 可扩充性
- 开放性
操作系统的作用
-
OS作为用户与计算机硬件系统之间的接口
OS处于用户与计算机硬件系统之间,用户通过OS来使用计算机系统。
-
OS是一个系统软件,因而这种接口是软件接口。
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5daXkuSb-1637221949738)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20211114114529515.png)]
- 命令方式。
- 系统调用方式
- 用户可在自己的应用程序中通过相应的系统调用,来操纵计算机。
- 图形、窗口方式
-
-
OS作为计算机系统资源的管理者
资源:处理器、存储器、I/O设备以及信息(数据和程序)
-
OS用作扩充机器
推动操作系统发展的主要动力
- 不断提高计算机资源利用率
- 方便用户
- 器件的不断更新换代
- 计算机体系结构的不断发展
操作系统的发展过程
无操作系统的计算机系统
-
人工操作方式
缺点:
- 用户独占全机
- CPU等待人工操作
-
脱机输入/输出(Off-Line I/O)方式
优点:
- 减少了CPU空闲时间
- 提高了I/O速度
单道批处理系统
- 单道批处理系统的处理过程
- 特征
- 自动性
- 顺序性
- 单道性
多道批处理系统
- 多道程序设计的基本概念
- 在单道批处理系统中,内存中仅有一道作业,无法充分利用系统中的所有资源,致使系统性能较差。为了进一步提高资源利用率和系统吞吐量,60年代中期,又引入了多道程序设计技术。
- 在该系统中,用户所提交的作业都先存放在外存上,并排成一个队列,称为“后备队列”;然后由作业调度程序按一定的算法从后备队列中选择若干个作业调入内存,使他们共享CPU和系统的各种资源。
- 提高CPU的利用率
- 可提高内存和I/O设备利用率
- 增加系统吞吐量
- 多道批处理系统的特征
- 多道性
- 无序性
- 调度性
- 多道批处理系统的优缺点
- 资源利用率高
- 系统吞吐量大
- 平均周转时间长
- 五交互能力
- 多道批处理系统需要解决的问题
- 处理机管理问题
- 内存管理问题
- I/O设备管理问题
- 文件管理问题
- 作业管理问题
分时系统
- 分时系统的产生
- 如果说推动多道批处理系统形成和发展的主要动力,是提高资源利用率和系统吞吐量,那么,推动分时系统形成和发展的主要动力,则是用户的需求。用户需求主要体现在一下几个方面:
- 人机交互
- 共享主机
- 便于用户上机
- 如果说推动多道批处理系统形成和发展的主要动力,是提高资源利用率和系统吞吐量,那么,推动分时系统形成和发展的主要动力,则是用户的需求。用户需求主要体现在一下几个方面:
- 分时系统实现中的关键问题
- 最关键的问题是如何使(包括多个)用户能与自己的作业进行交互,及当用户在自己的终端上键入命令时,系统能及时接收并及时处理该命令,再将结果返回给用户。此后,用户可继续键入下一条命令。即,人-机交互。
- 及时接收
- 及时处理
- 最关键的问题是如何使(包括多个)用户能与自己的作业进行交互,及当用户在自己的终端上键入命令时,系统能及时接收并及时处理该命令,再将结果返回给用户。此后,用户可继续键入下一条命令。即,人-机交互。
- 分时系统的特征
- 多路性
- 独立性
- 及时性
- 交互性
实时系统
所谓“实时”,是表示”及时“,而实时系统是指系统能及时(或即时)响应外部事件的请求,在规定时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。
-
应用需求
- 实时控制
- 实时信息处理
-
实时任务
-
按任务执行时是否呈现周期性来划分
- 周期性实时任务
- 非周期性实时任务
-
外部设备所发出的激励信号并无明显的周期性,但必须联系着一个截止时间。它又可分为:
-
开始截止时间——任务在某时间以前必须开始执行
-
完成截止时间——任务在某时间以前必须完成
-
-
根据对截止时间的要求来划分
- 硬实时任务。系统必须满足任务对截止时间的要求,否则可能出现难以预测的结果。
- 软实时任务。它也联系着一个截止时间,但并不严格,若偶尔错过了任务的截止时间,对系统产生的影响也不会太大。
-
实时系统与分时系统特征的比较
- 多路性
- 独立性
- 及时性
- 交互性
- 可靠性
-
操作系统的基本特性
- 并发
- 并行性是指两个或多个事件在同一时刻发生;而并发性是指两个或多个事件在同一时间间隔内发生。
- 共享
- 在操作系统环境下,所谓共享是指系统中的资源可供内存中的多个并发执行的进程(线程)共同使用。
-
互斥共享方式
- 在一段时间内只允许一个进程(线程)访问该资源。
- 计算机系统中的大多数物理设备,以及某些软件中所使用的栈、变量和表格,都属于临界资源,它们要求被互斥地共享。
- 在一段时间内只允许一个进程访问的资源称为临界资源或独占资源。
-
同时访问方式
- “同时”往往是宏观的,而在微观上,这些进程可能是交替地对该资源进行访问。
- 磁盘设备、一些用重入码编写的文件、也可以被“同时”共享,及若干个用户同时访问该文件。
-
- 在操作系统环境下,所谓共享是指系统中的资源可供内存中的多个并发执行的进程(线程)共同使用。
并发和共享是操作系统的两个最基本的特征,又是互为存在的条件。
- 虚拟
- 是指通过某种技术把一个物理实体变为若干个逻辑上的对应物。相应的,用于实现虚拟的技术,称为虚拟技术。在OS中利用了多种虚拟技术,分别用来实现虚拟处理机、虚拟内存、虚拟外部设备和虚拟信道。
- 在操作系统中,虚拟的实现主要是通过分时使用的方法。显然,如果n是某物理设备所对应的虚拟的逻辑设备数,则虚拟设备的平均速度必然是物理设备速度的1/n。
- 异步性
- 由于资源等因素的限制,是进程的执行通常都不是“一气呵成”,而是以“走走停停”的方式运行。
- 由于各用户程序性能的不同,很可能是先进入内存的作业后完成,而后进入内存的作业先完成。或者说,进程是以人们不可预知的速度向前推进,此即进程的异步性。
- 只要运行环境相同,作业经过多次运行,结果都是相同的,因此,异步运行方式是允许的,是操作系统的一个重要特征。
操作系统的主要功能
处理机管理功能
-
进程控制
为作业创建进程,撤销已结束的进程,以及控制进程在运行过程中的状态转换。在现代OS中,进程控制还应具有为一个进程创建若干个线程的功能和撤销(终止)已完成任务的线程的功能。
-
进程同步
- 系统中必须设置进程同步机制。进程同步的主要任务是为多个进程(线程)的运行进行协调。有两种协调方式:
- 进程互斥方式
这是指诸进程(线程)在对临界资源进行访问时,应采用互斥方式 - 进程同步方式
指在相互合作中去完成共同任务的诸进程(线程)间,由同步机构对它们的执行次序加以协调。
- 进程互斥方式
- 最简单的用于实现进程互斥的机制,是为每一个临界资源配置一把锁W,当锁打开时,进程(线程)可以对该临界资源进行访问;而当锁关上时,则禁止进程(线程)访问该临界资源。
- 系统中必须设置进程同步机制。进程同步的主要任务是为多个进程(线程)的运行进行协调。有两种协调方式:
-
进程通信
进程通信的任务就是用来实现在相互合作的进程之间的信息交换。
- 当相互合作的进程(线程)处于同一计算机系统时,通常在它们之间是采用直接通信方式。源进程——>目标进程
- 调度
在后备队列中等待的每个作业,通常都要经过调度才能执行。在传统的操作系统中,包括作业调度和进程调度两步。
- 在多线程OS中,通常是把线程作为独立运行和分配处理机的基本单位。
存储器管理功能
-
内存分配
静态和动态两种方式。
-
静态分配:每个作业的内存空间是在作业装入时确定的,在作业装入后的整个运行期见,不允许该作业在申请新的内存空间,也不允许作业在内存中“移动”。
-
动态分配:也是在装入时确定的,但允许作业在运行过程中,继续申请新的附加空间,以适应程序和数据的动态增涨,也允许作业在内存中“移动”。
内存分配的机制中应具有这样的结构和功能:
- 内存分配数据结构
- 内存分配功能
- 内存回收功能
-
-
内存保护
内存保护的主要任务,是确保每道用户程序都只在自己的内存空间内运行,彼此互不干扰。
- 一种方式:设置两个界限寄存器
-
地址映射
该功能应在硬件的支持下完成。
-
内存扩充
逻辑上扩充内存,系统必须具有内存扩充机制,完成以下功能:
1)请求调入功能
2)置换功能
设备管理功能
主要任务:完成用户进程提出的I/O请求。
-
设备管理应具有缓冲管理、设备分配、设备处理以及虚拟设备等功能。
-
缓冲管理
- 缓冲区机制:单缓冲机制、能实现双向同时传送数据的双缓冲机制、以及能供多个设备同时使用的公用缓冲池机制。
-
设备分配
基本任务:根据用户进程的I/O请求、系统的现有资源情况以及按照某种设备分配策略,为之分配其所需的设备。
- 设备控制表、控制器控制表
-
设备处理
设备处理程序又称为设备驱动程序,其基本任务是用于实现CPU和设备控制器之间的通信。
-
文件管理功能
-
文件存储空间的管理
- 由文件系统对诸多文件及文件的存储空间,实施统一的管理。
主要任务:为每个文件分配必要的外存空间,提高外存的利用率,并能有助于提高文件系统的运行速度。
- 离散分配方式,以减少外存零头。并以盘块为基本单位。
-
目录管理
-
目录项包括文件名、文件属性、文件在磁盘上的物理位置等等。
主要任务:为每个文件建立其目录项,并对众多的目录项加以有效的组织,以实现方便的按名存取。实现文件共享,提供快速的目录查询手段。
-
-
文件的读/写管理和保护
-
文件的读/写管理。
- 从外存中读取数据:或将数据写入外存。
- 由于读和写操作不会同时进行,故可合用一个指针。
-
文件保护
- 防止未经核准的用户存取文件
- 防止冒名顶替存取文件
- 防止以不正确的方式使用文件
-
用户接口
-
命令接口
-
联机用户接口
它由一组键盘操作命令及解释程序所组成,用户在终端或控制台上键入命令后,系统立即转入命令解释程序。
-
脱机用户接口
为批处理作业的用户提供的,也称为批处理用户接口。
- 由一组作业控制语言JCL组成。
- 批处理作业的用户不能直接与自己的作业交互作用,只能委托系统代替用户对作业进行控制和干预。
-
-
程序接口
- 该接口是为用户程序在执行中访问系统资源而设置的,是用户取得操作系统服务的唯一途径。
- 他是由一组系统调用组成,每一个系统调用都是一个能完成特定功能的子程序。
-
图形接口
采用了图形化的操作页面,用非常容易识别的各种图标(icon)来将系统的各项功能、各种应用程序和文件,直观逼真的表示出来。
操作系统的结构设计
软件工程的基本概念
-
软件的含义
所谓软件,是指当计算机运行时,能提供所要求的功能和性能的指令和程序的集合,该程序能够正确地处理信息的数据结构;作为规范软件,还应具有描述程序功能需求以及程序如何操作使用的文档。
- 逻辑部件
-
软件工程的含义
软件工程是指运用系统的、规范的和可定量的方法,来开发、运行和维护软件。
其目的是为了解决在软件开发中所出现的编程随意、软件质量不可保证以及维护困难等问题。
传统的操作系统结构
我们把第一代至第三代的OS结构,称为传统的OS结构。而把微内核的OS结构称为现代OS结构。
-
无结构操作系统(整体系统结构)
-
模块化OS结构
- 将OS按其功能划分为若干个具有一定独立性和大小的模块。
- 然后再进一步将各模块细分为若干个具有一定管理功能的子模块。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7k3CeCOm-1637221949740)(图片/image-20211116115106410.png)]
- 模块化OS的优缺点
- 提高了OS设计的正确性、可理解性和可维护性
- 增强了OS的可适应性
- 加速了OS的开发过程
- 对模块的划分和接口的规定并不精确,而且还可能存在错误
- 从功能观点来划分模块时,未能将共享资源和独占资源加以区别,由于管理上的差异,使OS结构变得不清晰。
-
分层式OS结构
-
有序分层的基本概念
> 在物理机器上一层层铺设软件,每一层都实现若干功能。 * 基本原则:每一层都仅使用其底层所提供的功能和服务,这样可使系统的调试和验证都变得容易。
- 层次的设置
- 程序嵌套:考虑每个功能的实现所用到的软件层,这是划分OS层次时需要考虑的。
- 运行频率。直接在物理机器上运行的软件拥有最高的运行速度。故应该将那些经常活跃的模块放在最接近硬件的层次。如,时钟管理,进程调度。
- 公用模块。设置在最低层,不然不能调用,eg,对于信号量进行操作的原语。signal和wait。
- 用户接口。最高层,直接提供给用户使用。
微内核OS结构
-
客户/服务器模式
-
基本概念
1. 提供各种服务的一组服务器(进程)
2. 内核
3. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XXdLZTrY-1637221949741)(图片/image-20211116122521506.png)]- 客户/服务器模式的优缺点
- 提高了系统的灵活性和可扩充性
- 提高了OS的可靠性
- 可运行于分布式系统中
-
面向对象的程序设计技术
-
面向对象技术的基本概念
该技术是基于“抽象”和“隐蔽”原则来控制大型软件的复杂度的。 OS中的各类实体如进程、线程、消息、存储器等,都使用了对象这一概念。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFZZUTFj-1637221949742)(图片/image-20211116123151802.png)]
-
面向对象技术的优点
-
可修改性和可扩充性
-
继承性
-
正确性和可靠性
由于对象是构成操作系统的基本单元,可以独立地对它进行测试,这样,比较容易保证其正确性和可靠性,从而比较容易保证整个系统的正确性和可靠性。
-
-
-
微内核技术
-
微内核技术的引入
> 所谓的微内核技术,是指精心设计的,能实现现代OS核心功能的小型内核,不仅运行在核心态,而且开机后常驻内存,不会因为内存紧张而被换出内存。 * OS的大部分功能和服务,都是由若干服务器来提供的,如文件服务器,作业服务器和网络服务器等。
-
微内核的基本功能
通常都是一些最基本的功能
-
进程管理
-
存储器管理
-
进程通信管理
-
I/O设备管理
-
Linux内核结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dMjb74sN-1637221949743)(图片/image-20211116124706282.png)]
Windows结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-POSx5Fsq-1637221949745)(图片/image-20211116124914456.png)]
-
-
Linux系统发展
第一个Unix内核
1973年,Ritchie等人以C语言写出第一个正式UNIX内核,使得UNIX很容易被移植到不同的机器上。
Linux之父——Linux Torvalds
Linux的肥沃土壤——GNU
GPL——开源软件的法律
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S3YHmhet-1637221949746)(图片/image-20211116125536782.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IhZ31FZK-1637221949747)(图片/image-20211116125611825.png)]
进程管理
进程的基本概念
- 程序的顺序执行及其特征
-
程序的顺序执行
仅当前一操作(程序段)执行完后,才能执行后续操作。
-
程序顺序执行时的特征
-
顺序性
- 封闭性
- 可再现性
-
前趋图
是一个有向无循环图,记为DAG。用于描述进程之间执行的前后关系。
-
在前趋图中,把没有前趋的结点称为初始结点。把没有后继的结点称为终止结点。
-
每个结点还具有一个重量(Weight),用于表示该结点所含有的程序量或结点的执行时间。
-
应当注意,前趋图中必须不存在循环,若存在循环,则这种关系是不可能实现的。
-
-
程序的并发执行及其特征
- 程序的并发执行
- 程序并发执行时的特征
- 间断性
- 失去封闭性
- 不可再现性
-
进程的特征与状态
-
进程的特征和定义
-
结构特征:PCB结构块
- 动态性:进程是动态的,程序是静态的
- 并发性:多个进程实体同存于内存中,且能在一段时间内同时运行。而程序(没有建立PCB)是不能参与并发执行的。
- 独立性:在传统OS中,独立性是指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序都不能作为一个独立的单位参与运行。
- 异步性:进程按各自不可预知的速度运行。
- 较典型的进程定义:
- 进程是程序的一次执行
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
- 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
-
进程的三种基本状态
-
就绪(Ready)状态
- 执行状态
- 阻塞状态
–创建–>就绪–进程调度–>执行–终止–>
执行–时间片完–>就绪
执行–I/O请求–>阻塞
阻塞–I/O完成–>就绪
-
挂起状态
-
引入挂起状态的原因
1. 终端用户的请求
2. 父进程请求
3. 负荷调节的需要
4. 操作系统的需要
-
-
进程控制块
-
操作系统中用于管理控制的数据结构
资源信息表或进程信息表连接到四类:
内存表 设备表 文件表 用于进程管理的进程表PCB
-
进程控制块PCB的作用
是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的过程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。
-
作为独立运行基本单位的标志
-
能实现间断性运行方式
-
提供进程管理所需要的信息
-
提供进程调度所需要的信息
只有处于就绪状态的进程才能被调度
-
实现与其他进程的同步与通信
-
-
进程控制块中的信息
-
进程标识符
> 唯一标识一个进程,一个进程通常有两种标识符: * 内部标识符:唯一的数字标识符,主要是为了方便系统使用。 * 外部标识符:由创建者提供,往往是由用户(进程)在访问该进程时使用。
-
处理机状态
处理机状态信息主要是由处理机的各种寄存器中的内容组成的。
处理机处于执行状态时,正在处理的许多信息都是放在寄存器中的,当进程被切换时,处理机状态信息都必须保存在相应的PCB中,以便在该进程重新执行时能再从断点继续执行。
- 通用寄存器(用户可视寄存器)
- 指令计数器
- 程序状态字PSW
- 用户栈指针
-
进程调度信息
在OS进行调度时,必须了解进程的状态及有关进程调度的信息
- 进程状态
- 进程优先级
- 进程调度所需的其他信息
- 事件,即阻塞原因
-
进程控制信息
用于进程控制所必须的信息
- 程序和数据的地址
- 进程同步和通信机制
- 资源清单
- 链接指针:给出本进程所在队列中的下一个进程的PCB的首地址。
-
进程控制块的组织方式
-
链接方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pQHcWhNu-1637221949748)(图片/image-20211116214127167.png)]
-
索引方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TOHSEJD8-1637221949749)(图片/image-20211116214506659.png)]
-
线性方式
实现简单、开销小,查找时要扫描整张表,适合进程不多的系统。
-
-
进程控制
进程的创建
-
进程图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hWM4gCeU-1637221949749)(图片/image-20211117154920946.png)]
-
引起创建进程的事件
-
用户登录
-
作业调度
-
提供服务
-
应用请求
-
-
进程的创建
-
申请空白PCB
- 为新进程分配资源
- 初始化进程控制块
- 将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。
进程的终止
-
引起进程终止的事件
-
正常结束
1. 在批处理系统中,通常在程序的最后安排一条Holt指令(产生一个中断)或终止的系统调用。 2. 在分时系统中,用户可利用Logs off去表示进程运行完毕,此时同样可产生一个中断。
-
异常结束
-
越界错误
- 保护错误
- 非法指令
- 特权指令错误
- 运行超时
- 等待超时
- 算术运算错
- I/O故障
-
外界干预
指进程应外界的请求而终止运行。
- 操作员或操作系统的干预,如,死锁
- 父进程请求,父进程具有终止自己任何子孙进程的权利,因而父进程提出请求时,系统将终止该进程。
- 父进程终止,当父进程终止时,他所有的子孙进程终止。
-
-
进程的终止过程
-
根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读取该进程的状态。
- 若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度。
- 若该进程还有子孙进程,还应将其所有子孙进程予以终止,以防他们成为不可控的进程。
- 将被终止进程所拥有的全部资源,或者归还给其父进程,或者归还给系统。
- 将被终止进程(它的PCB)从所在队列(或链表)中移出,等其他程序来搜集信息。
进程的阻塞与唤醒
-
引起阻塞与唤醒的事件
-
像系统请求共享资源失败
- 等待某种操作的完成
- 新数据尚未到达
- 等待新任务的到达
-
进程阻塞过程
正在执行的进程,当发现上述某事件时,进程便通过调用阻塞原语block将自己阻塞。
可见,阻塞是一种进程自身的主动行为。 -
进程唤醒过程
当被阻塞进程所期待的事件出现时,如I/O完成或其所期待的数据已经到达,则有关进程调用唤醒原语wakeup(),将等待该事件的唤醒进程。
唤醒原语执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。
进程的挂起与激活
-
进程的挂起
系统利用挂起原语suspend()将指定进程或处于阻塞状态的进程挂起。
- 挂起原语的执行过程是:
- 首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将之改成静止阻塞。
- 为了方便用户或父进程考察该进程的运行情况而把该进程的PCB复制到某指定的内存区域。
- 若被挂起的进程正在执行,则转向调度程序重新调度。
- 挂起原语的执行过程是:
-
进程的激活过程
当发生激活进程的事件时,例如,父进程或用户进程请求激活指定进程,若该进程驻留在外存而内存中已有足够的空间时,则可将在外存上处于静止就绪状态的进程换入内存。
系统将利用激活原语active()将指定进程激活。激活原语先将进程从外存调入内存,检查该进程的现行状态,静止–>活动。
- 假如采用的是抢占调度策略,则每当有新进程进入就绪队列时,应检查是否要重新调度,即由调度程序将被激活进程与当前进程进行优先级的比较,如果激活进程的优先级更低,就不必重新调度;否则,立即剥夺当前程序的运行,把处理机分配给刚被激活的进程。
进程同步
进程同步的基本概念
进程同步机制的主要任务,是对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能够按照一定的规则(或时序)共享系统资源,并能很好地相互合作,从而使程序的执行具有可再现性。
-
两种形式的制约关系
-
间接相互制约关系
> 由于共享资源,致使这些并发执行的程序之间形成互相制约的关系。
-
直接相互制约关系
进程间的直接制约关系源于他们之间的相互合作。例如:输入进程A和计算进程B,他们之间共享一个缓冲区。
-
-
临界资源
eg. 生产者-消费者(producer-consumer)问题:
-
具有n个缓冲区的缓冲池
-
生产者
-
消费者
尽管所有的生产者进程和消费者进程都是以异步方式运行的,但他们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已经装满产品且尚未被取走的缓冲区中投放产品。
-
-
临界区(critical section)
由前述可知,人们把在每个进程中访问临界资源的那段代码称为临界区。
-
显然,若能保证诸进程互斥的进入自己的临界区,便可实现诸进程对临界资源的互斥访问。
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xaw8Qm22-1637221949750)(图片/image-20211117192927892.png)]
- entry section:进入区,对欲进行访问的临界资源进行检查
- exit section:退出区,用于将临界区正被进行访问的标志恢复为未被进行访问的标志。
-
while(TURE){
进入区
临界区
退出区
剩余区
}
-
-
同步机制应遵循的规则
-
空闲让进
- 忙则等待
- 有限等待:对要求访问临界资源的进程,应保证,有限时间内能进入自己的临界区,以免陷入“死等”状态。
- 让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。
硬件同步机制
信号量机制
- 信号量:表示系统中某种资源的数量(可以是整数,也可以是记录型变量),比如系统中有一台打印机,就可以设置一个初值为1的信号量。
- 原语:是一种特殊程序段,其中执行必须一气呵成,不可中断,在具体实现上,原语是通过关中断/开中断指令实现的。
- 一对原语:wait(s)原语和signal(s)原语,可以理解为我们自己的函数,括号里面的s就是函数调用时传入的参数。
-
整型信号量
除初始化外,仅能通过两个标准的原子操作(Atomic Operation)wait(s)和signal(s)来访问。这两个操作一直被分别称为P,V操作。
-
记录型信号量
在整型信号量机制中的wait操作,只要是信号量S<=0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是进程处于“忙等”的状态。记录型信号量机制,则是一种不存在“忙等”现象的进程同步机制。
-
记录型信号量是由于他采用了记录型数据结构而得名:
Typedef struct{
int value;//剩余资源数
struct process *L;//等待队列
}semaphore
-
-
AND信号量
AND同步机制的基本思想是:将进程在整个运行过程中所需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其他所有可能为之分配的资源,也不分配给他。
-
对若干个临界资源的分配,采取原子操作方式:
- 要么全部分配到进程,要么一个也不分配。
-
为此,在wait操作中,增加了一个AND条件,称为AND同步,或称为同时wait操作,即Swait(Simultaneous wait)定义如下:
Swait(S1,S2,...,Sn)
if Si>=1 and ... and Sn>=1 then
for i:=1 to n do
Si:=Si-1;
endfor
else
place the process in the waiting queue associated with the first Si found with Si<1, and set the program count of this process to the beginning of Swait operation
`endif`
Ssignal(S1, S2, …, Sn)
`for i∶ =1 to n do` `Si=Si+1;` `Remove all the process waiting in the queue associated with Si into the ready queue.`
endfor;
-
-
信号量集Swait(S1,t1(资源的分配下限值),d1(进程对资源的需求值),…)
- 几种特殊情况:
- Swait(S,d,d):只有一个信号量,但允许每次申请d个资源,当现有资源数小于d时,不予分配。
- Swait(S,1,1):此时的信号量集已退化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。
- Swait(S,1,0):这是一种很特殊且很有用的信号量操作,当S>=1时,允许多个程序进入某特定区,当S变为0后,将阻止任何进程进入特定区。它相当于一个可控开关。
- 几种特殊情况:
信号量的应用
-
利用信号量实现进程互斥
互斥信号量:Semaphore mutex=1;取值范围(-1,0,1)
- note:wait(mutex)和signal(mutex)必须成对出现。即:P、V操作同时出现
-
利用信号量实现前趋关系:经典的进程同步关系
异步并发的 按照有序的方式执行
经典进程的同步问题
生产者—消费者问题
描述:生产者、消费者共享一个初始为空、大小为n的缓冲区。
只有缓冲区不满的时候,生产者才能把产品放入缓冲区,否则必须等待。
只有缓冲区不空的时候,消费者才能从中取出产品,否则必须等待。
缓冲区是临界资源,各进程(生产、消费)必须互斥访问。
- P、V操作题目分析:
- 关系分析,找出题目中各个进程,分析他们的同步和互斥关系
- 整理思路,根据各个进程的操作流程确定P、V操作的顺序
- 设置信号量,互斥信号量为1,同步信号量的初始值要看对应资源的初始值。
-
利用记录型信号量解决生产者—消费者问题
Semaphore mutex=1;
Semaphore empty=n;//同步信号量,表示空闲缓冲区的数量(剩余的)
Semaphore full=0;//同步信号量,表示产品数量,满缓冲区的数量(用掉的)
Producer(){
while(1){
生产一个产品;
P(empty);//消耗一个空闲缓冲区
P(mutex);
把产品放入缓冲区;
V(mutex);
V(full);增加一个产品;
}
}
Consumer(){
`while(1){
P(full);//消耗一个产品
P(mutex);//从缓冲区取出一个产品;
V(mutex);
V(empty);//增加一个空闲缓冲区;
//使用产品;
}
}
mutex和empty、full的顺序不能变。
- 实现互斥的P操作一定要在实现同步的P操作之后。
-
利用AND信号量解决生产者—消费者问题
用Swait(empty,mutex)来代替wait(mutex)和wait(empty);
用Ssignal(mutex,full)来代替signal(mutex)和signal(full);
-
利用管程解决生产者—消费者机制
哲学家进餐问题
关系分析:系统中有五位哲学家,五位哲学家与左右邻居对中间的筷子是互斥关系;
思路:只有互斥关系,同时持有两个临界资源才能吃饭,如何避免临界资源分配不当造成的死锁现象,是哲学家问题关键。
信号量设置:互斥信号量数组chopstick[5]={1,1,1,1,1},用来实现对五个筷子互斥访问,左边为i,右边为(i+1)%5;
-
利用记录型信号量解决哲学家进餐问题
Semaphore chopstick[5]={1,1,1,1,1}
Pi(){
P(chopstick[i]);
P(chopstick[i+1]%5);
吃饭;
V(chopstick[i]);
V(chopstick[i+1]);
思考;
}
-
如果五位哲学家都拿起自己左边的筷子,每位哲学家循环等待右边的人放下筷子(阻塞),发生死锁。
如何防治死锁的发生:
1.初始值为4信号量 :能够保证至少有一位哲学 家能够进餐,并在用毕时能释放他用过的两 根筷子。 2.判断奇偶: 最后总会有一位哲学家能获得两 只筷子进餐。 3.互斥使用筷子:仅当哲学家的左右两只筷子均 可使用时,才会允许他拿起筷子进餐。
-
-
利用AND信号量机制解决哲学家进餐问题
要求每个哲学家先获得两个临界资源后方能进餐,这本质上就是AND同步问题。
读者—写者问题
1.允许多个读者可以同时对文件进行读操作
2.只允许一个写者往文件里面写信息
3.任意写者完成写操作之前不允许其他读者写者工作
4.写者执行写操作前,应让已有的读者写者全部退出
2.6 线程
线程的属性
-
轻型实体
-
独立调度和分派的基本单位
-
可并发执行,提高并发度
-
共享进程资源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jHC1C0Mg-1637459216502)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20211119092402965.png)]
线程的状态
-
状态参数
- 寄存器状态
- 堆栈
- 线程运行状态
- 优先级
- 线程专有存储器
- 信号屏蔽
-
线程运行状态
线程运行也具有间断性
- 执行状态
- 就绪状态
- 阻塞状态
线程的创建和终止
创建新线程时,需要利用一个线程创建函数(或系统调用),并提供相应的参数。
终止进程方式有两种:一种是在线程完成自己的工作后自愿退出;另一种是进程在运行过程出现错误或由于某种原因而被其它线程终止。
多线程OS中的进程
在多线程OS中,进程是作为拥有系统资源的基本单位。通常的进程都包含多个线程并为他们提供资源。但此时的进程就再作为一个执行的实体。
- 作为系统资源分配的单位
- 可包括多个线程
- 进程不是一个可执行的实体
线程间的同步和通信
-
互斥锁(mutex)
互斥锁是一种比较简单的、用于实现进程间对资源互斥访问的机制。
-
条件变量
每一个条件变量通常都与一个互斥锁一起使用,亦即,在创建一个互斥锁时便联系着一个条件变量。条件变量一般用于线程的长期等待,直至所等待的资源成为可用的。
-
下面给出了对上诉资源的申请(上半部分)和释放(下半部分)操作的描述。
Lock mutex
check data structures;
while(resourse busy);
wait(condition variable);
mark resourse as busy;
unlock mutex;
Lock mutex
mark resourse as free
unlock mutex;
wakeup(condition variable);
-
信号量机制
-
私用信号量
os并不知道私用信号量的存在
-
公用信号量
其数据结构是存放在受保护的系统存储区。由os为它分配空间并进行管理,故也称系统信号量。比较安全的分配机制。
-
内核支持线程和用户级线程
-
内核支持线程
在内核空间中还为每一个内核支持线程设置了一个线程控制块,内核是根据该控制块而感知某线程的存在的,并对其加以控制。
-
用户级线程
仅存在于用户空间中,这种线程的创建、撤销、线程之间的同步通信等功能,都无需用系统调用来实现。
线程控制
-
内核支持线程的实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtIOhzHI-1637459216507)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20211119111019338.png)]
-
用户级线程的实现
-
运行时系统(Runtime System)
实质上是用于管理和控制线程的函数(过程)的集合。运行时系统中的所有函数都驻留在用户空间,并作为用户级线程与内核之间的接口。
-
内核控制线程
这种线程又称为轻型进程LWP(Light Weight Process),每一个进程都可拥有多个LWP,同用户级线程一样,每个LWP都有自己的数据结构(如TCB)。他们也可以共享进程所拥有的资源。LWP可通过系统调用来获取内核提供的服务。这样,当一个用户级线程运行时,只要将它连接到一个LWP上,此时它便拥有了内核支持线程的所有属性。
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WA7d6NPh-1637459216510)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20211119111750635.png)]
处理机调度与死锁
处理机调度的基本概念
什么是调度?
当有一堆问题要处理,由于资源有限,没法同时进行,需要某种规则要处理任务的顺序,这就是调度问题。
- 在多道程序中,进程数往往多于处理机的个数,不能并行执行多个进程,在一堆就绪队列中按照一定的算法选择一个进程,并将处理机分配给它运行,实现并发执行。
高级、中级和低级调度
- 高级调度(High Scheduling)
由于内存空间有限,无法将用户提交作业全部加载到内存,需要确定某种规则来将作业调入内存。
高级调度:按照一定的顺序从外存上处于后备队列的作业中选一个(或多个)作业,给他们分配内存必要资源,并建立相应的进程(进程PCB),使他们获得竞争处理机的权力。
高级调度可以称之为作业调度,每个作业只能调度一次(调度建立PCB,撤销销毁PCB)。
在每次执行作业调度时,都必须做出以下两个决定。
-
接纳多少个作业
-
接纳哪些作业
-
中级调度(Intermediate-Level Scheduling)
中级调度又称中程调度(Medium-Term Scheduling)。引入中级调度的主要目的,是为了提高利用率和系统吞吐量。
将暂时不用的进程调至外存等待,把此时的进程状态称为就绪驻外存状态或挂起状态。
当进程重新具备运行条件、且内存稍有空闲时,由中级调度来决定把外存上的哪些具备运行条件的就绪队列重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待进程调度。
中级调度可以称之为内存调度,可以调入多次。
-
低级调度(Low Level Schduling)
低级调度可称之为进程调度,其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给他,是最基本的调度方法。
频率高。
-
非抢占方式(Non-preemptive Mode)
可能引起进程调度的因素可归结为:
-
正在执行的进程执行完毕,或因发生某事件而不再继续执行
-
执行中的进程因提出I/O请求而暂停执行
-
在进程通信或同步过程中执行了某种原语操作,如P,block,wakeup
优点:实现简单,系统开销小,适用于大多数的批处理系统环境,但难以满足紧急任务的要求——立即执行。实时系统中不宜采用。
-
-
抢占方式(Preemptive Mode)
抢占的原则有:
- 优先权原则
- 短作业(进程)优先原则
- 时间片原则
-
调度队列模型
- 仅有进程调度的调度队列模型
- 具有高级和低级调度的调度队列模型
- 同时具有三级调度的调度队列模型
选择调度方式和调度算法的若干准则
-
调度算法的目标
-
资源利用率
CPU利用率=CPU执行时间/(CPU执行时间+空闲时间)
-
公平性:任务公平
-
平衡性:系统各个资源平衡
-
-
面向用户的准则
-
周转时间短
平均周转时间:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0OTocpVT-1637459216512)(图片/image-20211119225109027.png)]
作业的周转时间T与系统为它提供服务的时间Ts之比,即W=T/Ts,称为带权周转时间,而平均带权周转时间则可表示为:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wntTlNbv-1637459216514)(图片/image-20211119225325986.png)]
-
响应时间快
-
截止时间的保证
-
优先权准则
-
调度算法
作业调度:从外存后备队列中选取作业到内存
先来先服务和短作业优先调度算法
-
先来先服务算法(FCFS):很少作为主要算法,一般应用到队列中
- 算法思想:公平角度出发
- 算法规则:按照作业/进程到达先后顺序
- 是否可以抢占:非抢占
- 优点:公平 缺点:排在长作业后面的短作业需要等待时间长,带权周转时间很大,对短作业用户体验不好。
-
短作业优先调度算法(SJF)
是指对短作业或短进程优先调度的算法。它们可分别用于作业调度和进程调度。
- SJF:从后备队列里选择一个或若干个估计运行时间最短的作业,将它们调入内存。
- SPF:从就绪队列中选出一估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或者发生某事件而被阻塞放弃处理机时,再重新调度。
- 算法思想:追求最小的平均等待时间,最小的平均周转时间、最小的平均带权周转时间。
- 算法规则:最短的作业/进程优先得到服务(最短指的是要求服务的时间最短)
- 是否可以抢占:不可以,但有抢占式的版本:最短剩余时间优先算法(SRTN)
- 是否会导致饥饿:会(一直有短进程进来)
- SI§F调度算法的缺点:
- 该算法对长作业不利
- 该算法完全未考虑作业的紧迫程度
- 作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意无意地缩短估计运行时间,致使该算法不一定能真正做到短作业优先调度。
高优先权调度算法
-
优先权调度算法的类型
-
非抢占式优先权算法
> 高优先权进程一旦获得处理机便一直执行下去,直至完成。或因发生某事件使该进程放弃处理机时,系统方可重新分配处理机。
>
> 主要用于批处理系统中,也可用于某些对实时性要求不严的实时系统中。
2. 抢占式优先权算法
>在采用这种调度算法时,**每当系统中出现了一个新的就绪进程i**,就将其优先权Pi与正在执行的进程j的优先权Pj进行**比较**。若新的进程优先级高,则立即停止执行,做进程切换。
>
>这种抢占式的优先权调度算法,能够更好地满足紧迫作业的要求,故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。
-
优先权的类型
-
静态优先权
> 静态优先权是在创建进程时确定的,且在进程的整个运行期间保持不变。一般地,优先权是利用某一范围内的一个整数来表示的。又称为优先数。
* 确定进程优先权的依据有如下三个方面:
* 进程类型
* 进程对资源的需求(请求I/O的进程优先权应该高还是低?应该是高吧。。。)
* 用户要求
2. 动态优先权
> 是指在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。
1. 如果作业的等待时间相同,则要求服务的时间愈短,其优先权越高,因而该算法有利于短作业。
2. 当要求服务的时间相同,作业的优先权决定于其等待时间,等待时间越长,其优先权越高,因而它实现的是先来先服务。
3. 对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长时,其优先级便可升到很高,从而也可获得处理机。
-
高响应比优先调度算法
优先权的变化规律:
优先权=(等待时间+要求服务时间)/要求服务时间
由于等待时间与服务时间之和,就是系统对该作业的响应时间,故该优先权又相当于响应比Rp。据此,又可表示为:
优先权=(等待时间+要求服务时间)/要求服务时间=响应时间/要求服务时间
进程调度的任务、机制和方式
-
进程调度的任务
- 保存处理机现场,如:程序计数器
- 按照某种算法选择进程
- 把处理机分配给进程
-
进程调度的机制
排队器,分配器,上下文切换器
就绪进程——>排队器——>就绪队列——>分派器——>上下文切换器——>CPU
进程控制块——>分派器、上下文切换器
-
进程调度的方式
抢占式和非抢占式
基于时间片的轮转调度算法
- 时间片轮转法(RR)
时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行。
- 算法思想:公平轮流为各个进程服务
- 算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片,若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排序。
- 作业/进程调度:进程调度(只有作业装入内存建立相应进程后,才能被分配处理机时间)
- 是否可以抢占:未在时间片内完成则被抢占,属于抢占式算法,是由时钟发出的中断来通知CPU。
- 优点:公平 缺点:高频率的切换有开销;不区分任务紧迫度
- 时间片大小的确定:
- 时间片小:导致频繁的上下文切换
- 时间片大:可能一个时间片执行完就退化成FCFS
-
多级反馈队列调度算法
单队列无法满足系统中不同用户对进程调度的需求
- 应设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,该算法赋予各个队列中进程执行时间片的大小也各不相同。优先权越高的队列中,为每个进程所规定的时间片就越小。
- 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾……当一个长作业(进程)从第一队列降到第n队列后,在第n队列中便采用按时间片轮转的方式运行。
- 按队列优先级调度。仅当第一队列空闲时,调度程序才调度第二队列中的进程运行。可抢占
- 多级反馈队列调度算法的性能
- 终端型作业用户:交互性作业,较小,在第一队列规定的时间片内完成,可使终端型作业用户感到满意。
- 短批处理用户:稍长的短作业,也只需在第二三队列中执行一段时间,其周转时间仍然较短。
- 长批处理作业用户:对于长作业,他将依次在第1,2,3,4,……n个队列中运行,然后再按轮转方式运行,用户不必担心其作业长期得不到处理。
产生死锁的原因和必要条件
什么是死锁?
- 进程等待对方手里的资源,导致各个进程都堵塞,无法向前推进的现象。
什么是饥饿?
- 由于长期得不到想要的资源,某进程无法向前推进的现象。例如SPF里的长进程,经常处于饥饿。
什么是死循环?
- 某进程执行过程中一直跳不出来某个循环的现象,有时候是逻辑bug。
产生死锁的原因
- 竞争资源引起进程死锁
- 可剥夺和非剥夺性资源(可抢占性资源和不可抢占性资源)
- 竞争非剥夺性资源
- 竞争临时性资源(可消耗性资源)
- 进程间推进顺序非法
- 进程推进顺序合法
- 进程推进顺序非法
产生死锁的必要条件
其中只要任何一个条件不成立,死锁就不会发生
-
互斥条件
-
请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但对自己已经获得的资源保持不放。
-
不可抢占条件(不剥夺条件)
-
环路等待条件
必须同时满足以上四个条件
处理死锁的基本方法
-
预防死锁
事先预防方法,设置某些限制条件,破坏死锁产生的四个必要条件中的一个或几个条件
-
避免死锁
事先预防策略,在资源动态分配过程中,用某种方法防止系统进入不安全状态
-
检测死锁
允许进程在运行过程中发生死锁,但可通过检测机构及时检测出死锁的发生,然后采取适当的措施,把进程从死锁中解脱出来。
-
解除死锁
检测出死锁后,采取相应措施,常用方法有:撤销一些进程、回收他们的资源、将他们分配给已阻塞状态的进程,使其能继续运行。
上述四种方法,从1到4对死锁的防范程度逐渐减弱,但对应的是资源利用率的提高,以及进程因资源因素而阻塞的频度下降(即并发程度高)
预防死锁的方法
预防死锁
- 摈弃“请求和保持”条件:一次申请完所有资源,造成资源的浪费,导致饥饿现象。
- 摈弃“不剥夺”条件:无法满足,释放现有资源;由操作系统协助强行剥夺,实现起来比较复杂,增加系统开销,容易导致饥饿。
- 摈弃“环路等待”条件:顺序资源分配法,给资源编号,规定每个进程必须按编号递增的顺序请求资源。新增设备,重新编号
- 摈弃“互斥条件”:把互斥资源改为允许共享使用,例如:SPOOLing技术,很多时候不希望。
避免死锁
一种动态策略,在资源分配过程中,通过设置安全序列的方式,保证程序的有序运行。这种方法施加的限制条件比较弱,可能获得较好的性能。
系统安全状态
-
安全状态
在避免死锁的方法中,允许进程动态的申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。
安全状态:是指系统能按某种进程顺序来为每个进程分配其所需要的资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利完成。如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
-
安全状态之例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBCg7JVr-1637459216517)(图片/image-20211120113946034.png)]
-
由安全状态向不安全状态的转换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GCDNOVjq-1637459216519)(图片/image-20211120114036307.png)]
利用银行家算法避免死锁
-
银行家算法中的数据结构
可利用资源向量Available。如果Available[j]=K,则表示系统中现有Rj类资源K个。
-
银行家算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2XrA5tXO-1637459216521)(图片/image-20211120114826155.png)]
-
安全性算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AGpvibzd-1637459216523)(图片/image-20211120115427714.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gNWexwAp-1637459216524)(图片/image-20211120115448511.png)]