| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 进程管理笔记 -> 正文阅读 |
|
[大数据]进程管理笔记 |
目录 3.4进程间通信(Inter-Process Communication.IPC) 1程序的执行方式1.1程序的顺序执行
其特性:
顺序执行方式易于检测和校正程序中的错误。 1.2程序的并发执行
其特性(并行执行对程序执行环境的影响):
并发程序执行中出现的程序错误难于检测和校正。 1.3关于并发执行条件的理论探讨程序执行必须保持封闭性和可再现性,并发执行失去封闭性(失去封闭性可能导致失去可再现性)的原因在于共享资源带来的影响,应消除这种影响。 1966年Bernstein给出了程序并发执行的条件。假设程序P所访问的共享变量的读集和写集分别为R和W,则任两个程序P(i)和P(j)可以并发执行的条件有三条: R(i)∩W(j)=Ф,W(i)∩R(j)=Ф,W(i)∩W(j)=Ф。 其中:前两个条件保证一个程序在两次读操作之间存储器中的数据不会发生变化,最后一个条件保证程序的写操作的结果不会丢失。 Bernstein条件的两个不足:没有考虑执行速度的影响;在实际程序执行过程中很难对这三个条件进行检查。 2 进程的定义和描述为了更好的描述程序执行过程及系统中的状况,引入进程。(解决异步执行带来的问题,瞎写 瞎读 ) 2.1进程process的定义一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。进程与处理器、存储器和外设等资源的分配和回收相对应,是计算机系统资源的使用主体。 进程的并发执行是指多个进程在同一计算机操作系统中的并发执行。 2.2进程的描述进程控制块PCB 由操作系统维护的用来记录进程相关信息的数据结构。操作系统依据进程控制块对进程进行控制和管理,其内容会随进程推进而动态改变。进程控制块处于操作系统核心,通常不能由应用程序自身的代码来直接访问,而要通过系统调用进行访问。 进程控制块的组成
进程控制块的组织方式 操作系统对于同一状态的进程的进程控制块的组织方式有:
进程上下文
1 用户级上下文,指进程的用户地址空间,包括用户级正文段、用户数据段和用户栈; 2 寄存器级上下文,指程序寄存器、处理器状态寄存器、栈指针、通用寄存器的值等; 3 系统级上下文,包括进程的静态部分(PCB和资源表格)和由核心栈等构成的动态部分。 说明: 程序寄存器PC给出CPU将要执行的下条指令的(虚)地址; 处理器状态寄存器PS给出机器与该进程相关联时的硬件状态,如当前执行模式,能否执行特权指令等;栈指针指向下一项的当前地址; 通用寄存器用于不同执行模式之间的参数传递等; 核心栈用来装载进程中所使用系统调用的调用序列(或进程执行在内核模式时使用的堆栈); 区表项(区表、页表或域表)定义了进程从虚地址到物理地址的映射,或虚地址与实地址映射表(含进程访问权限)。 2.3进程与程序的关系
(感觉进程就是为了让程序不会瞎吉儿并发执行,设置了一堆限制和规则,来控制他们的并发) 2.4进程的特征
2.5进程的状态转换为刻画进程不断变化的过程,所有操作系统都把进程分成若干种状态并约定各状态间的转换条件。 五状态进程模式 进程在运行过程中主要是在就绪、运行和阻塞三种状态间进行转换,创建状态和退出状态描述进程创建的过程和进程退出的过程。
状态转换 操作系统中多个进程的并发执行是通过调度与超时两种转换间的循环或调度、等待事件和事件出现三种转换间的循环来描述的。
挂起进程模型 五状态进程模型没有区分进程地址空间位于内存还是外存,在操作系统中引入虚拟存储管理技术后,需进一步区分进程的地址空间状态。这个问题的出现是由于进程优先级的引入,一些低优先级进程可能等待较长时间,从而被对换至外存。 挂起suspend,把一个进程从内存转到外存;激活active,把一个进程从外存转到内存。其好处是: 1提高处理器效率:就绪进程表为空时,有空闲内存空间用于提交新进程; 2可为运行进程提供足够内存:资源紧张时,可把某些进程对换至外存; 3有利于调试:在调试时挂起被调试进程,可方便地对其地址空间进行读写。 2.6进程的控制***进程控制就是系统使用一些具有特定功能的程序段来创建、撤消进程以及完成进程各状态间的转换,从而达到进程高效率并发执行和协调、实现资源共享的目的。 操作系统对进程的控制是依据用户命令和系统状态来决定的。用户可在一定程序上对进程的状态进行控制,其主要体现在进程的创建与退出及进程的挂起与激活。 原语及分类把系统态下运行的某些具有特定功能的程序段称为原语。其分类有:①机器指令级的,执行期间不允许中断,是一个不可分割的基本单位;②功能级的,作为原语的程序段不允许并发执行。 进程的创建创建方式:
主要工作:进行进程控制块等相关数据结构的维护。 参数说明:进程名(外部标识符)n,处理器初始状态(或进程进行运行现场初始值,主要指各寄存器和程序状态字初始值)S0,优先数K0,父进程分给子进程的初始主存区M0及其他资源清单(多种资源表)R0。 进程退出亦称进程终止,操作系统要删除系统维护的相关数据结构并回收进程占用的系统资源,如释放进程占用的内外存空间,关闭所打开文件,释放共享内存段和解除各种锁定等。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 进程阻塞在一个进程期待某一事件(例如键盘输入数据、写盘、其他进程发来的数据等)发生而发生条件尚不具备时,该进程自己通过相应系统调用来阻塞自己。(或进程在执行过程中会因为等待I/O操作完成或等待某个事件出现而进入阻塞状态。) 进程唤醒当等待队列中进程所等待的事件发生时(事件出现或I/O操作完成),阻塞进程将被唤醒而进入就绪状态。唤醒方式:
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3进程间的关系3.1进程间关系间接制约关系众多进程共同使用系统资源称为共享性。实际上许多资源的使用性质决定了共享往往是宏观上的,如cpu、打印机等要求排它性地轮流使用,A进程使用时,B进程就不能使用,即互斥使用。此类资源一般为重大资源,如cpu、主存空间、外设、文件等,由操作系统统一分配与调度。由此而造成的进程间的互斥制约关系称为间接制约关系。 直接制约关系多道系统中某作业完成先对两n阶矩阵求逆而后相加,则可建立两个进程分别负责两矩阵的求逆,另建一进程负责两矩阵的相加工作。尽管由于进程并发性而带来的各进程进展的随机和不可预知即异步性,但该任务中各进程的工作进展应有先后次序,即存在时序关系:相加工作应在求逆工作后进行,这就是同步,并且求逆进程应将求逆工作完成和求逆后的结果都通知相加进程,表现为进程间的通信及交换数据。由此二者造成的进程间的相互制约关系称为直接制约关系,一般由进程间自行协调。 进程互斥是指由于共享资源所要求的排他性,进程间要相互竞争以使用这些互斥资源。 进程同步是指多个进程中发生的事件存在某种时序关系,必须协同动作、相互配合以共同完成一个任务。(异步事件能按照要求的时序进行,以达到合作进程间协调一致地工作。) 在诸多并行性问题中最重要和最根本的是进程间互斥,它是解决同步的基础,实际上互斥亦是一种同步。 3.2基本概念和原则进程之前可能出现的问题: 示例1 SPOOL系统的假脱机输出技术。
对于进程要打印输出的文件必须在输出队列中排队,其输出队列为名为SPOOLER的专用的打印输出的文件名录。它有N个目录项,依次编号0,1,2……,用以保存等待打印输出的文件名。系统中专设进程printer负责打印,其周期性检查是否有要打印的文件,若有则负责打印输出,并将已完成输出的文件名从名录中清除。为此,系统设置两个变量out和in。out指示下一个要打印的文件,in指示名录中下一空目录项。图为某时刻目录状况。 假设进程A和B要将各打印输出的文件放入输出队列SPOOLER。若A运行(……;读in;将in 存入局部变量nextfreeitem中),此时恰好时钟中断,进程A的时间片到,调度转至B运行(……;读in;将in中值(仍为‘6’)存入其局部变量,检测其值为“6”并将B的输出文件存入第6个目录项中;然后将in值增1;其他工作……)。若进程A再次调度运行时,继续从断点处运行,(检测局部变量nextfreeitem值为“6”,将A的输出文件名存入第6个目录项中;nextfreeitem增1存入in中;……),其结果是导致进程B的文件丢失而没有打印。 示例2 两进程共享变量count,其描述为 ①按P1,P2的顺序,count变量值增2; ②按P1(1),P2(1),……,count变量值增1。(若P1,P2分时使用同一处理器,当P1(1)执行完发生时间片中断,而后P2得到执行。) 结果①是正确的,结果②是错误的。若P1,P2是航空定票系统中的两个订票进程,count代表某班机售出的座位数,情况②会给旅客及航空公司造成不愉快的后果。 分析:原因在于变量in及count是互斥性使用的共享变量,进程必须互斥地对其进行访问。
进程同步机制遵循的原则
3.2互斥算法(基于进程间平等协商的办法)3.2.1进程互斥的软件方法(基本思路)在进入区检查和设置一些标志,如果有进程在临界区,则在进入区通过循环检查等待,在退出区修改标志。 (1)双标志-先检查算法 设一标志数组Flag[],描述各进程是否在临界区,初值均为FALSE;进入区操作为先检查,后修改。设进程Pi与Pj,其中Pi代码描述为:
缺点:进程Pi和Pj可能同时进入临界区,原因在于检查和修改不能连续进行。 这里是检查完才修改,所以存在两个进程同时检查,同时进入的情况 (2)双标志-先修改后检查算法 标志Flag[i]表示进程Pi想进入临界区,而不再表示进程i在临界区。设进程Pi与Pj,其中Pi代码描述为:
缺点:进程Pi和Pj可能都进不了临界区,原因在于修改和检查不能连续进行。 (如果没有进程可以修改flag,则开始设置为true后,所有进程都是true,无可进入) 说明:完全利用软件方法实现进程互斥有很大局限性,如不适用于数目很多的进程间的互斥,其原因在于修改与检查不能作为一个整体被执行。 3.2.2进程互斥的硬件方法(基本思想)用一条指令完成读和写两个操作去保证读操作与写操作不被打断。 TS(Test and Set)指令 读出指定标志后把该标志设置为TRUE,其函数描述为:
每个临界资源设一公共布尔变量lock表示资源的两种状态,TRUE表示正被占用,FALSE表示空闲,初值为FALSE。所有访问该临界资源的进程,其进入区和退出区代码均相同。
优点: ①适用范围广:任意数目进程,单处理器与多处理器环境中完全相同。 ②简单:标志设置简单,含义明确,易验证其正确性。 ③支持多个临界区:每个临界区可定义一个布尔变量。 缺点: ①不能实现“让权等待”。 当判断为true时,就会一直while循环,占用cou资源,在进入区等待而不能进入临界区的进程应释放处理器,转至阻塞状态,以使其他进程有机会得到处理器的使用权 ②由于进入临界区的进程是从等待进程中随即选择,有些进程可能一直选不上,导致“饥饿“。 说明:基于进程间平等协商来解决公有资源的使用问题,其存在的问题有:没有获得执行机会的进程就无法判断而导致不公平现象,获得测试机会的进程又为测付出一定的cpu时间。其软件方法复杂,不直观且效率低,硬件办法存在忙等、饥饿的缺点,原因在于每个进程能否进入临界区必须依靠自己的测试判断。故需引入地位高于进程的管理者来解决公有资源的使用问题,这个管理者就是操作系统。 3.3信号量机制3.3.1基本概念信号量semaphore机制是由操作系统提供的管理公有资源的有效手段。 基本原则:在多个相互合作的进程之间使用简单的信号来同步,进程可被强制地停止在一个特定的地方直至收到一个专门的信号。 信号量说明
关于P、V原语 p原语(或操作)相当于进入区操作,v原语(或操作)相当于退出区操作。
设s为某资源上的信号量,p原语描述为:
或
其中各项说明为:表示申请一个资源;若无空闲资源;调用进程进入等待队列;阻塞调用进程。 v原语描述为:
或
其中各项说明为:表示释放一个资源;若有进程处于阻塞状态;从等待队列中取头一个进程P;进程P进入就绪队列。 ②对共享资源访问控制时,必须成对使用P、V原语。丢失P则不能保证互斥访问;丢失V则不能在使用临界资源之后将其释放给其他等待的进程。二者使用不能次序颠倒、重复或遗漏。 3.3.2信号量机制的应用 实现进程互斥 对于示例2,两进程共享临界资源count的同步算法为:
分析:两个进程共享临界资源时,信号量取值范围为[1,0,-1];n个进程共享临界资源时,信号量取值范围为[1,0,-1,…,-(n-1)]。 实现进程同步 如图示三合作进程中? ?计算进程与打印进程间的同步算法。 ? ? ? ? ? ? ? 输入进程Pi? ? ? ? ? ? 计算进程Pc? ? ? ? ? ? ? 打印进程Pp 输入设备—————→buffer—————→buffer—————→打印设备 分析:进程互斥时各进程的执行顺序是任意的。在异步(并发)环境下,进程Pc与Pp的执行不同于互斥,各自的执行结果互为对方的执行条件,Pc的输出结果是Pp的执行条件,Pp的执行结果也是Pc的执行条件,表示为Pc与Pp间的直接制约,即同步关系问题。对于同步问题,P原语可视为查看进程前进的信号有无,则计算进程Pc应先查看有无空的缓冲区,打印进程Pp应先查看有无数据。设置两个信号量,Sa初值为0,表示缓冲区内无数据;Sb初值为1,表示缓冲区空闲可用。(V原语可视为向合作进程发出信号)
描述前趋关系 就是进程间的同步关系。示例,前趋关系如图:
3.3.3信号量机制的推广解决同时需要多种资源的互斥访问问题,信号量集是指同时需要多种资源的信号量操作。 AND型信号量集是指同时需要多种资源且每种占用一个资源的信号量操作。 问题示例 当一段代码需要同时获得两种或多种临界资源时,可能出现由于各进程分别获得部分临界资源并等待其余临界资源的局面,各进程都会各不相让,导致死锁发生。 某进程P1在申请一台输入设备后,又继续申请一台打印设备,然后使用之,过后陆续释放,进程P2在申请一台打印设备后又继续申请一台输入设备,使用后陆续释放。这里mutex1=1表示输入设备,mutex2=1表示打印设备,则同步描述如下:
该同步过程中使用的P操作是嵌套的,可能出现死锁。 基本思想:在一个原语中申请整段代码所需要的多个临界资源,要么全部分配给它,要么一个都不分配给它。 AND型信号量集P原语称为SP或swait(simultaneous),其描述为:
AND型信号量集V原语称为SV或Ssignal,其描述为:
“一般信号量集“指同时需要多种资源,每种占用的数目不同,且可分配的资源还存在一个临界值时的信号量处理。 4经典同步问题评价同步工具优劣的参考标准:
同步工具的使用:
信号量分类:
生产者-消费者问题指若干进程通过有限(个)的共享缓冲区交换数据时的缓冲区资源使用问题。 问题描述 生产者进程不断向共享缓冲区写入数据(生产数据),消费者进程不断从共享缓冲区读出数据(消费数据);共享缓冲区共有n个,任何时刻只能有一个进程可对共享缓冲区进行操作。 问题分析 1)共享缓冲区中的n个缓冲块为共享资源;生产者写入数据的缓冲块为消费者的可用资源;消费者读出数据后的(空白)缓冲块为生产者的可用资源。 2)设置信号量 full表示有数据的缓冲块数目,初值为0;empty表示空白的缓冲块数目,初值为n;mutex用于访问缓冲区时的互斥,初值是1,其中存在关系full+empty=n。 3)确定P、V原语的次序 各进程必须先检查自己对应的资源数目,在确信有可用资源后再申请对整个缓冲区的互斥操作;否则就可能死锁。(如先申请互斥操作) 算法描述
这里,公用信号量mutex保证各进程之间的互斥,empty为生产者进程的私有信号量,full为消费者进程的私有信号量。 读者-写者问题示例 文件系统、数据库中普通存在的一个数据集(文件或记录)如果被几个并发进程所共享,一些进程只是要求读数据集的内容,而另一些进程要求修改数据集的内容。通常读进程称为阅读者或读者,要求修改数据的进程称为写入者或写者。①若干阅读者可以同时读数据集,不加互斥也不会产生任何问题,即不存在破坏数据集中数据完整性、正确性的问题;②一个写入者不能与其他进程(无论阅读者或写入者)同时访问数据集,必须互斥,否则将破坏数据集数据的完整性。此类问题即是读者-写者问题。 问题描述 读者-写者问题是指多个进程对一个共享资源进行读写操作问题。设读者进程只对共享资源进行读操作,写者进程可对共享资源进行写操作,任一时刻写者最多只允许一个,读者则允许多个。这里共享资源的读写操作限制关系有“读-写”互斥,“写-写”互斥和“读一读”允许。 问题分析 读者-写者问题解决的目的是保证共享资源(或数据集)的数据完整性,数据完整性是内部逻辑性的体现。 ①读一读 尽管存在与并发性并存的异步性,各读者进程经读操作所得到的数据完整性是不变的,即不会影响正确性,各读者进程之间彼此不会有任何影响。 ②读-写 由于与并发性并存的异步性,写者进程的写操作会造成读者进程读取数据的不完整,即破坏读者进程经读操作得到的数据完整性,从而影响到读进程内部的控制逻辑,这是并发进程不允许的。 ③写-写 由于与并发性并存的异步性,各写者进程的写操作会造成某些写进程写的结果的丢失(对同一写入点)或破坏数据完整性,这也是并发进程所不允许的。 关于选择信号量 1)据上分析 由于存在读写互斥与写写互斥,则对于共享资源(或数据集)而言是必须互斥使用的,故应首先为该共享资源设立一个互斥信号量,记为m,初值为1。 2)当没有任何进程使用共享资源时,对读者进程或写者进程,谁先到达谁先获得使用权,即应执行P(m)操作,因此每个进程都应首先申请共享资源的使用。 根据2),读写进程的描述为: 写者 读者 ………… ………… P(m)? ? ? ? ? P(m) writing? ? ? ?reading V(m)? ? ? ? ? ?V(m) ………… ………… 3)若当前使用者是写者进程时(此时m<=0),后到进程将因无法申请到共享资源的使用权而阻塞。 4)若当前使用者是读者进程时,后到写者进程将因无法申请到共享资源的使用权而受阻;但因读-读是允许的,也就是说后到的读者进程将可以立即得到共享资源的使用权,即不必去申请使用权(即免去P(m)),也即是表明当前有使用权的读者进程与后到的读者进程应有区别,即第一个读者进程要申请使用权并在获得使用权后应与后续读者进程要进行标志,这里采用读者计数rc(readcount),初值为0。 根据4)修改读者进程: 读者 …………
………… 5)为保证计数rc的正确性,各读者进程之间必须互斥使用,故对rc应设立使用权信号量,记为rcm(readcountmutrx),初值为1。 算法描述
问题及其算法描述的再分析 1)若当前使用者是写者,则后到的写进程将被阻止在信号量m上,第一个读者将被阻止在信号量m上,后续读者将被阻止在信号量rcm(即第一个读者不仅无法得使用权被阻塞,同时连带锁定rc的使用权,阻止即剥夺后续读者的rc使用权)。 2)若当前使用者是读者,则后到的写者进程将被阻止在信号量m上,而后到的读者(无论在写前或写后)都不会阻止而得到共享资源的使用权,也即是即使有写者被阻塞而等待在先,后来的读者将会源源不断地得到各自的使用权(即越过写者而先得到使用权)。 3)根据上述两点,读者使用权时阻止写者,并使写者后面的读者越过写者而先得到使用权;写者使用权阻止的各进程,一旦第一个受阻读者被调用(唤醒),则会使后等待的读者也会越过先等待的写者而得到使用权。故本算法实际是一个读者优先的描述。 4)数据及时性的考虑 设有进程序列……读1,写1,读2……,该序列无论是否为等待序列,都会出现读2越过写1而先得到使用权(按前面的算法)。如果仅仅考虑数据的完整性,上面的处理无疑是正确的,但若要及时知道或反应数据的修改情况,上述序列若为等待序列,则应按谁先等待谁先使用的原则进行,以保证数据及时性(每个读者应读到最新数据)。 无优先的读者写者问题 要求实现 1读者使用权时:紧接着到来的若干读者不会等待(读读允许);到来的所有写者必须等待(读写互斥);晚于写者到来的读者必须等待(无优先)。 2写者使用权时:所有到来的读者必须等待(读写互斥);所有到来的写者必须等待(写写互斥)。 算法描述 数据集使用权m=1, 读者计数rc=0及使用权rcm=1,写信号w=1。 w谁拿谁运行? 用完释放 读者进程:
写者进程:
写优先的读者写者问题 要求实现 1读者使用权时:紧接着到来的若干读者不会等待(读读允许);到来的所有写者必须等待(读写互斥);晚于写者到来的读者必须等待(无优先或写者优先)。 2写者使用权时:所有到来的读者必须等待(读写互斥);所有到来的写者必须等待(写写互斥);写者等待优先于读者等待(写者优先)。 算法描述 设数据集使用权m=1,读者计数rc=0及使用权rcm=1,写者计数wc=0及使用权wcm=1,写信号w=1。 还是加入了一个w写信号,读写进程写夺取w信号,当写得到后,进行写进程,如果后面新来写进程,则加入计数,有计数则不放w,直到没有写进程加进来且之前的运行完成,释放w后r进程得到w 读者进程:
写者进程:? ? ? ? 如果wc不为0 则前边有写进程 已经对w加着锁
嗜睡的理发师问题(由图灵奖获得者Dijkstra教授提出) 理发店里有一位理发师、一把理发椅和N把供等候理发的顾客坐的椅子。 如果没有顾客,理发师便在理发椅上睡觉,当一个顾客到来时,他必须先叫醒理发师; 如果理发师正在理发时又有顾客到来,如果有空椅子可坐,顾客就坐下来等候;如果没有空椅子,顾客就离开。 请设计理发师和顾客的同步算法。 分析: 对于互斥同步,主要解决两个问题:1正确设置信号量,2恰当安排PV原语的使用顺序。 1信号量设置 等待理发的顾客customer=0; 顾客竞争的理发权barber=0; 空座椅计数count=N及其使用权m=1。 2同步算法描述 方案1 barber=0(这个方案应该是合理的) 顾客:
理发师:
方案2 barber=1(这个方案是有问题的,因为顾客对理发权实际没有竞争没有先后,而是一起直接闯入理发室理发,没有和理发师形成同步) 顾客:
理发师:
方案3 barber=0 顾客:
理发师:(存在不尽合理之处,理发师在叫入一位等待理发的顾客时,是不允许新顾客进入等候室的,因为锁定的m的使用权)
3竞争合作关系 互斥竞争关系: 1)顾客之间要竞争N把空椅子count,同时要竞争计数检查时的使用权m; 2)表面看是竞争N把空椅子,其实count也起到了同步作用,即限制可以等待的顾客的数量,最多N个; 3)进入理发店的顾客要竞争理发权barber,起到了先来后到的作用。 合作同步关系: 1)顾客向理发师发出一个新的理发请求,理发师要查看有无等待理发的顾客,customer; 2)每叫入一位顾客到理发室,也表示将理发权传递给下一位等待的顾客。 哲学家就餐问题(由图灵奖获得者Dijkstra教授提出) 五个哲学家围坐在一张圆桌周围,每个哲学家面前都有一盘通心粉。由于通心粉很滑,所以需要两把叉子才能夹住。相邻两个盘子之间放有一把叉子,餐桌如图。 哲学家的生活中有两种交替活动时间段,即吃饭和思考(这只是一种抽象,即对哲学家而言其他活动都无关紧要)。当一个哲学家觉得饿了时,他就试图分两次去取左边和右边的叉子,每次拿一把,但不分次序。如果成功地得到两把叉子,就开始吃饭,吃完后放下叉子继续思考。请描述哲学家之间的同步算法。 分析: 设哲学家逆时针依次编序0-4,叉子依次编序0-4,哲学家i左手叉子i、右手叉子(i+1)%5。 方案1 设信号量fork[0..4]表示叉子的使用权,初值均为1;
这个方案有错误,错误在哪儿?由于并发性或者不确定性,恰好每个哲学家都拿起他们左边的叉子,则进入无限制等待右边的叉子,谁也无法用餐。 方案2 设信号量fork[0..4]表示叉子的使用权,初值均为1; 信号量m加强保护(不恰当的认为是餐桌的使用权或者用餐权),初值为1;
这个方案有错误,错误在哪儿? 任何时刻只能有一个哲学家用餐。 方案3 设信号量fork[0..4]表示叉子的使用权,初值均为1; 信号量m加强保护(不恰当的认为是餐桌的使用权或者用餐权),初值为2;
这个方案是否可行? 任何时刻至多允许两个哲学家用餐。 方案4 设状态数组state[0..4],分别表示各哲学家的状态thinking/hungry/eating,初值均为thinking; 信号量m,表示状态数组的使用权,初值为1; 信号量数组s[0..4],表示各哲学家的用餐权,初值均为0;
这个方案能否达到要求? 面包店问题。(由图灵奖获得者Lamport提出)(此问题描述及解决不完全,暂不作为授课内容) 面包店销售面包和蛋糕,店内有n个销售员。每个顾客进店后先取一个号,并等待叫号;若有销售员空闲下来,则叫下一个号并为该号顾客提供销售服务。请描述顾客、销售员之间的同步算法。 分析 1顾客之间应竞争服务号count=1并排队queue及其使用权qm=1; 2顾客取到服务号后,应向销售员表明要求服务的请求wait=0,并等待叫号m=0; 3若销售员空闲,则应查看有无顾客要求服务; (方案1) 顾客:
销售员i:
注:1这里似乎存在漏洞,若后来的先p(t),则打乱顺序;2叫起顾客应按顺序,可能要设计队列。 (方案2) 顾客:
销售员i:
注:这里也存在不足吗,请考虑。 这些同步问题中需要处理的是竞争和合作关系,既有竞争又有合作,竞争的一般是公有资源,合作的一般是同步信号,即时序关系,有的简单一些,有的复杂一些,我们这里提供的是使用一般信号量机制来解决,也有需要信号量集机制进行解决的问题,比如哲学家就餐问题,请考虑。 上下楼梯问题 学生的宿舍楼梯很窄,不能同时上下,但可以同时上或同时下,并且下楼梯优先,即如果此时有人正在上楼梯并且有一个人等待下楼梯时,则不再有新的上楼梯者进入楼梯。请用PV操作写出进程间的同步算法。 分析: 设上梯进程和下梯进程,则竞争合作关系如下: 1上下互斥;2上上允许;3下下允许;4下梯优先。 令楼梯使用权lm = 1,则满足1: 上梯者:? 下梯者: P(lm);? ? ?P(lm); 上楼梯;? 下楼梯; V(lm);? ? ?V(lm); (谁先到达谁先使用) 令上梯者计数uc = 0及其使用权ucm = 1,下梯者计数dc = 0及其使用权dcm = 1,则满足1、2、3: 上梯者:? ? ? ? ? ? ? ? ? ? 下梯者: P(ucm);? ? ? ? ? ? ? ? ? ? P(dcm); if uc = 0 then P(lm); if dc = 0 then P(lm); uc = uc + 1; ?????????????dc = dc + 1; V(ucm);? ? ? ? ? ? ? ? ? ? ?V(dcm); 上楼梯; ????????????????????下楼梯; P(ucm);? ? ? ? ? ? ? ? ? ? ?P(dcm); uc = uc – 1;? ? ? ? ? ? ? ?dc = dc – 1; if uc = 0 then V(lm);? ? if dc = 0 then V(lm); V(ucm); ?????????????????????V(dcm); (上上允许、下下允许) 令下梯使用权dm = 1,由第一个下梯者发出,每个上梯者必须检测,则满足1、2、3、4: 上梯者: ????????????????下梯者: P(dm); P(ucm); ????????????????P(dcm); if uc = 0 then P(lm); if dc = 0 then {P(dm); P(lm);} uc = uc + 1;? ? ? ? ? dc = dc + 1; V(ucm); ????????????????V(dcm); V(dm); 上楼梯; ????????????????下楼梯; P(ucm); ????????????????P(dcm); uc = uc – 1;? ? ? ? ?? dc = dc – 1; if uc = 0 then V(lm); if dc = 0 then {V(dm); V(lm);} V(ucm); ????????????????V(dcm); (下梯者优先) 测试用例,用于考察是否满足那四个关系: 上1,上2,下1,下2,上3,下3,上4,下4 下1,下2,上1,上2,下3,上3,下4,上4 请同学们也考虑有无其他方案,说明理由。 5信号量机制存在的问题
问题的主要原因 在于对共享资源的P、V同步操作分散于各进程中,故一个改进的办法是将同步操作相对集中起来,交由操作系统来完成。将抽象共享资源的数据(信号量)及其操作对封装为一体,这就是面向对象思想出现的由来。 3.4进程间通信(Inter-Process Communication.IPC)基本概念 目的 解决进程间的信息交流问题。 分类 1按通信量的大小
2按通信过程中是否有第三方作为中转
典型方式介绍
实例分析——消息缓冲通信 消息缓冲区的结构描述
发送与send原语 向系统申请一个消息缓冲区,将发送区中的信件内容复制在消息缓冲区;将该消息缓冲区插入接收进程的消息链中,并通知其有信件。
其中:mq进程消息链首指针:mutex消息链本身的互斥信号量;sm消息链的同步记数信号量。 接收与receive原语 接收进程查看sm计数信号量获知是否有待处理的信件,若无则此位置即为接收进程的等信口并阻塞等待;若有(被发送进程唤醒),则从消息链上摘下一个消息缓冲区,将信件内容复制到自己的接收区并释放消息缓冲区。
图示略见教材 P56 2-18。 4死锁问题4.1死锁deadlock的概念指多个进程由于竞争资源(或等待对方消息)而造成的彼此无休止地互相等待,在无外力作用下,永远不能向前推进的这种僵持局面。 指计算机系统和进程所处的一种状态:在系统中的一组进程由于竞争系统资源或由于彼此通信而永远阻塞。 指系统中多个进程无限制地等待永远不会发生的条件。(W2000) 4.2死锁的原因和条件产生死锁的根本原因?对互斥资源的共享,并发执行进程的同步关系不当。 死锁形成过程的分析?按进程使用的资源分为两类。 ①可重用资源reuseable resource每个时刻只有一个进程使用,在宏观上各个进程轮流使用,如处理器,主存和辅存,I/O通道,外设,数据结构(文件,数据库和信号量等)。 示例 假设系统中的资源A和B都只有一个(如输入设备和输出设备),则申请次序P1<a>,P2<a>,P1<b>,P2<b>就会出现死锁。 P1 ???????????????????????? ? ?P2 …… ????????????????????????…… request(A);<a> request(B);<a> request(B);<b> request(A);<b> …… ????????????????????????…… (use)???????????????????????? (use) …… ????????????????????????…… release(B); ????????release(A); release(A);???????? release(B); …… ????????????????????????…… 其原因在于各进程都拥有部分资源,同时在请求其他进程已占有的资源,从而造成永远等待。 编码风格上的细微差别(哪一个资源先获得)造成了可以执行的程序和不能执行而且无法检测错误的程序之间的差别,因此死锁是非常容易发生的。 ②可消耗资源consumable resourse指可以动态生成和消耗的资源,一般不限制数量,如硬件中断,信号,消息,缓冲区的数据等。 示例 假设两进程的执行次序P1<a>,P2<a>,则会由于对方还未生成资源而形成永远等待。 P1? ? ? ? ? ? ? ? ? ? ? ? ??????????P2 ……???????????????????????????????? …… receive(P2,M);<a> receive(P1,Q);<a> send(P2,N);? ? ?<b> send(P1,R); <b> 其原因在于可消耗资源的生成和消耗存在依赖关系,其使用上可能因为双方都等待对方生成资源而形成死锁,即同步关系不当。 ③关于资源的再认识 一个逻辑资源(简称为资源)是指可以引起一个进程进入等待状态的事物。 死锁发生的条件 产生死锁的4个充分必要条件,由Coffman.et.al总结。 1)互斥条件 任一时刻只允许一个进程使用资源(或资源是独占的且排它使用)。 比如两个进程同时使用打印机会引起混乱打印的结果,同时使用同一文件系统表的表项会引起文件系统的瘫痪,因此所有操作系统都具有授权一个进程(临时)排他访问某一种资源的能力。 2)请求和保持(保持与再请求,部分分配)条件 进程在请求其余资源时,不主动释放已经占用的资源(已获得的资源未释放,还要有新的申请要求)。 3)非剥夺(不剥夺,不可抢占)条件 进程已经占用的资源,不会被强制剥夺(进程已获得的资源只能由它自己释放,不允许剥夺;一个资源仅能被占有进程释放,不能被别的进程强行抢占)。 可抢占资源是指可以从拥有它的进程中抢占而不会产生任何副作用,存储器就是一类可抢占资源。例如某系统拥有32K用户内存和一台打印机,若两个32K内存的进程都想进行打印,进程A请求并获得打印机,然后开始计算要打印的值,在未完成计算任务之前,它的时间片用完并被换出;进程B开始运行并请求打印机,但没有成功,此时有潜在的死锁危险。因为A拥有打印机而B占有内存,没有另一个进程的资源,两进程中的任何一个都不能继续执行。幸运的是,通过将B换出内存、A换入内存就可以实现抢占B的内存,A继续运行并执行打印任务。然后释放打印机,在这个过程中不会产生死锁。 不可抢占资源是指在不引起相关计算失败的情况下,无法把它从占有它的进程处抢占过来。如果一个进程已开始刻盘,突然将CD刻录机分配给另一个进程,那么将划坏CD盘。在任何时刻CD刻录机都是不可能抢占的。 4)环路等待(循环等待)条件 环路中的每一条边都是一个进程在请求另一进程已经占有的资源。 由于条件1)是资源的固有特性而无法改变,只能从其它三个条件入手来解决死锁问题。 4.3死锁的预防死锁预防是指通过某种策略来限制并发进程对资源的请求,使系统在任何时刻都不满足死锁的必要条件。 1)破坏请求和保持条件 采用预先静态分配法,即一个进程开始执行前就申请所需的全部资源并由系统在调度时为之分配所需全部资源(动态分配是指进程临近使用时才提出申请,系统再进行分配)。 缺点:降低资源利用率,降低进程的并发程度(即进程延迟运行),适用于预先知道所需资源,但实际的进程运行有可能无法预知所需的资源。 2)破坏环路等待条件 采用有序资源使用法,将资源分类按序排列,赋予不同的序号,其一般原则是较为紧张,稀少的资源排以较大的序号,对资源的申请按递增的次序,以保证资源的申请不形成环路。 缺点:限制进程对资源的请求顺序,资源排序占用系统开销。 死锁预防施加了较强的限制条件,其实现虽较简单,但严重损害系统性能。 4.4死锁的避免死锁避免?在分配资源时判断是否会出现死锁,只在确信不会导致死锁时才分配资源。死锁避免允许进程动态申请资源。 安全状态?指系统能按某种进程顺序如P1,P2,……Pn(称为安全序列)来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺利完成。若系统不存在这样一个序列,则称系统处于不安全状态。 银行家问题?指银行家在向顾客贷款时如何保证资金安全的问题。假设一个银行家把他的固定资金贷给若干顾客时,只要不出现一个顾客借走所有资金后还不够,银行家的资金就是安全的,银行家应实施某种策略保证借出去的资金在有限时间内可收回。 1)假定条件 每个顾客分成若干次进行贷款,并在第一次借款时能说明其最大借款额。 2)具体操作 各个顾客的借款依次顺序进行,直至全部借款操作完成。 3)贷款判断 银行能否支持顾客借款,直至全部归还。如果能,本次贷款是安全的并执行贷款;否则就是不安全的,暂不贷款。 示例1 设银行家固定资金为10个现金单位(即为顾客共享),3个顾客:P最大借款8,已借4,仍需4,即P(8,4,4);Q最大借款3,已借2,仍需1,即Q (3,2,1);R为(9,2,7)。此时银行家剩余10-4-2-2=2。如图示:
若按Q,P,R次序贷款,则三顾客均完成各自的交易并归还贷款,故银行家的资金是安全的。 若银行家向R贷款一个现金单位,如图示,尽管可以保证Q完成其交易,但顾客P.R均不能完成各自交易而无法归还贷款,则银行家的资金是不安全的。 示例2 假定系统有三进程P1,P2和P3,系统共有12台磁带机,某时刻系统状态如图: 最大需求 已分配 尚需 空闲可用
分析: 若系统按P2,P1,P3分配磁带机,每个进程都可顺利完成,即存在一个安全序列<P2,P1,P3>。此时系统处于安全状态。若此刻只有P3申请一台,系统分配一台空闲给P3,则会造成同示例1相同的结果,即P2可完成但P1,P3彼此等待对方释放资源而都不能进行下去。 银行家算法描述 (多资源的银行家算法)某企业无偿还能力时就不要贷款给他。 1)设定数据结构
2)算法描述 设进程i的资源请求为Request(i),系统要对这个申请(即顾客的借款)加以检查,以决定是否满足该申请,过程如下: 待修改
3)示例 假定系统中五进程{P0,P1,P2,P3,P4}及三种资源A,B,C,每种资源量分别为10,5,7。当前时刻资源分配情况为:
银行家算法的评价?由于该算法允许资源的部分分配和不需要抢占,可提高资源利用率。其缺点是前提太严格,要求事先说明最大资源需求量并且进程数目固定,实际实现很困难,只能用于一些特定的应用。 4.5死锁的检测死锁检测 (基本思路)在操作系统中保存资源的请求和分配信息,利用某种算法对这些信息加以检查,以判断是否存在死锁。 资源分配图算法?主要是检查是否有循环等待。即把进程和资源间的申请和分配关系描述成一个有向图,通过检查有向图中是否有循环来判断死锁的存在。 资源分配图说明: 有向图G=(V,E),其中顶点集V分为两部分:P={P1,……Pn}是系中进程集,R={r1,……,rm}是系统中不同资源集;边集E分两类:〈Pi,rj〉表示进程Pi申请一个单位的rj资源并处于等待状态,称为申请边;<rj,Pi>表示有一个单位的rj资源已分配给进程Pi,称为赋给边。圆圈表示进程,方框表示每种资源的类型,框中圆点表示各单位(即同类资源数目)。 单资源死锁检测算法 设资源图为G=(V, E)。令S为顶点栈,flag[e]表示边e是否已经搜索过,基本思路就是对每一个顶点进行深度优先搜索,若发现环路,则有死锁。
例图? ? ? ? ?(x) r1 → p1? ?p2 ↓???????? ↓ p2 → r2 ← p4 → r3 → p5 ↑???????? ↑???????? ↓ p6? ? ? r4????????r5 ↑ ????????↑ ????????↓ r6 ???????p7???????? ←←← 多资源等价变换简化 ①寻找非阻塞,非孤立进程顶点,修改其申请为赋给边,该进程顶点成为出度为0的顶点,删除其所有边(即在有限时间该进程执行完毕后释放其全部资源),成立孤立顶点。 ②重复①直至所有进程都成为孤立顶点,则表示不存在死锁;否则仍存在边的不可简化的资源分配存在死锁,其中有边进程为死锁进程。 示例(x) r1 r2 T1 r2 r3 多资源检测算法?类似于银行家算法(略)。 死锁解除 通常是选择撤消或挂起代价最小的死锁进程,并抢占其资源以解除死锁。代价最小的判断原则可为进程优先级或系统会计过程给出的运行代价。解除死锁会造成进程中止而成为“牺牲者”,既“前功尽弃”,进而发生“饿死”现象。 总而言之,解决死锁问题的最合理做法应该是死锁的避免策略。 4.6死锁发生的概率数学家认为无论代价有多大,都要彻底防止死锁的产生,而工程师则需要了解死锁发生的频度、死锁的严重性,如果死锁平均每5年一次,而每个月系统都会因为硬件故障、编译错误或操作系统故障而崩溃一次,那么工程师们就不会以性能损失、可用性的代价去防止死锁。 实际上,大多数操作系统都潜在地受到死锁的威胁,而这些死锁从来没有被检测到过,便自动解除了。比如系统中进程表数量受到进程表表项数量的限制。假设一个系统中进程表有100项,有10个进程在运行,每一个进程都要创建12个子进程。在每个进程创建9个进程后,原来的10个进程和新创建的90个进程将用完进程表的所有表项,那么这10个进程都将进入一个无休止的fork循环,并导致失败,实际上死锁发生了。产生这类事件的概率是很小的,但确实可能出现! 由于解决死锁的代价通常很大,并常常给进程带来不便的限制。所以大多数操作系统处理这一问题的办法就是忽略它,即把头埋到沙子里,假装根本没有问题发生,鸵鸟算法。 也就是在便利性和正确性之间进行权衡。 5 线程5.1进程开头问题及进程特性假定一个用户正打算用编辑程序编辑一个文件,但在编辑前,想先审查分析一下该文件,并且要复制一个该文件的副本。为了加快以上工作,提高效率,有效的方法是并行运行以上各子任务。在只有进程机制的操作系统中,可以用并行程序设计语言来写此程序:为整个应用任务设置一个进程,而后该进程再为n个子任务生成n个子进程,以实现迸发的结果。这些进程在运行中提出访管要求(系统调用),如提出I/O请示、或由于超时而打断当前进程运行,调度其他就绪进程运行。进程切换带来的系统开销有:与进程运行有关的表格均要改(包括PCB表,各种队列,阻塞队列,运行队列或指针,就绪队列。存储管理有关的地址映射及表格、I/O文件的表格等。);可观的进程的地址空间转换为新调度进程的地址空间;两次模式转换(用户模式→内核模式→用户模式)。这些大量系统开销的总和在一定程度上降低了并发所带来的利益。这就是进程开关问题。(同时进程间通信的效率也受到限制) 进程的特性 ①进程是拥有自己资源的单元体,即存储器、外设等资源的分配单位; ②进程是被调度分派在处理器上运行的单元体,即是处理器高度的对象。 这里,①是关于拥有资源的主权,②是关于应用程序的执行。二者的统一体即传统的进程概念。 严重的局限性 ①对于想并发执行彼此独立任务且又共享一个公共的地址空间和其他资源的应用,这些进程本质上是并行的,但传统进程不能支持这些要求,而将应用中的独立的任务串行化,效率很低。 ②不能很好地利用多处理器系统。因为传统进程在某个时刻只能使用一个处理器。(尽管可为一个应用创建多个进程并分到多个处理器上执行,但问题是保证使用相同的地址空间和资源。) 5.2线程的概念引入的目的?提高进程内的并发程度。(简化进程间通信,以小的开销) 线程的定义Thread ①一个动态的对象,是处理器调度的基本单位,表示进程中的一个控制点,执行一系列的指令。 ②一个进程内的基本调度单位。 ③运行的最小单位。 ④进程内一个相对独立的、可高度的执行单元 线程的性质
传统的进程概念可视为只有一个主线程的进程。 线程的优点
进程与线程的关系 单进程线程 单进程多线程 多进程单线程 多进程多线程 进程与线程的不同 ①地址空间资源 不同进程的地址空间是相互独立的,同一进程的各线程共享同一地址空间。一个进程中的线程在另一进程中是不可见的。 ②通信关系 进程间通信必须使用操作系统提供的进程间通信机制,同一进程的各线程间通信可通过直接读写进程数据段(如全局变量)来进行通信,即在同步和互斥手段的辅助下以保证数据的一致性。 ③进程切换 同一进程线程切换比进程切换快得多。 第二章作业 1程序执行时的两种方式及特点是什么?
2讨论Bernstein条件。
3进程与程序的区别是什么?
4为什么说各进程在单机时并发执行与多机时并行执行在本质上是一样的?
5说明制约关系: a)若干同学去图书馆借书b)两队进行篮球比赛c)流水线生产中的各道工序
6解释临界资源、临界区及互斥同步机制的原则。
7设有K个进程共享一临界区,对于下述情况,说明信号量的初值,含义并用P、V原语写出互斥算法。 a)一次只允许一个进程进入临界区 b)一次允许L(L﹤K)个进程进入临界区
8进程A的工作流程如图,若系统中进程只有三种状态,转化如图。被调度选中后可投入运行,时间片q=200ms,用序号列出其生命过程,并注明原因。 开始 ????????计算????????? 盘I/O ????????带I/O? ? ? ? ? ? ?打印机I/O ????????结束 ? ? ? ? ? ? ? ? ? ? ? ? ?250ms ????????50 ms ????????200 ms ????????150 ms
9设有n个单元的环形缓冲区及一个无穷信息序列。甲进程按信息序列逐个地把信息写入环形缓冲区,乙进程则逐个地把缓冲区信息读出。试问: a)叙述甲、乙进程间的制约关系。 b)下面同步算法有无错误,若有,请纠错,其中S1 初值为0,S2初值为n﹣1。 进程甲 进程乙 V(S1) P(S1) 写入缓冲区 取出信息 P(S2) V(S2) c)若缓冲区有无穷多个,则两进程间制约关系如何?请写出相应的同步算法。 10设有64个存储区域其编号为0、…、63,存储区使用与否用一个64位的标志字表示,每一位对应一个存储区域,当某位置1时,表示该区已分配,置0表示该区空闲。get进程负责存储区的分配,每次分配一个区域,其分配动作为:找出标志字的某个为0位,将其置1;put进程负责存储区的回收,其回收动作为:把回收区域对应的标志字的相应位置0。试问: a)分析get,put进程的同步关系。 b)用P、V原语写出两个进程间的同步算法。 分析: get进程可以被连续调用执行,每次分配一个存储区直至64个存储区全部分配,若再调用get进程分配,则必须等待put进程对存储区的释放回收;put进程被调用执行,则不会受到限制;由于两个进程共同使用标志64个存储区的64位标志字,因此需要互斥。 设置信号量,m=1表示标志字的使用权,free=64表示可供分配的存储区,同步如下
11某超级市场,可容纳100人同时购物。入口处备有篮子,每个购物者可持一只篮子入口购物,出口处结帐,并归还篮子(出入口仅容一个人通过),请用P、V原语写出购物同步算法。 分析: 由题可知出入口为一个,所有购物者共同使用,因此需要竞争使用权,超级市场允许至多100个人同时购物,因此需要购物权100个。
12设某批处理系统中,有三个进程:卡片输入进程、作业调度进程、作业控制进程,它们之间的合作关系是: a)只要卡片机上有作业信息,输入进程就把作业逐个地输入到输入井,并为每个作业建立一个JCB块,并把它插入后备作业(JCB链表)中。 b)当内存中无作业运行时,作业调度进程从JCB链中挑选出一个作业,并把该作业装入内存。 c)作业控制进程负责处理已调入内存的作业。 试问: a)用P、V原语写出三进程间的同步算法。 b)用消息缓冲通信写出三进程间的同步算法。 分析: a)设信号量,卡片机准备好卡片card=0,后备作业计数jobs=0,内存无作业empty=1,内存有待处理作业full=0,JCB链的使用权,则各进程为
13、如图表示一条带闸门的运河,其上有两座吊桥,吊桥坐落在一条公路上,为使公路避开一块沼泽地令其横跨运河两次。运河及公路的交通都是单方向的。运河上的运输由驳船承担。当驳船接近吊桥A 100米时就鸣笛警告,若桥上无车辆,吊桥就吊起,直到驳船尾部通过桥为止。吊桥B也同样次序处理。典型驳船长度为200米。 ? 试问: 汽车和驳船在前进中是否会发生死锁? 提出防止死锁的办法。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 13:03:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |