参考汤小丹老师的计算机操作系统 第四版
第1-2章
1章 操作系统引论
2章 进程描述与控制
第1章 操作系统引论
1.1 操作系统的目标和作用
1.1.1 操作系统的目标
在计算机系统上配置操作系统,主要目标是:方便性,有效性,可扩充性,开放性。
方便性和有效性是设计OS时最重要的两个目标
方便性:OS使计算机易学易用;如图形用户界面
有效性:提高系统资源利用率,是推动OS发展的最主要动力;提高系统吞吐量
可扩充性:为适应计算机硬件,体系结构和计算机应用发展的要求;
OS结构发展:早期无结构 -> 模块化结构 -> 层次化结构 -> 微内核结构
开放性:指系统能够遵循世界标准规范
1.1.2 操作系统的作用
1、OS是用户与计算机硬件系统之间的接口:即用户通过OS使用计算机系统
三种使用计算机方式:命令方式,系统调用方式,图标——窗口方式
2、OS是计算机系统资源的管理者
计算机系统四类硬件/软件资源:处理机,存储器,I/O设备,文件(数据和程序)
OS的主要功能是对这四类资源进行有效的管理:
处理机管理:分配和控制处理机
存储器管理:内存的回收与分配
I/O设备管理:I/O设备分配与操纵
文件管理:实现对文件的存取、共享和保护
当计算机被多个用户使用时,OS还要协调用户对共享资源的使用
3、OS实现了对计算机资源的抽象
OS是铺设在计算机硬件上的多层软件的集合。好处是隐藏了对硬件操作的细节,抽象层次越高,用户使用越方便。如在I/O设备覆盖I/O设备管理软件,再在I/O设备管理软件覆盖文件管理软件。
裸机:用户直接操作计算机硬件,需要了解物理接口的实现细节
虚机器或扩充机器:在硬件设备上覆盖了一层软件,实现第一层次的抽象,向用户提供了一个对硬件操作的抽象模型,用户可利用该模型提供的接口使用计算机,无需了解物理接口的实现细节。抽象层次越多,虚机器功能更强
1.1.3 推动操作系统发展的主要动力
1、不断提高计算机资源利用率
如多道批处理系统,改善存储器系统利用率的虚拟存储器技术,在服务器上配置网络文件系统和数据库系统
2、方便用户
如分时系统,图形用户界面
3、器件的不断迭代更新换代
芯片位数增加(如8位,16位),外部设备增多
4、计算机体系结构不断发展
如单处理机OS发展为多处理机OS,计算机网络出现后,有了网络操作系统
5、不断提出新的应用需求
如工业控制需要实时控制,就产生了能实时控制的OS
1.2 操作系统的发展过程
1.2.1 未配置操作系统的计算机系统
1945-50年代中期
1、人工操作方式
操作过程:计算机通过打孔纸带读取程序和数据
缺点:用户独占全机(人机矛盾)和CPU等待人工操作(CPU和I/O设备矛盾),严重降低了计算机资源的利用率
解决方案:通道技术(不好用),缓冲技术(不好用),脱机输入/输出技术(比较好用)
2、脱机输入/输出(Off-Line I/O)技术
操作过程:事先将装有用户程序的数据的纸带装入纸带输入机,在一台外围机控制下,将纸带上的数据输入到磁带上。CPU按照需求读取纸带内容
优点:减少了CPU的空闲时间(外围机帮助装载纸带),提高了I/O速度(进一步减少了CPU空闲时间)
3、单道批处理系统
操作过程:把一批作业脱机输入到磁带上,在系统中配置监督程序,在监督程序控制下一个个处理批中作业,处理作业时,监督程序将控制权移交作业,处理完后,控制权移交监督程序,如此重复。
缺点:系统资源得不到充分的利用。在内存中只能存在一道程序,程序发出I/O请求后,CPU处于等待状态,又因为I/O设备低速性,进一步降低CPU利用率。
1.2.3 多道批处理系统
操作过程:用户提交的作业放在外存上,排成“后备队列”,由作业调度程序按照一定算法从后备队列选择若干作业调入内存,使作业共享CPU和系统中的各种资源。利用程序A因为I/O操作暂停执行时的CPU空挡时间,调度另一道程序B运行,以此类推,是多道程序交替运行。
优点:
资源利用率高:CPU一直忙碌;一次装载多个程序到内存提高内存利用率;I/O利用率得到提高
系统吞吐量大:CPU和其他资源保持忙碌;系统开销小
缺点:
平均周转时间长:因为作业要排队依次进行处理
无交互能力:用户提交作业后,知道作业完成,无法再与作业进行交互
多道批处理系统需要解决的问题:处理机争用问题,内存分配和保护问题,I/O设备分配问题,文件组织和管理问题,作业管理问题,用户与系统的接口问题
有上述问题引发的操作系统定义:操作系统是一组能够有效地组织和管理计算机硬件和软件资源,合理的对各类作业进行调度,以及方便用户使用的程序的集合
1.2.4 分时系统
需求推动:满足用户对人机交互的需求
人机交互:用户能够独占全机
共享主机:用户共享一台计算机,但感觉同独占时一样
定义:在一台主机上连接了多个配有显示器和键盘的终端并由此所组成的系统,该系统允许多个用户同时通过自己的终端,以交互方式使用计算机,共享主机中的资源
实现分时系统关键问题:如何使用户能与自己的作业进行交互
解决方案:系统首先必须能够提供多个终端,同时给多个用户使用,其次,当用户在自己的终端上键入命令时,系统应该能及时接收,并及时处理该命令
及时接收:配置多路卡,分时多路复用;设置缓冲区,暂存用户输入的命令
及时处理:改变批处理系统;使作业直接进入内存,采用轮转方式,通过设置时间片(很短一段时间),系统规定每个作业只能运行一个时间片,然后就暂停该作业执行,立即调度下一个作业运行。
分时系统特征:与多道批处理系统相比
多路性,独立性,及时性,交互性
1.2.5 实时系统
1.实时系统定义:是指系统能及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。
2.实时系统类型
工业(武器)控制系统,信息查询系统,多媒体系统,嵌入式系统
3.实时任务类型
周期性实时任务和非周期性实时任务,硬实时任务和软实时任务
4.实时系统特点
1)多路性:系统按分时原则为多个终端用户服务
2)独立性
3)及时性
4)交互性
5)可靠性:实时系统要求系统高度可靠
1.2.6 微机操作系统发展
1.定义:配置在微型机上的操作系统称为微机操作系统
最早的微机操作系统是配置在8位微机上地CP/M。微机操作系统可以按照微机字长分类,也可以按照运行方式分类
2.按照微机操作系统运行方式分类
1)单用户单任务操作系统:只允许一个用户上机,且只允许用户程序作为一个任务运行,是最简单的微机操作系统,主要配置在8位和16位微机上
例子:CP/M,MS-DOS
2)单用户多任务操作系统:只允许一个用户上机,但是允许用户把程序分为若干个任务,使它们并发执行
例子:Windows
3)多用户多任务操作系统:允许多个用户通过各自终端,使用同一台机器,共享主机系统中的各种资源,每个用户程序又可进一步分为几个任务,使它们并发执行
例子:UNIX OS,Linux OS,Solaris OS
1.3 操作系统的基本特性
多道批,分时,实时系统共同具有并发,共享,虚拟,异步四个基本特征
1.3.1 并发
1、作用:有效提高系统中的资源利用率,增加系统的吞吐量
2、并行与并发:
并行指多个事件在同一时刻发生发生
并发指多个事件在同一时间间隔内发生
理解宏观同时,微观分时:因为时间间隔太短,如10ms,导致看上去在同时运行
3、进程:指在系统中能够独立运行并作为资源分配的基本单位,由一组机器指令,数据和堆栈组成,是一个能够独立运行的活动实体
好处:进程的并发执行,能够极大地提高系统资源的利用率,增加系统的吞吐量
1.3.2 共享
1、共享概念:OS环境下的资源共享或资源复用,是指系统中的资源可供内u你众多个并发执行的进程共同使用
2、资源共享方式(资源属性不同,共享方式不同)
1)互斥共享:当资源被进程A访问时,只要A未用完资源,其他进程就无法访问。
在一段时间内只允许一个进程访问的资源称为临界资源(或独占资源),如打印机,磁带机等
2)同时访问方式:“同时”是宏观上的同时,微观上是交替进行。如磁盘设备。
3、并发与共享:并发和共享是多用户(OS)的两个最基本特征,互为存在的条件。一方面资源共享是以进程的并发执行为条件,另一方面,若系统并不能对资源共享实施有效管理,以协调好诸进程对共享资源的访问,必然会影响到诸进程间并发执行的程度。
1.3.3 虚拟
1、OS虚拟概念:通过某种技术将一个物理实体变为若干个逻辑上的对应物的功能称为“虚拟”。用户感应到的是虚的。
2、实现虚拟技术:
1)时分复用:利用某一设备为一用户服务的空闲时间转去为其它用户服务
①虚拟处理机技术:利用多道程序设计技术,将一台物理上的处理及虚拟为多台逻辑上的处理机
②虚拟设备技术:如将一台临界资源打印机通过虚拟设别技术变为多台逻辑上的打印机,供多个用户“同时”打印
2)空分复用:用于提高存储空间的利用率。利用存储器的空闲空间分区域存放和运行其他的多道程序,以此来提高内存的利用率。无法在逻辑上扩大存储器的容量。
虚拟存储技术:实现内存的分时复用,在逻辑上扩大存储器的容量
3、设N是某物理设备所对应的虚拟的逻辑设备数,则:
时分复用:每台虚拟设备的平均速度小于等于物理设备速度的1/N
空分复用:每台虚拟折别平均占用空间小于等于物理设备拥有空间的1/N
1.3.4 异步
1、异步概念:进程是以人们不可预知的速度向前推进的
1.4 操作系统的主要功能
传统的OS应具有处理机机制,存储器管理,设备管理和文件管理等基本功能,为方便用户使用OS,还需向用户提供方便的用户接口
1.3.1 处理机管理机制
进程是处理机分配和运行的基本单位,处理机管理的功能主要有:创建和撤销进程,对诸进程的运行进行协调,实现进程之间的信息交换,按照一定的算法把处理机分配给进程
1、进程控制:为作业创建进程,撤销已结束的进程,控制进程在运行过程中的状态转换
2、进程同步:为多个进程运行进行协调,有进程互斥和进程同步两种协调方式。实现进程同步常用的是信号量机制。
3、进程通信:实现相互合作进程之间的信息交换
4、调度:包括作业调度和进程调度
作业调度:从后备队列将作业调入内存,分配内存,建立进程,插入到进程就绪队列中
进程调度:从进程就绪队列选出进程,分配处理机运行
1.4.2 存储器管理功能
存储及管理的主要任务是为多道程序的运行提供良好的环境,提高存储器利用率,方便用户使用,能从逻辑上扩充内存。具有内存分配和回收,内存保护,地址映射,内存扩充等功能
1、内存分配:为程序分配内存,减少不可用内存空间,包括静态分配和动态分配两种内存分配方式
2、内存保护:确保程序在各自内存空间内运行,互不干扰;禁止用户访问操作系统程序和数据,访问非共享的其他用户程序
3、地址映射:将地址空间中的逻辑地址(程序的地址都是从0开始的)转换为内存空间中与之对应的物理地址
4、内存扩充:借助虚拟存储技术,从逻辑上扩充内存容量,能够实现请求调入和置换两个功能
1.4.3 设备管理功能
设备管理的主要任务
完成用户进程提出的I/O设备请求,分配进程所需的I/O设备,完成指定I/O操作;
提高CPU和I/O设备的利用率,提高I/O速度,方便用户使用I/O设备。
设备管理具有缓冲管理,设备分配,设备处理以及虚拟设备等功能
1、缓冲管理:缓和CPU和I/O设备速度不匹配的矛盾,提高CPU的利用率,进而提高系统吞吐量
具有单缓冲机制,双向同时传送数据的双缓冲机制,能供多个设备共同使用的公用缓冲机制。
2、设备分配:根据用户进程的I/O请求,系统现有资源以及按照某种设备分配策略,为之分配所需的设备
3、设备处理:又称设备驱动程序,用于实现CPU和设备控制器之间的通信。
1.4.4 文件管理功能
文件管理的主要任务是对用户文件和系统文件进行管理以方便用户使用,并保证文件的安全性。具有文件存储空间的管理,目录管理,文件的读写,文件的共享与保护等功能
1、文件存储空间的管理:为每个文件分配必要的外存空间,提高外存的利用率,进而提高文件系统的存放速度。
2、目录管理:为文件建立目录,方便用户进行文件存取,并提供目录查询手段。
3、文件的读写管理与保护:
文件读写管理:根据用户的请求,从外存中读取数据或者将数据写入外存
文件保护:防止系统中的文件被非法窃取和破坏
1.4.5 操作系统与用户之间的接口
接口可分为:用户接口和程序接口
1、用户接口:便于用户直接或间接地控制自己的作业,包括联机用户接口,脱机用户接口,图形用户接口
1)联机用户接口:为联机用户提供
2)脱机用户接口:为批处理作业地用户提供
3)图形用户接口:把用户从命令中解放出来
2、程序接口:为用户在执行中访问系统资源而设置的,使用户取得操作系统服务的唯一途径。由一组系统调用组成
1.4.6 现代操作系统新功能
1、系统安全:认证技术,密码技术,访问控制技术,反病毒技术
2、网络功能和服务:网络通信,资源管理,应用互操作
3、支持多媒体:接纳控制功能,实时调度,多媒体文件的存储
1.5 OS结构设计
1.5.1 传统操作系统结构
无结构OS(第一代) -> 模块化结构OS(第二代) -> 分层式结构OS(第三代) -> 微内核结构OS
前三者称为传统结构的OS,微内核结构OS称为现代结构的OS
1、无结构操作系统
OS是为数众多的一组过程的集合,相互之间可以任意调用,致使操作系统内部复杂混乱
2、模块化结构OS
OS不再是由众多的过程直接构成,而是按照功能划分为若干具有一定独立性的模块
衡量模块独立性标准:内聚性,耦合度
优点:提高OS设计的正确性、可理解性和可维护性;增强OS地可适用性;加速OS地开发过程
缺点:很难满足对接口的实际需求;模块设计决定跟难做到都是建立在可靠的决定基础上
3、分层式结构OS
分层设计基本原则是每一步设计都建立在可靠的基础上。
优点:易保证系统的正确性;易扩充和易维护
缺点:系统效率降低
1.5.2 客服/服务器模式(C/S)简介
1、客户/服务器系统主要由客户机,服务器,网络系统组成
2、客户/服务器之间的交互:客户发送请求消息 -> 服务器接收消息 -> 服务器回送消息 -> 客户机接收消息
3、客户/服务器模式优点:数据的分布处理与存储,便于集中管理,灵活性和可扩充性,易于改编应用软件
4、客户/服务器模式缺点:不可靠性,瓶颈问题
1.5.3 面向对象的程序设计技术简介
1、面向对象基本概念:对象,对象类,继承
2、面向对象技术优点:通过重用提高产品质量和生产率,使系统具有更好的易修改性和易扩展性,易于保证系统的“正确性”和“可靠性”。
1.5.4 微内核OS结构
能有效支持多处理机运行,适用于分布式系统环境。例子:Windows XP
1、微内核操作系统基本概念:
微内核操作系统多数采用基于客户/服务器模式的微内核结构,将操作系统分为两大部分:微内核和多个服务器
1)足够小的内核:内核只包操作系统中最基本的部分,与硬件处理紧密相关的部分,一些较基本的功能,客户和服务器之间的通信等。因此内核很小
2)基于客户/服务器模式
操作系统最基本的部分放到内核,把操作系统绝大部分功能放到微内核外面的一组服务器中,服务器以进程的方式实现。
3)应用“机制与策略分离”原理
机制:实现某一功能的具体执行机构。通常将机制放在OS微内核中
策略:在机制及出山借助某些参数和算法来实现该功能的优化,或达到不同的功能目标
4)采用面向对象技术:有助于保证操作系统的正确性,可靠性,易修改性,易扩展性
2、微内核基本功能
机制部分以及与硬件相关的部分放入为内核中
1)进程管理:进程管理采用“机制与策略分离”的原理。如进程调度分为机制和策略两部分,分别放在微内核和进程管理服务器中
2)低级存储器管理:微内核中只配置最基本的低级存储器管理机制。像实现虚拟存储器管理策略放到存储器管理服务器中
3)中断和陷入处理:微内核捕获中断和陷入事件,前期处理后交给相应的服务器处理
总的来说,微内核OS将进程管理,存储器管理,I/O管理这些功能一分为二,属于机制的很少部分放到微内核中,另外绝大部分放到各种服务器上来实现
3、微内核操作系统的优点
提高了系统的可扩展性,增强了系统的可靠性,可移植性强,提供了分布式系统的支持,融入了面向对象技术
4、微内核操作系统存在的问题:微内核操作系统的运行效率有所降低
第2章 进程描述与控制
2.1 前趋图和程序执行
2.1.1 前趋图
前趋图是指一个有向无环图,可记为DAG,用于描述进程之间执行的先后顺序。
结点表示进程或程序段,甚至一条语句
有向边表示两个结点存在的前趋关系或偏序关系
P1 - > P2,则P2开始执行之前,P1必须完成。
初始节点:没有前趋的结点
终止结点:没有后继的结点
2.1.2 程序顺序执行
1、程序顺序执行:一个程序由若干程序段组成,在执行时需要按照某种先后次序执行
2、程序顺序执行特征:顺序性,封闭性,可再现性
2.1.3 程序并发执行
1、程序的并发执行
只有不存在前趋关系的程序之间才有可能执行并发,否则无法执行并发
2、程序并发执行时的特征
间断性:进程A执行需要进程B的数据,而进程B尚未输入数据,进程A只能暂停执行
失去封闭性:系统资源被并发的程序共享
不可再现性:由于失去封闭性,进程A,B共享变量N。A使N自增1,B使打印N,然后使N=0。由于并发,运行A,B,我们不能知道最终N的值是多少。可能是0,1,2
2.2 进程的描述
2.2.1 进程的定义和特征
1、引入进程目的:为了使程序能够并发执行,并且可以对并发执行的程序加以描述和控制
2、进程控制块:一个专门的数据结构,称为进程控制块PCB。用于控制和管理进程
3、进程实体:由程序段,相关的数据段和PCB构成了进程实体。简称进程。创建进程实际上是创建进程实体中的PCB
4、进程不同角度的定义:
进程是程序的一次执行
进程是一个程序及其数据在处理机上顺序执行时所发生的活动
进程是具有独立功能的程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位
传统OS中的进程定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
5、进程特征
进程 != 程序
动态性:进程实质是进程实体的执行过程,动态性是进程的最基本的属性;而程序是静态的
并发性:指多个进程实体同存于内存中,且能在一段时间内同时运行;程序不能参与并发执行
独立性:指进程实体是一个能独立运行,独立获得资源和独立接受调度的基本单位
异步性:进程是按异步方式运行的;OS配置有进程同步机制,保证进程并发执行结果可再现。
2.2.2 进程的基本状态及转换
1、进程生命周期内的三种基本基本状态
就绪状态,执行状态,阻塞状态
1)就绪状态:进程已分配到除CPU以外的所有必要资源,只要获得CPU就可立即执行
2)执行状态:进程获得CPU,其程序正在执行的状态
3)阻塞状态:正在执行的进程由于发生某事件而暂时无法执行时的状态,此时引起进程调度,OS把处理机分配给另一个就绪进程
2、三种基本状态的转换
就绪 -> 执行:进程调度
执行 -> 就绪:时间片用完
执行 -> 阻塞:如I/O请求
阻塞 -> 就绪:I/O请求完成
3、创建进程和终止状态
1)创建状态:创建工作尚未完成的进程所处的状态,如系统没有足够的内存无法装在进程;
创建 -> 就绪:许可,转入就绪状态
2)终止状态:进程可能执行完毕,出现错误,被系统杀死,进入终止状态。进入终止状态进程不能被执行。
执行 -> 终止:释放
2.2.3 挂起操作和进程状态的转换
1、挂起:挂起进程意味着此时进程处于静止状态;若进程正在执行,则暂停执行,若处于就绪状态,则不接受进程调度;与挂起对应的操作为激活操作
2、挂起的引入:终端用户需要,父进程请求,符合调节需要,操作系统的需要
3、进程状态转换增加:挂起原语Suspend,激活原语Active
就绪 -> 静止就绪 : 挂起
静止就绪 -> 就绪 : 激活
阻塞 -> 静止阻塞 : 挂起
静止阻塞 -> 阻塞 : 激活
静止阻塞 -> 静止就绪 : 释放
执行 -> 静止就绪:挂起
创建 -> 静止就绪:许可
2.2.4 进程管理中的数据结构
1、操作系统中用于管理控制的数据结构
OS管理控制资源和进程的四类数据结构:内存表,设备表,文件表,进程表(PCB)
2、进程控制块PCB具体作用
1)独立运行基本单位的标志:PCB是进程存在于系统中的唯一标志,系统通过感知PCB感知进程的存在
2)能实现间断性运行方式:PCB可以保存进程因为阻塞而暂停执行时的CPU现场信息,供进程被再次调度执行时恢复CPU现场信息
3)提供进程管理所需要的信息:操作系统总是根据PCB实施对进程的控制和管理
4)提供进程调度所需要的信息:PCB中保存了进程的状态信息和其他进程调度需要的信息
5)实现与其他进程的同步与通信。PCB中设置有用于同步的信号量,实现进程通信的区域或通信队列指针
3、进程控制块中的信息
1)进程标识符:唯一的标识一个进程;包括外部标识符(面向用户)和内部标识符(面向系统)
2)处理机状态
处理机状态信息也成为处理机的上下文,主要是由处理机的各种寄存器的内容组成。进程被切换时,处理机状态信息保存在PCB中,以便该进程重新执行时能够从断点继续执行
3)进程调度信息
包括:进程状态,进程优先级,进程调度所需的其他信息,事件(即阻塞原因)
4)进程控制信息
包括:程序和数据地址,进程实体中的程序和数据的内存和外存地址,进程同步和通信机制,资源清单,链接指针
4、进程控制块的组织方式
1)线性方式:把所有PCB放到一张线性表中;
2)链接方式:把具有相同状态的PCB分别通过PCB中的链接字链接成一个队列。如就绪队列,阻塞队列,空白队列
3)索引方式:系统根据进程状态的不同,建立索引表。如就绪索引表,阻塞索引表
2.3 进程控制
2.3.1 操作系统内核
基本概念:
系统态:又称管态,内核态;具有较高的特权能执行一切指令,范围跟所有寄存器和存储区,传统OS运行在系统态
用户态:又称目态;具有较低特权,只能执行规定的指令,访问指定的寄存器和存储区,应用程序一般运行在用户态
原语:用于完成一定功能的过程或函数,由若干指令组成
OS内核两大功能:
支撑功能:提供给OS以及其它众多模块所需要的一些基本功能,以便支撑这些模块工作;
资源管理功能:
1、三种最基本的支撑功能:中断处理,时钟管理,原语操作
1)中断处理:字面意思
2)时钟管理:如时间片管理,实时系统的截至时间控制
3)原语操作:是“原子操作”,用于完成一定功能的过程。如Suspend挂起原语
2、资源管理功能
进程管理,存储器管理,设备管理
2.3.2 进程的创建
1、进程创建进程的事件:用户登录,作业调度,提供服务,应用请求
2、进程创建过程:创建原语Creat
申请空白PCB -> 为新进程微分其运行所需的资源 -> 初始化进程控制块PCB -> 如果进程就绪队列能够接纳新进程,将新进程插入就绪队列
2.3.3 进程的终止
1、引起进程终止事件:
正常结束
异常结束:越界错,保护错,非法指令,运行超时,等待超时,算术运算错误,I/O故障
外界干预:操作员或操作系统干预,父进程请求,父进程终止
2、进程终止过程
根据被终止进程标识符找到PCB,读取被终止进程状态 -> 执行状态:立即停止执行并置调度标志为真;还有子孙进程,将所有子孙进程杀死 -> 将被终止进程占用的所有资源归还给父进程或系统 -> 移除被终止进程PCB,等待其他程序搜集信息 -> 搜集完信息清零PCB
2.3.4 进程的阻塞与唤醒
1、引起阻塞与唤醒事件
向系统请求资源失败;等待某种操作完成;新数据尚未到达;等待新任务到达
2、进程阻塞过程:原语block
阻塞事件发生 -> 进程调用阻塞原语自我阻塞 -> 若为执行状态,则立即停止 -> 将PCB插入到阻塞队列
3、进度唤醒过程:原语wakeup
被阻塞进程期待的事发生 -> 有关进程调用wakeup原语 -> 把被阻塞进程从阻塞队列移出 -> PCB状态修改为就绪 -> 插入PCB到就绪队列
注意block和wakeup必须成对使用
2.3.5 进程的挂起与激活
1、进程挂起过程:原语suspend
引起进程挂起事件发生 -> OS利用挂起原语suspend将指定进程或处于阻塞状态的进程挂起。
根据被挂起进程状态不同,被挂起后的状态也不同
若被挂起进程正在执行,则需要进行进程调度
2、进程激活过程
发生激活进程的事件 -> OS利用激活原语active将指定进程激活
根据被激活进程状态不同,被激活后状态不同
被激活进程需要与当前进程进行优先级比较,决定执行哪个进程
2.4 进程同步
2.4.1 进程同步基本概念
进程同步主要任务:协调进程执行执行,使程序的执行具有可再现性
1、多进程两种形式的制约关系:间接相互制约关系(源于进程间的资源共享),直接制约关系(源于进程间的合作)
2、临界资源:诸进程采取互斥方式实现对这种资源共享;
生产者-消费者问题
3、临界区:每个进程中访问临界资源的那段代码称为临界区
若能保证诸进程互斥的进入自己的临界区,便可实现随临界资源的互斥访问
4、同步机制应遵循的规则(重点)
空闲让进,忙则等待,有限等待,让权等待
2.4.2 硬件同步机制
软件不行,硬件,行!
关中断,利用Test-and-Set指令实现互斥,Swap指令
1、关中断:即进程执行临界区时,关闭系统中断,这样其他进程就无法引发调度,也就不会发生进程切换
许多缺点:滥用可能导致严重后果;关中断时间长影响系统效率;不适用于多cpu系统
2、利用Test-and-Set指令实现互斥:通俗点说,给每个临界资源装一把锁,没人用的时候,锁开着,有人用的时候,把锁锁上。
3、Swap指令(对换指令):原理和TS基本上一样。
利用上述方法都不符合“让权等待”原则,也难以将它们用于解决复杂的进程同步问题
2.4.3 信号量机制
1、整型信号量——不符合“让权等待”
wait(S){
while(S <= 0)
S--;
}
signal(S){
S++
}
一个表示资源数目的整形量S,两个原子操作wait和signal。S除了初始化只能被wait和signal访问,wait和signal操作不可中断
2、记录型信号量
一个代表资源数目的整型变量value,一个进程链表指针
typedef struct{
int value;
struct process_control *list;
}semaphore;
wait(semaphore *S){
S->value--;
if(S->value < 0)
block(S->list);//进程调用block原语,自我阻塞
}
signal(semaphore *S){
S->value++;
if(S->value <= 0)
wakeup(S->list);
}
S->value<0 时,|S->value|表示被阻塞进程的数目
若S->value的初始值为1,则说明只允许一个进程访问临界资源
3、AND型信号量
上述进程是针对多个进程访问一个临界资源,现在需要一个进程访问多个临界资源
AND同步机制基本思想:将进程在整个运行过程中需要的所有资源,一次性的分配给进程,待进程使用完之后在一起释放
Swait(S1,...,Sn){
while(TRUE){
if(Si >= 1 &&...&& Sn >= 1){
for(i = 1;i <= n;i++)Si--;
break;
}
else{
将进程阻塞,放入第一个发现Si<1的等待队列中;
将进程指针指向Swait开头;
}
}
}
Ssignal(S1,...,Sn){
for(i=1; i<=n; i++){
Si ++;
将Si等待队列中的进程转入就绪队列;
}
}
4、信号量集
AND信号量扩充
Swait(S1,t1,d1...Sn,tn,dn)
Ssignal(S1,t1,d1...Sn,tn,dn)
ti为资源Si分配的下限值,即要求ti<=Si,否则不予以分配;di为进程对资源的需求值,即原来的Si = Si-1变为了
Si = Si-di
特殊情况:
Swait(S,d,d):表示允许进程一次申请d个资源,当现有资源数少于d时,不予分配
Swait(S,1,1):退化为记录型信号量(S>1)或互斥信号
Swait(S,1,0):当S>=1时,允许多个进程进入某特定区;当S=0时,禁止任何进程进入特定区
2.4.4 信号量的应用
1、利用信号量实现进程互斥
为临界资源设置信号量S
wait和signal必须成对出现
2、利用信号量实现前趋关系
如两个并发进程P1和P2,各自有语句S1和S2,希望S1先执行,这样写
//S = 0
//进程P1
S1;
sinal(S);
//进程P2
wait(S);
S2;
2.4.5 管程机制
不想写,自个看书
2.5 经典的进程同步问题
2.5.1 生产者消费者问题
1、利用记录型信号量解决
/*
互斥信号量 mutex:用于各进程对缓冲区的互斥访问
信号量empty、full:分别表示缓冲区中空缓冲单元和满缓冲单元的数量
*/
semaphore mutex=1, empty=n, full=0;// 定义信号量
item buffer[n]; // 定义缓冲区
int in=0, out=0; // 定义下标指示变量
void proceducer() //生产者如何执行(如何往缓冲区放东西)
{
do{
产生一个商品放入nextp中;
wait(empty); //等待缓冲区有地方
wait(mutex); //等待可以使用缓冲区
buffer[in] = nextp;
in = (in + 1) % n;
signal(mutex); //告诉其他进程:缓冲区可以使用了
signal(full); //告诉其他进程:缓冲区多了一个商品
}while(1);
}
void consumer() //消费者如何执行(如何从缓冲区取东西)
{
do{
wait(full); //等待缓冲区有商品
wait(mutex); //等待可以使用缓冲区
nextc = buffer[out];
out = (out + 1) % n;
signal(mutex); //告诉其他进程:缓冲区可以使用了
signal(empty); //告诉其他进程:缓冲区空出一个地方
消费商品 nextc;
}while(1);
}
2、利用AND信号量解决
semaphore mutex=1, empty=n, full=0;// 定义信号量
item buffer[n]; // 定义缓冲区
int in=0, out=0; // 定义下标指示变量
void proceducer() //生产者如何执行(如何往缓冲区放东西)
{
do{
produce;
Swait(empty,mutex);
buffer[in] = nextp;
in := (in + 1) % n;
Ssignal(mutex,full);
}while(1);
}
void consumer() //消费者如何执行(如何从缓冲区取东西)
{
do{
Swait(full,mutex);
nextc = buffer[out];
out = (out + 1) % n;
Ssignal(mutex,empty);
consume;
}while(1);
}
2.5.2 哲学家进餐问题
1、记录型信号量
/*
筷子是共用的:身边任何一个人吃饭,自己就没法吃(缺少筷子)
每根筷子都是临界资源 :每次只允许一位哲学家使用
可以为每根筷子设置一个信号量:实现对筷子的互斥使用
缺点:存在bug
如果每个人开始都先拿自己左边的筷子
可能导致人手一根筷子,而拿不到第二根筷子
从而全部阻塞,引起死锁。
解决办法
至多只允许四个人“同时”拿左边的筷子,最终保证至少一个人能吃上饭。
仅当左右筷子均可用时,才允许他拿筷子进餐。(AND信号量)
规定奇数号哲学家先拿起他左边的筷子,再拿右边的筷子;而偶数号哲学家先拿起他右边的筷子,再拿左边的筷子。
*/
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i) //第i个哲学家的活动
{
do{
wait(chopstick[i]); //拿左筷子
wait(chopstick[(i+1) % 5]); //拿右筷子
吃饭;
signal(chopstick[i]); //放左筷子
signal(chopstick[(i+1) % 5]); //放右筷子
思考;
}while(1);
}
2、利用AND型信号量
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i)
{
do{
Swait(chopstick[i], chopstick[(i+1)%5]);
吃饭;
Ssignal(chopstick[(i+1)%5], chopstick[i]);
思考;
}while(1);
}
2.5.3 读者-写者问题
1、利用记录型信号量
/*
利用记录型信号量
用信号量wmutex控制写者与其他进程的互斥
设整型变量readcount,记录正在进行读操作的读者数目
∵readcount=0时,写者才可以写
∴只有这时,读者才需要执行wait(wmutex),看看是否有写者在写
因为readcount被所有读者共享,所以还要用信号量rmutex控制它们对readcount的操作。
*/
semaphore rmutex=1, wmutex=1;
int readcount =0;
//读者进程:
do{
wait(rmutex);
if (readcount==0)
wait(wmutex);
readcount ++;
signal(rmutex);
读操作;
wait(rmutex);
readcount - -;
if (readcount == 0)
signal(wmutex);
signal(rmutex);
}while(1);
//写者进程:
do{
wait(wmutex);
写操作;
signal(wmutex);
}while(1);
/*
新要求
如果最多只允许RN个读者读,该怎么解决?
利用信号量集解决
方法
设信号量L,初始值为RN,以控制读者的数目
每当有一个读者要读时,执行swait(L,1,1),使L减1
当有RN个读者正在读时,L=0
再来一个读者要读的话,便会被阻塞。
设信号量 mx,初始值为1(互斥信号量),以控制写者
*/
semaphore L=RN, mx=1;
//读者进程:
do{
Swait (L,1,1);
Swait (mx,1,0);
读操作;
Ssignal (L,1);
}while(1);
//写者进程:
do{
Swait (mx,1,1;L,RN,0);
写操作;
Ssignal (mx,1);
}while(1);
需要练习!!!!!!!!
2.6 进程通信
1、进程通信:指进程之间的信息交换
2、低级通信特点:效率低;通信对用户不透明
3、高级通信特点:使用方便,OS向用户提供实现高级通信的命令(原语);高效地传送大量数据;
2.6.1 进程通信的类型(高级)
四大类:共享存储器系统,管道通信系统,消息传递系统,客户机-服务器系统
1、共享存储器系统:相互通信的进程共享某些数据结构或共享存储区
1)基于共享数据结构的通信方式:诸进程公用某些数据结构。如生产者-消费者问题中的有界缓冲区。属于低级通信
2)基于共享存储区的通信方式:在内存中划出一块共享存储区域,诸进程可对该共享区的读或写交换信息,实现通信。属于高级通信
2、管道通信系统
1)“管道“指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件
2)发送进程以字符流的形式将大量数据送入管道,接受进程从管道中读取数据
3)管道机制需提供三种协调能力:互斥、同步、确定对方是否存在
3、消息传递系统
1)以格式化的信息为单位,将通信数据封装在消息中,利用OS提供的一组通信命令(原语)在进程间进行消息传递,完成进程间的数据交换
2)分类:
直接通信方式:通信双方直接通信
间接通信方式:发送进程和接收进程通过共享中间实体(又称邮箱)进行通信
4、客户机-服务器系统
三类:套接字,远程过程调用,远程方法调用
1)套接字
一个套接字就是一个通信表示类型的数据结构,包括基于文件型和基于网络型的套接字
基于文件型:类似于管道
基于网络型:采用非对称方式通信
优势:每个套接字拥有唯一的套接字号(套接字标识符),确保了通信双方之间逻辑链路的唯一性;隐藏了通信设施及实现细节
2)远程过程调用和远程方法调用
远程过程调用是一个通信协议,用于通过网络连接的系统。若设计的软件设计面向对象编程,也成为远程方法调用
其他概念:
网络守护进程:本地客户进程,远程服务器进程,负责消息传递
存根:客户存根,服务器存根。用于实现远程过程调用RPC的透明性
2.6.2 消息传递通信的实现方式
2.6.2.1直接消息传递系统
1)直接通信原语:
(1)对称寻址方式
send(receiver,message);
receive(sender,message);
不利于实现进程定义的模块化
(2)非对称寻址方式
send(P,message);
receive(id,message);
2)消息的格式
定长消息格式:用户使用不方便;能减少对消息的处理的存储开销
变长消息格式:方便用户;对消息的处理的存储开销更多
3)进程的同步方式
发送进程阻塞,接收进程阻塞
发送进程不阻塞,接收进程阻塞
发送进程不阻塞,接收进程不阻塞
4)通信链路
发送进程请求OS建立通信链路,主要用于计算机网络
发送进程利用发送命令原语,OS建立链路,主要用于单机系统,包括单向通信链路和双向通信链路
2.6.2.2信箱通信
信箱即进程通信的共享中间实体
1)信箱结构:
信箱头:存放信箱描述信息,如信箱标识符,信箱拥有者,信箱空格数等
信箱体:由若干可以存放消息的信箱格组成
2)信箱通信原语:
(1)邮箱的创建和撤销
(2)消息的发送和接收
Send(mailbox,message);//发送一条消息到指定邮箱
Receive(mainbox,message);//从指定邮箱接收一条消息
3)邮箱的类型
私用邮箱:用户进程为自己创建的邮箱,邮箱拥有者可读取数据,其他用户只能发送消息到邮箱
公用邮箱:操作系统创建
共享邮箱:某进程创建
4)邮箱通信关系:
一对一;多对一,也称客户/服务器交互;一对多,如广播;多对多,使用公用邮箱
2.6.3 直接消息传递系统实例
消息缓冲区数据结构,PCB有关通信的数据项,发送原语与接收原语
2.7 线程基本概念
2.7.1 线程的引入
1、目的:为了减少程序并发执行时所付出的时空开销,使OS具有更好的并发性
2、进程的两个基本属性
1)进程是一个可拥有资源的独立单位
2)进程是一个可独立调度和分派的基本单位
2、程序并发执行带来的时空开销
创建进程,撤销进程,进程切换过程,系统必须为之付出较大的时空开销
3、线程在OS中引入线程,以线程作为调度和分派的基本单位,可有效改善多处理机系统的性能
2.7.2 线程与进程的比较
1、调度的基本单位:线程取代进程作为调度和分派的基本单位
2、并发性:线程可并发
3、拥有资源:进程依旧为拥有系统资源的一个基本单位,线程仅拥有必不可少的、能保证独立运行的资源。线程可共享该进程所拥有的资源
4、独立性:同一进程中的不同线程之间的独立性要比不同进程之间的独立性低得多
5、系统开销:线程创建、撤销、切换开销远低于进程
6、支持多处理机系统:多线程进程可以将进程中的多个线程分配到多个处理机上
2.7.3 线程状态和线程控制块
1、线程运行状态:执行状态、就绪状态、阻塞状态
2、线程控制块TCB:包含线程标识符、一组寄存器、线程运行状态、优先级、线程专有存储区、信号屏蔽、堆栈指针等
3、多线程OS进程属性
进程不再是一个可执行的实体
1)进程是一个可拥有资源的基本单位
2)多个线程可并发执行
3)进程已不是可执行的实体:但仍保存与执行相关的状态
2.8 进程的实现
2.8.1 线程实现方式
1、内核支持线程KST
内核线程在内核空间实现
优点:内核可同时调度同一进程中多个线程并行执行
某个线程被阻塞,内核可调度该进程其他线程执行
线程切换比较快,开销小
采用多线程技术,系统执行效率高
缺点:
用户线程模式切换开销大:用户进程的线程在用户态运行,而线程调度和管理在内核实现
2、用户级线程ULT
用户级线程与内核无关
设置用户级线程的系统,其调度仍以进程为单位进行;若系统设置内核支持线程,调度是以线程为单位进行
优点:线程切换无需切换到内核空间,节省模式切换开销
调度算法可以是线程专用的
用户级线程实现与OS系统无关,因为关于线程管理的代码属于用户程序一部分(自己管自己)
缺点:
系统调用阻塞:进程某个线程被阻塞,则进程中其他线程也被阻塞
单纯的用户级线程实现方式中,内核每次分配给进程一个CPU,同时进程中只能有一个线程执行
3、组合方式ULT/KST:
优点:用户级线程通过时分多路复用内核支持线程实现一些内核支持线程对应多个用户级线程
同一个进程内的多个线程可以同时在多处理机器上并行执行,并且在一个线程阻塞时,并不需要将整个进程阻塞
三种模型:
1)多对一:将多个用户线程(一般属于同一个进程)映射到一个内核控制线程
优点:线程管理开销小,效率高
缺点:如果一个线程发生阻塞,则整个进程都会被阻塞
同一时刻,只有一个线程访问内核,多个线程不能同时在多个处理及上运行
2)一对一:一个线程对应一个内核支持线程
优点:比一对多具有更好的并发性,当一个线程阻塞时,允许调度另一个线程运行
允许多线程并行运行在多处理机系统上
缺点:每创建一个用户线程,就需要创建一个内核线程,开销较大
3)多对多模型:将许多用户线程映射到相对较少的内核线程上
优点:具备上述两种模型的优点
2.8.2 线程的实现
1、内核支持线程
创建进程时,准备一个任务数据区PTDA用于存放进程创建的线程的TCB
内核支持线程调度与切换与进程调度与切换类似,分抢占式和非抢占式,但开销要小于进程
2、用户级线程
用户线程运行在一个中间系统上,中间系统有两种实现方式:运行时系统,内核控制线程
1)运行时系统——2.8.1中的纯用户级线程实现方式
实质是用于管理和空值线程的函数的集合,包括线程调用、调度、撤销、同步和通信等。是用户级线程与内核间的接口
用户线程如何获取资源?将资源请求发给中间系统,中间系统通过系统调用获得系统资源
2)内核控制线程——2.8.1中的组合方式实现方式
又称轻型进程LWP,即实现2.8.1中的映射
线程池将内核和用户线程隔绝开来,用户线程通过LWP与内核线程连接
当一个用户线程运行时,只需要将他连接到一个LWP中,该线程就可以获得内核支持线程的所有属性
注意:内核级线程阻塞时,与之相连的多个LWP也将随之阻塞,进而与LWP相连的用户级线程也被阻塞
2.8.3 线程的创建和终止
1、线程创建:创建新线程时,需要利用一个线程创建函数
2、线程终止:终止线程调用相关的函数对它执行终止操作
注意,线程被终止后,并不立即释放占有的资源,此时仍可被其他程序调用,只有当进程中其他线程执行分离函数,才释放资源