1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > [操作系统]进程管理 进程同步 死锁相关 处理机调度

[操作系统]进程管理 进程同步 死锁相关 处理机调度

时间:2020-12-28 08:53:18

相关推荐

[操作系统]进程管理 进程同步 死锁相关 处理机调度

进程管理

进程与线程

程序执行方式

顺序执行

单道批处理系统的执行方式

顺序性:按照程序结构所指定的次序执行(可能有分支或循环)。

封闭性:独占全部资源,计算机的状态只由于该程序的控制逻辑所决定,结果不收外界因素影响。

可再现性:初始条件相同则结果相同。

并发执行

为了提高资源利用率并发执行。

间断性:一个程序可能走到中途停下,失去原有的不变特性。

失去封闭性:共享资源,受其他程序的控制逻辑的影响。

失去可再现性:外界环境在程序的两次执行期间发生变化,失去原有的可重复特征。

并发执行的条件:达到封闭性和可再现性

进程概念与特征

程序:是静态的,就是存放在磁盘里的可执行文件,就是一系列的指令集合。

进程:是动态的,是程序的一次执行过程。

同一个程序对应多个进程

程序是指令、数据及其组织形式的描述;进程是程序(那些指令和数据)的真正运行实例。

进程是暂时的,是一个状态变化的过程;程序是永久的,可长久保存。

通过多次执行,一个程序可产生多个进程;通过调用关系,一个进程可包括多个程序。

进程需要一些资源才能完成工作,如CPU使用时间、存储器、文件以及I/O设备。

进程组成

PCB

进程唯一标识PCB,保存进程的全部信息

操作系统需要对各个并发进程进行管理,但凡管理时需要的信息,都会被放在PCB中

PCB存放于内核核心区,要通过系统调用间接访问

进程被创建时,PCB被创建,进程结束时,PCB被回收。

保存信息

进程描述信息

进程标识符PID用户标识符UID

进程控制和管理信息

CPU、磁盘、网络流量使用情况统计、、、进程当前状态:就绪态、阻塞态、运行态

资源分配清单

正在使用哪些文件正在使用哪些内存区域正在使用哪些I/O设备

处理机相关信息

如PSW、PC等等相关信息(用于实现进程切换)

进程组成

进程实体由程序段+数据段+PCB组成。

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

进程是动态的,进程实体是静态的。

进程实体反应了进程在某一时刻的状态。

PCB是给操作系统使用的

程序段数据段是给进程自身使用的

进程特征

动态性

进程是程序一次执行过程,是动态地产生,变化和消亡的,进程最基本特性

并发性

内存中有多个进程实体,各进程可并发执行

独立性

进程是能独立运行,独立获得资源,独立接受调度的基本单位

异步性

各进程按各自独立的,不可预知的速度向前推进,操作系统要提供进程同步机制来解决异步问题

结构性

每个进程都会配置一个PCB,结构上看,进程由程序段,数据段,PCB组成

进程的状态与转换

状态

3种基本状态:运行、就绪、阻塞

进程运行过程中,请求等待某个事件的发生而无法继续执行称为阻塞态

运行态(Running):占有CPU,并在CPU上运行

单CPU情况下,同一时刻只会有一个进程处于运行态,多核CPU情况下,可能有多个进程处于运行态

就绪态(Ready):已经具备运行条件,而无空闲CPU,而暂时不能运行

阻塞态(Waiting):因缺少某个资源而暂时不能运行

创建态(New):进程正在被创建,操作系统为进程分配资源,初始化PCB

终止态(Terminated):进程正在从系统中撤销,操作系统会回收进程拥有的资源,撤销PCB

*PCB中,会有一个变量state来表示进程的当前状态。*如1表示创建态,2表示就绪态,3表示运行态。为了对同一个状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来。

状态间的转换

运行态到阻塞态是进程主动作出的选择

阻塞态到就绪态是进程被动获得资源时的转换

进程的组织方式(不重要)

链接方式

按照进程状态将PCB分成多个队列

操作系统持有指向各个队列的指针

索引方式

根据进程状态的不同,建立几张索引表

操作系统持有指向各个索引表的指针

进程控制

对系统中所有进程实施有效的管理,具有创建新进程,撤销已有进程,实现进程状态转换等功能。

实现进程状态转换

实现进程控制

使用原语实现,每一步操作不可分割,期间不允许被中断

原语原子性实现

可以使用关中断和开中断两个特权指令实现原子性。

原语

进程创建

创建原语:

申请空白PCB

为新进程分配所需资源

初始化PCB

将PCB插入就绪队列

创建态->就绪态

引起进程创建的事件:

用户登录

分时系统中,用户登录成功,系统会为其建立一个新的进程

作业调度

多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程

提供服务

用户向操作系统提出某些请求时,会新建一个进程处理该请求

应用请求

由用户进程主动请求创建一个子进程

进程的终止

撤销原语

从PCB集合中找到终止进程PCB

若进程正在运行,立即剥夺CPU,将CPU分配给其他进程

终止其所有子进程

进程间的关系是树形结构

将该进程拥有的所有资源归还给父进程或操作系统

删除PCB

引起进程终止的事件

正常结束 exit系统调用异常结束 整数除0外界干预 用户杀进程‘

阻塞和唤醒成对出现

进程的阻塞

阻塞原语

找到要阻塞进程对应的PCB保护进程运行现场,将PCB状态信息设置为阻塞态,暂时停止进程运行将PCB插入相应事件的等待队列

引起进程阻塞的事件

需要等待系统分配某种资源需要等待相互合作的其他进程完成工作

进程的唤醒

唤醒原语

在事件等待队列中找到PCB将PCB从等待队列中移除,设置进程为就绪态将PCB插入就绪队列,等待被调度

引起进程唤醒的事件

等待事件的发生

进程的切换

切换原语

将运行环境信息存入PCBPCB移入相应队列选择另一个进程执行,并更新PCB根据PCB恢复新进程所需的运行环境

引起进程切换的事件

当前进程时间片到有更高优先级的进程到达当前进程主动阻塞当前进程终止

总结

进程控制原语操作

更新PCB中信息将PCB插入合适的队列分配/回收资源

进程通信

进程之间的信息交换

进程是资源分配的基本单位,各个进程的内存地址空间相互独立

一个进程无法直接访问另一个进程的地址空间

共享存储

两个进程互斥的访问同一个共享空间

使用同步互斥工具进程互斥访问

基于数据结构的共享

低级通信方式,共享空间只能存放长度固定的数据,速度较慢。

基于存储区的共享

高级通信方式,提供一块共享存储区,数据的形式,存放位置都由进程控制,而非操作系统,速度较快。

消息传递

进程间的数据交换以格式化消息为单位,通过操作系统提供的发生消息/接受消息原语进行数据交换。

直接通信方式

间接通信方式(信箱)

管道通信

管道指用于连接读写进程的一个共享文件,又名pipe文件。其实就是再内存中开辟大小固定的缓冲区。

半双工通信,全双工需要设置两个管道

各个进程需要互斥访问管道

管道写满,写进程系统调用被阻塞,等待读进程将数据取走。

管道空后,读进程被阻塞。

没写满,不许读;没读空,不许写。

数据一旦被读出,就从管道中抛弃,读进程只有一个,否则可能读错数据。

线程概念与特征

线程是*轻量级线程。*线程是一个基本CPU执行单元。

引入线程后,进程只做除了CPU外系统资源的分配单元

引入线程,不仅进程可以并发,进程内各个线程也可以并发,进一步提升系统并发度。

资源分配

进程是资源分配的最小单位,进程完成程序并发。

线程是资源调度的最小单位,线程加强程序并发。

并发性

传统进程机制中,只能进程间并发

引入线程后,各线程间也能并发,提升了并发度

系统开销

传统的进程间并发,需要切换进程运行环境,系统开销大

线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小

引入线程后,并发所带来的系统开销减小

线程属性

线程是处理机调度的单位、多CPU计算机中,各个线程可占用不同的CPU每个线程有独立的线程ID,线程控制块(TCB)线程也有阻塞,就绪,运行3种基本状态线程几乎不拥有系统资源同一个进程的不同线程共享进程的资源由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预同一进程的线程切换,不会引起进程切换不同进程中的线程切换,会引起进程切换切换同进程内的线程,系统开销小切换进程,系统开销大

线程的实现方式

用户级线程ULT

早期操作系统,只支持进程,不支持线程。

使用丰富的线程库,完成线程的创建,销毁调度等功能完成线程的管理

线程切换不需要CPU变态

操作系统没有意识到用户级线程存在。

特点
用户级线程的切换在用户空间内完成即可,无需转换到核心态,线程管理的系统开销小,效率高。当一个用户级线程被阻塞后,整个进程都被阻塞,多个线程无法在多核处理机上并行运行。

内核级线程KLT

由操作系统支持的线程,处理机分配的单位

线程由操作系统进程管理

线程切换需要变态

操作系统能意识到KLT操作系统为每个KLT分配TCB

特点
当一个线程被阻塞后,别的线程还可以仅需执行,并发能力强。多线程可在多核处理机上并行。一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成。需要切换到核心态。因此线程管理成本高,开销大。

多线程模型

一对一模型

一个用户级线程映射到一个内核级线程。每个用户进程与用户级线程有同样数量的内核级线程。

当一个线程被阻塞后,别的线程还可以仅需执行,并发能力强。多线程可在多核处理机上并行。一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成。需要切换到核心态。因此线程管理成本高,开销大。
多对一模型

多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。

用户级线程的切换在用户空间内完成即可,无需转换到核心态,线程管理的系统开销小,效率高。

当一个用户级线程被阻塞后,整个进程都被阻塞,多个线程无法在多核处理机上并行运行。

内核级线程才是处理机分配的单位

多对多模型

n用户级线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程。

克服多对一模型并发度不高的缺点(一个阻塞全体阻塞),克服一对一模型中一个用户进程占用太多内核级线程开销太大缺点。

用户级线程是代码逻辑的载体

内核级线程是运行机会的载体

处理机调度

概念

需要由某种规则来决定处理某些任务顺序的方法,叫调度。

高级调度-作业调度

一个具体的任务

用户向系统提交一个作业 = 用户让操作系统启动一个程序(来处理一个具体的任务)

操作系统从作业后备队列取出作业。

每个作业值调入调出一次。调入时作业建立PCB,调出时才撤销PCB

低级调度-处理机(进程)调度

操作系统中最基本的调度,在一般的操作系统中都必须配置进程调度。

按照某种策略从就绪队列中选取一个进程,将处理机分配给他。

中级调度-内存调度

内存不够时,可将某些进程的数据调出外存。等进程空闲或进程需要运行时再重新调入内存。

挂起状态,暂时被调到外存等待的进程状态。被挂起的进程PCB会被组织成挂起对队列

按照某种策略决定将哪个处于挂起状态的进程重新调入内存。

一个进程可能会被多次调出,调入内存,中级调度发生的频率比高级调度更高。

三种调度之间关系

进程的挂起态与七状态模型

挂起态可细分为阻塞挂起和就绪挂起

暂时调到外存等待的进程状态称为挂起状态

处于阻塞态的进程放于内存中,处于挂起态进程放于外存中

进程调度方式与对比

进程调度的时机、切换与过程调度方式

调度时机

进程调度,就是按照某种算法从就绪队列中选择一个进程为其分配处理机

当前运行的进程主动放弃处理机

进程正常终止

运行过程中发生异常而终止

进程主动请求阻塞(如等待I/O)

当前运行的进程被动放弃处理机

时间片用完

有更紧急的事需要处理(I/O中断)

有更高优先级的进程进入就绪队列

不能进行进程调度与切换的情况

在处理中断的过程中。中断处理过程更复杂,与硬件密切相关,很难做到在中断处理过程中进行进程切换。进程在操作系统内核程序临界区中。在原子操作过程中。原子操作不可中断。

进程在操作系统内核临界区中不能进行调度与切换

进程处于临界区时不能进行处理机调度错误

进程调度方式

非剥夺方式

只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程任然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。

实现简单,系统开销小。

无法及时处理紧急任务,适合早期批处理系统。

剥夺方式

当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的进程。

可优先处理更紧急进程,也可实现让各进程按时间片轮流执行的功能,适合分时、实时操作系统

进程切换与过程

进程切换是指一个进程让出处理机,另一个进程占用处理机的过程。

广义进程调度包含选择一个进程和进程切换两个步骤。

狭义进程调度 与 进程切换 的区别:

狭义进程调度指的是从就绪队列中选中一个要运行的进程(刚被暂停执行的进程或另一个进程,后一种情况需要进程切换)。

进程切换完成了:

对原来运行进程各种数据的保存对新的进程各种数据的恢复

进程的切换是有代价的,过于频繁的进程调度、切换,会使得整个系统的效率降低

调度算法评价指标

CPU利用率

指CPU忙碌时间占总时间的比例

系统吞吐量

单位时间内完成的作业数量

周转时间和带权周转时间

周转时间

从作业被提交开始,到作业完成为止这段时间的时间间隔

包括四个部分:作业在外存后备队列上等待作业调度(高级调度)的时间;进程在就绪队列上等待进程调度(低级调度)的时间;进程在CPU上执行的时间;进程等待I/O操作完成的时间。后3项在一个作业的整个处理过程中,可能发生多次。

周转时间 = 作业完成时间 - 作业提交时间

带权周转时间

对于周转时间相同的两个作业,实际运行时间长的作业在相同时间内被服务的时间更多,带权周转时间更小

等待时间

进程/作业处于等待*处理机状态的时间之和,*等待时间越长,用户满意度越低。

等待时间 = 周转时间 - 运行时间 - I/O时间

对于进程而言,等待时间指进程建立后等待被服务的时间之和,在等待I/O设备完成期间其实进程也在被服务,所以不计入等待时间。

对于作业而言,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中的等待时间。

调度算法只会影响作业/进程等待时间,与CPU和I/O占用时间无关

响应时间

用户从提交请求到首次产生响应所用的时间

选择调度算法的原则

调度算法

先来先服务FCFO

按照到达的先后顺序调度。

算法思想:从公平角度考虑。

算法规则:按照作业/进程到达的先后顺序进行服务

用于作业/进程调度:作业调度,考虑哪个作业先到达后备队列;

​ 进程调度,考虑哪个进程先到达就绪队列;

非抢占式

特点:

公平,算法实现简单FCFO 对厂作业有利,对短作业不利。

不会导致饥饿

最短作业优先SJF

算法思想:追求最少的平均等待时间,最少的平均周转时间,最少的平均带权周转时间

算法规则:最短的作业/进程优先得到服务

用于作业/进程调度:可用于进程 SJF

​ 可用于作业 SPF

非抢占式(默认)

抢占式版本 SRTN 最短剩余时间优先

特点:

可得到最短的平均等待时间不公平,对短作业有利,长作业不利。可能产生饥饿现象

会饥饿;某个进程一致得不到服务,可能会饿死。

抢占式的短作业优先的平均等待时间,平均周转时间最短。

高响应比优先HRRN

当前进程主动放弃CPU时才需要

算法思想:综合考虑作业/进程的等待时间和要求服务时间

算法规则:每调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务

用于作业/进程调度:可用于进程

​ 可用于作业

非抢占式

特点:等待时间相同时,要求服务时间短的优先

​ 要求服务时间相同时,等待时间长的优先

​ 对于长作业而言,随着等待时间越长其响应比越大,从而避免长作业饥饿问题。

不会饥饿

此上3中算法,一般用于早期批处理系统。

时间片轮转算法RR(Round-Robin)

算法思想:公平轮流地为各个进程服务,让每个进程在一定时间间隔内可以得到响应

算法规则:按照各个进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。若进程未 在一个时间片内执行完,则剥夺处理机。将进程重新放到就绪队列队尾重新排 队。

用于作业/进程调度:用于进程

抢占式 若进程未能在时间片内运行完,将被强行剥夺处理机使用权,因此时间片轮转调 度算法属于抢占式算法。由时钟装置发出时钟中断来通知CPU时间片已到。

特点: 公平,响应快,适用于分时操作系统

​ 由于高频率的进程切换,因此有一定的开销:不区分任务的紧急程度

不会饥饿

若时间片太大,每个进程都可在一个时间片内完成,则时间片轮转调度算法会退化为FCFS调度算法,并且会增大进程响应时间,因此时间片不能太大。

优先级调度算法

算法思想:随着计算机的发展,尤其是实时操作系统的出现,越来越多的应用场景需要根据 任务的紧急程度来决定处理顺序

算法规则:为每个作业/进程设置各自的优先级,调度时选择优先级最高的进程/作用

用于作业/进程调度:进程+作业

非抢占式只需在进程主动放弃处理机时进行调度

+抢占式需要在就绪队列变化时,检查是否会发生抢占

特点:就绪队列未毕只有一个,可按照不同优先级来组织。另外可把优先级高的进程排在更靠近队头的位置。

根据优先级是否可动态改变,可将优先级分为静态优先级和动态优先级两种

静态优先级:创建进程时确定,之后一直不变;

动态优先级:创建进程时有一个初始值,之后会根据情况动态调整优先级。

设置各类进程的优先级

系统进程>用户进程

前台优先级>后台进程

操作系统更偏好I/O繁忙型进程

采用动态优先级

可以从追求公平、提升资源利用率等角度考虑

饥饿

优先数大,优先级越高,优先级相同进入时间早晚

多级反馈队列算法

算法思想:对其他调度算法的折中权衡

算法规则:

设置多级就绪队列,各级队列优先级从高到低,时间片从小到大新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。只有第K级队列为空时,才会为k+1级队头的进程分配时间片。

用于作业/进程调度:进程调度

抢占式在k级队列的进程运行中,若更上级的队列中进入一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k级队列队尾。

特点:

饥饿

此上3种适合交互式系统。

进程同步

基本概念

进程同步

异步性:各并发执行的进程以各自独立的、不可预知的速度向前推进。

进程同步或称为直接制约关系,指为完成某种任务而建立的两个或多个进程,这些进程需要在某些位置上协调其工作次序而产生的制约关系。进程间的直接制约关系就是源于他们之间的相互合作。

资源共享方式

互斥共享 一个时间段内只允许一个进程访问该资源。同时共享 某些资源一个事件段内由多个进程同时使用这些资源。

*临界资源:一个时间段内只允许一个进程使用的资源。*如:摄像头,打印机,变量,数据,内存等都为临界资源。

*临界区:*代码段

不适合处理机调度的情况:

在处理中断的过程中进程在操作系统内核程序临界区中其他需要完全屏蔽中断的原子操作过程中

互斥又称为间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。

进程互斥

对临界资源的互斥访问,可在逻辑上分为如下4个部分。

临界区是访问临界资源的代码段

进入区和互斥区负责实现互斥的代码段

临界区可称为临界段

进程互斥原则
空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待有限等待。对请求访问的进程,应能保障能在有限时间内进入临界区(保证不会饥饿)让权等待。当进程不能进入临界区时,应立即释放处理机,防止忙等待。

实现临界区互斥的基本方法(记住基本思想)

软件实现方法

单标志法

两个进程在访问完临界区后会把使用权限转交给另一个进程。也就是每个进程进入临界区的权限只能被另一个进程赋予

问题:违反空闲让进

双标志先检查

设置一个布尔型数组flag[],数组中各个元素用于标记各进程想进入临界区的意愿。每个进程在进入临界区前先检查当前有无别的进程想进入临界区,若无,则吧自身对应的flag置为true,之后开始访问临界区。

问题:违反忙则等待

两个资源同时访问临界区

原因:进入区的检查和上锁不能同时完成。

双标志后检查

设置一个布尔型数组flag[],数组中各个元素用于标记各进程想进入临界区的意愿。先上锁再检查。

问题:违反空闲让进和有限等待原则;会产生饥饿现象。

两个进程都想进入临界区,而资源被占用无法进入临界区。

Peterson法

结合双标志和单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试谦让。

进入区:

主动争取;主动谦让;检查对方想用与否且是否最后是自己表示谦让

问题:未遵循让权等待,会发生忙等。

硬件实现方法

中断屏蔽法

使用开关中断指令实现。

简单,高效。

不适用于多处理机,只适用于操作系统内核进程,不适用于用户进程。

TestAndSet(TS/TSL指令)

由硬件实现,执行过程中不允许被中断。

Swap指令(HCHG指令)

使用硬件实现,不允许被中断。

信号量

之前的临界区互斥的软硬件实现进程互斥的方法,无法完成让权等待的原则。

故Dijsktra提出信号量机制完成进程同步,互斥。

信号量机制

用户可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥,进程同步。

信号量实际就是变量(可以是整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量。

一对原语:

wait (S)和 singal(S)常简称为P(S),V(S);来自于荷兰语proberen,verhogen

整型信号量

用一个整数型变量作为信号量,来表示系统中某种资源的数量

对信号量操作:初始化,P操作,V操作

检查上锁一气呵成;避免了并发,异步导致的问题。

存在问题:不满足让权等待,会发生忙等

记录型信号量

整型信号量缺陷存在忙等问题,记录型信号量即用记录型数据结构表示的信号量

先对Value值进行–,++,再对资源进行检查

信号量机制实现进程互斥与同步

一个信号量对应一种资源

信号量的值 = 该资源的剩余量(若值小于0,说明此时有进程在等待该种资源)

P(S) 申请一个资源S,不足就阻塞等待。

V(S)释放一个资源S,若有进程在等待该资源,则唤醒一个进程

实现进程互斥

分析并发进程的关键活动,划定临界区设置互斥信号量Mutex,初值为1进入临界区的名额在进入区P(mutex) –申请资源在退出区V(mutex) –释放资源

信号量定义的数据结构

对不同的临界资源需要设置不同的互斥信号量

*PV必须成对出现。*缺少P则无法保证临界资源互斥访问,缺少V会导致资源永不被释放,等待进程永不被唤醒。

实现进程同步

要让各个异步并发的进程按要求有序的推进

用信号量实现进程同步

分析什么地方需要实现"同步关系",即必须保证"一前一后"执行的两个操作(或两句代码)设置同步信号量S,初始为0;在前操作之后执行V(S)在后操作之前执行P(S)

前V后P

信号量S代表某种资源;

开始时候无该种资源。而P2需要该种资院;只有P1能产生该种资源。

信号量机制实现前驱关系

经典同步问题

生产者消费者问题

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入消费区,消费者进程每次从缓存区中取出一个产品并使用。此处产品为某种数据

生产者、消费者共享一个初始为空,大小为n的缓冲区。

只有缓冲区没满时,生产者才能吧产品放入缓冲区,否则必须等待。缓冲区没满->生产者生产

只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。缓冲区没空->消费者消费

缓冲区是临界资源,各进程必须互斥访问互斥关系

PV操作题目分析步骤:

关系分析。找出题目中描述的各个进程,分析它们之间的同步,互斥关系。整理思路。根据各个进程的操作流程确定P,V操作的大致顺序。设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少。)

*对同步信号量的P操作在前,对互斥信号量的P操作在后

临界区代码需要尽可能短

多生产者-多消费者

桌上有一只盘子,每次只能向其中放入一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,儿子专等吃橘子,女儿专等吃苹果。只有盘子空时,爸爸或者妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,女儿或儿子可以从盘子中取出水果。用PV操作实现上述过程。

结论:即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象

总结

要将前后发生的事件看做两个事件的前后关系

吸烟者问题

假设一个系统有3个抽烟者进程和一个供应者进程。每个抽烟者进程不停地卷烟并抽掉他,但是要卷起并抽掉一支烟,抽烟者需要3种材料:烟草,纸和胶水。三个抽烟者中,第一个拥有烟草,第二个有纸,第三个有胶水。供应者进程无限地提供三种材料,供应者每次讲两种材料放在桌上,拥有剩下那种材料的抽烟者卷起一根烟并抽掉它,并给供应者进程一个信号告诉完成了,供应者就会放另外两种材料在桌上,此过程一直重复。

关系分析。找出题目中描述的各个进程,分析其中的同步,互斥关系。

实现

总结:解决可生产多个产品的单生产者问题提供一个思路。

使用一个整型变量i实现轮流过程

若一个生产者要生产多种产品(或者说会引发多种前驱事件),那么各个操作应该放在各自对应的事件发生之后的位置。

读-写者问题

有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程或其他进程(读或写进程)同时访问共享数据时则可能导致数据不一致的错误。

因此要求:

允许多个读者可以同时对文件执行读操作;只允许一个写者往文件中写信息;任一个写者在完成写操作之前不允许其他读者或写者工作;写者执行写操作前,应让已有的读者和写者全部退出。

关系分析。找出题目中描述的各个进程,分析它们之间的同步,互斥关系。

两类进程:写进程,读进程

互斥关系:写进程-写进程;写进程-读进程。读进程与度进程不存在互斥问题。

整理思路。根据各进程的操作流程确定P,V操作的大致顺序。

实现。

读进程优先

读写公平法

总结

核心思想:加计数器用于记录当前正在访问共享文件的读进程数。可以使用count值来判断当前进入的进程是否是第一个/最后一个进程,从而做出不同的处理。

另外,对count变量的检查和赋值不能一气呵成导致了一些错误。需要一气呵成则需要引用互斥信号量。

写进程饥饿需要重点了解。

哲学家进餐问题

一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆着一根筷子,桌子中间是一碗米饭。哲学家只进行思考或进餐。哲学家饥饿时,试图去拿起左右两根筷子(一根一根拿)。若筷子已在他人手上,则需要等待。饥饿的哲学家只有同时拿起两根筷子才可以进餐,进餐完毕后,放下筷子继续思考。

关系分析。5个哲学家进餐。5个哲学家与左右邻居对其中间筷子的访问是互斥关系。

整理思路。此问题中没有互斥关系。但与之前遇到的问题不同的是,每个哲学家进餐需要同时持有两个临界资源才能开始吃饭,如何避免临界资源分配不当造成的死锁现象,是哲学家问题的精髓。

信号量设置。定义互斥信号量数组

chopstick[5] = {1,1,1,1,1} 用于实现对5个筷子的互斥访问。并对哲学家按0-4编号,哲学家i左边的筷子编号为i,右边的筷子编号为(i+1)%5。

解决思路

同时最多4人同时进餐

仅当一个科学家左右两只筷子都可用时才允许他抓起筷子

所有科学家拿筷子都可以互斥执行

要求奇数号哲学家先拿左边筷子;偶数哲学家则相反;该方法保障若两个相邻的奇偶号科学家都想吃饭,那么只有其中一个可以拿起第一只筷子,另一个直接阻塞

总结

关键在于解决死锁。

进程之间只存在互斥关系,但是与之前的互斥关系不同每个进程都需要同时持有两个临界资源,因此由死锁问题的隐患。

管程

信号量机制存在问题:编写程序困难,易出错。

管程为一种高级同步机制,用于实现进程的互斥同步

定义与基本特征

组成

局部于管程的共享数据结构说明。对该数据结构进行操作的一组过程。对局部于管程的共享数据设置初始值的语句。管程有一个名字。

过程即函数

特征

局部于管程的数据只能被局部于管程的过程所访问一个进程只有通过调用管程内的过程才能进入管程访问共享数据每次仅允许一个进程在管程内执行某个内部过程

管程目的与用法

更方便的实现进程的互斥和同步

需要在管程中定义共享数据(如生产者消费者问题的缓冲区)

需要在管程中定义用于访问这些共享数据的入口,其实就是函数。

只有通过特定入口才能访问共享数据

管程中有许多入口,但每次只能开放其中一个入口,并且只能让一个进程或线程进入。

互斥特性由编译器实现

死锁

概念

并发环境下,各进程因为争用资源而造成的一种互相等待对方手里的资源,都无法向前推进的现象。称为死锁。

发生死锁后若无,外力干涉,这些进程都无法向前推进。

死锁,饥饿,死循环的区别

死锁:并发环境下,各进程因为争用资源而造成的一种互相等待对方手里的资源,都无法向前推进的现象。

饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。

​ 如在SPF中,若有进程源源不断的短进程到来,长进程迟迟得不到处理机,从而发生的饥饿现象。

死循环:某进程执行过程中一直跳不出某个循环的现象。

​ 有时是程BUG,有时程序员故意的。

死锁产生的必要条件

产生死锁必须同时满足以下4个条件,只要其中任一个条件不成立,死锁就不会发生。

**互斥条件:**只有对必须互斥使用的资源的争抢才会导致死锁(打印机设备,哲学家的筷子)。

​如内存,扬声器可以同时让多个进程使用的资源不会导致死锁。(进程不用阻塞等待这种资源)

**不可剥夺条件:**进程所获得的资源在未使用完前,不能由其他进程强行夺走,只能主动释放。

**请求和保持条件:**进程至少保持了1个资源,但又同时提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己的已有的资源保持不放。

**循环等待条件:**存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被下一个进程所请求。

发生死锁时,必有循环等待,有循环等待不一定发生死锁

若同类资源数大于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源只有一个,循环等待就是死锁的充要条件。

发生死锁的时机

*对系统资源的竞争。*各进程对不可剥夺资源的竞争可能会引起死锁,对可剥夺资源CPU的竞争不引起死锁。*进程推进顺序非法。*请求和释放资源的顺序不当,同样发生死锁。信号量使用不当也会造成死锁。如生产者-消费者问题中,若实现互斥的P操作再实现同步的P操作之前,就可能导致死锁。

对不可剥夺的资源的不合理分配,导致死锁

死锁处理策略

预防死锁。破坏死锁产生的四个必要条件中的一个或几个。避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁。(银行家算法)死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,采取某种措施解除死锁。

预防死锁

破坏死锁产生的四个必要条件中的一个或几个。

静态策略

破坏互斥条件

互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁

SPOOLing技术。操作系统可以采用SPOOLing技术把独占设备在逻辑上改造成共享设备。

如:SPOOLing让打印机改造为共享设备。

*缺点:*并不是所有资源都可被改造成可共享使用的资源。并且为了系统安全,很多地方必须保护互斥性。因此,很多时候都无法破坏互斥条件。

破坏不剥夺条件

**不可剥夺条件:**进程所获得的资源在未使用完前,不能由其他进程强行夺走,只能主动释放。

方案1

当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时再重新申请。即某些资源即使尚未使用完,也需主动释放,从而破坏了不可剥夺条件。

方案2

当某个进程需要的资源被其他进程所抢占时,可以由操作系统协助,将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级(比如:剥夺调度方式,就是将处理机资源强行剥夺给优先级更高的进程使用)

缺点
实现较复杂。可能导致该进程前一阶段工作的失效。适用于易保存和恢复状态的资源,如CPU反复地申请和释放资源会增加系统开销,降低系统吞吐量。采用方案1,意味着只要暂时得不到某个资源,之前获得的那些资源就需要都放弃,以后再重新申请。若一直发生这种情况,就会导致进程饥饿。

破坏请求与保持条件

**请求和保持条件:**进程至少保持了1个资源,但又同时提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己的已有的资源保持不放。

*静态分配方法:*即进程在运行前一次申请完他所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就会一直归它所有,该进程就不会再请求任何别的资源。

缺点

有些资源可能只需要很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率低。该策略可能导致某些进程饥饿

破坏循环等待条件

**循环等待条件:**存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被下一个进程所请求。

顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按资源编号递增的顺序请求资源,同类资源(编号相同的资源)一次申请完。

原理:一个进程只占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能逆向回来申请小编号的资源,就不会发生循环等待的现象。

缺点

不方便增加新的设备,可能需要重新分配所有的编号。进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费。必须按规定次序申请资源,用户编程麻烦。

避免死锁

动态策略

安全序列

若按照该种序列分配资源,则每个进程都能顺利完成。只要找出一个安全序列,则系统为安全态。安全序列可能有多个。

若分配资源后,找不到任何一个安全序列,则进入不安全状态。可能之后所有进程都无法顺利的执行下去。若某些进程提前归还部分资源,则可能回到安全状态。分配资源时候需考虑最坏情况。

系统处于安全状态,则一定不会发生死锁;若处于不安全状态,可能发生死锁。

银行家算法

核心思想:在资源分配之前预判这次分配是否会导致系统进入不安全状态,由此决定是否答应资源分配请求。

假设系统有n个进程,m种资源,每个进程最多分配x个资源

n(x-1)+1<=m

总结

死锁的检测和解除

死锁的检测

依次消除与不阻塞进程相连的边,直到边无可消。

用于检测系统状态,以确定系统中是否发生了死锁。

用某种数据结构来保存资源的请求和分配信息提供一种算法,利用上述信息来检测系统是否进入死锁状态。

如果系统中剩余可用资源数足够满足进程需求,那么这个进程暂时是不会阻塞的,可以顺利地执行下去。

若这个进程执行接受后将资源归还系统,就可能使某些正在等待资源的进程被激活,并顺利地执行下去。

若按上述过程分析,最终能消除所有的边,就称这个图是可完全简化的。此时必没有发生死锁。

最终还有边的进程就是处于死锁状态的进程

死锁定理:若此时系统的资源分配图是不可完全简化的,那么此时系统死锁。

死锁解除算法

当认定系统中已经发生死锁,利用该算法可将系统从死锁状态中解脱出来。

资源剥夺法。挂起(暂时放到外存上)某些进程死锁,并抢占其资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿、

撤销进程法。强制撤销部分、甚至全部死锁进程。并剥夺这些进程的资源。

简单粗暴。

代价大。

进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。

决定对谁动手:

进程优先级已执行时间需要完成时间进程以使用资源进程是交互式或批处理式

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。