操作系统进程通信_第1页
操作系统进程通信_第2页
操作系统进程通信_第3页
操作系统进程通信_第4页
操作系统进程通信_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章 进程通信1本章主要内容:同步和互斥的基本概念进程间的互斥控制和实现互斥锁机制及实现wait、signal操作进程间的同步控制用wait、signa操作实现同步经典的同步问题进程间的数据通信进程间的信号机制进程的资源分配和进程死锁21、同步和互斥的背景和概念1-1、进程的顺序执行:概念:进程在顺序处理器上的执行是严格按序的,即只有当一个进程结束后,才开始另一个进程。每个进程在执行时间上是不重叠的。特性:运行环境的封闭性:一个进程在运行时,不会受到其它进程的干扰。执行结果的确定性:进程执行的结果是可预知的。计算过程的可再现性:一个进程针对同一个数据集合一次执行的结果,在下一次执行时会重现

2、31-2、进程的并发执行:概念:处理器同时交错执行多个进程,一组进程的在执行在时间上是重叠的。特性:运行环境的开放性:进程在运行过程中可能会受到其它进程的影响。影响和交互类型:被动影响:资源竞争。主动合作:合作同步、数据交互、收发信号。运行结果的不确定性:对进程自身而言,其运行结果受不确定因素的影响。运行过程的不可再现性:两次运行可能会得到不同结果。41-3、进程同步:两个或两个以上的进程要协作完成一个任务,它们之间就要互相配合,需要在某些动作之间进行同步。含义:一个进程的某些动作需要与协作进程的某些动作之间在时序上要有一定的关系。如果协作进程的某些操作没有完成,那么进程就要在执行路径的某些点

3、上等待这些操作的完成,之后才能继续执行下去。例如:计算进程和打印进程是否可以通过约定时间等待的方式来实现进程间的同步?51-4、进程互斥两个或两个以上的进程同时竞争某资源,而该资源在同一时刻只能被一个进程使用。操作系统需要提供一种资源分配机制,来控制为这些进程分配资源的顺序,既保证各进程能够使用资源,又能保证各进程互斥使用资源。61-5、临界资源和临界区临界资源:一个时刻只能被一个进程访问或使用的资源。临界资源可能是硬件设备,也可能是软件资源,如共享的变量。临界区:在进程代码空间中,对临界资源完成一次完整访问/操作的代码区域称为一个临界区。又称临界段或互斥段。进入临界区:进程开始执行临界区的代

4、码。离开临界区:进程由执行临界区代码到不再执行临界区内的代码。7临界区的实例统计两个进程 P1和P2对共享变量count访问计数:P1:: P2:: R1=count R2=count R1=R1+1 R2=R2+1 count=R1 count=R2 : :8在并发系统中,进程可能并发交叉执行。两个进程可能的相对执行次序P1:R1=count R1=R1+1 P2:R2=count R2=R2+1 count=R2 P1:count=R1结果:虽然P1和P2进程各自都执行了对count加1的操作段,但结果count只增加1。原因分析:变量count就是临界资源,P1、P2访问count的两个

5、程序段就是临界区。但是两个进程同时进入了临界区执行了。91-6 临界区的基本特征:一个临界区对应临界资源的一次完整操作;临界区是针对特定临界资源而言的。不同临界资源对应的临界区是互不相干的;临界区可能是嵌套的:一个临界资源的临界区可能包含在另一个资源的临界区中。101-7、临界区的含义:对临界资源R的一次完整操作可能分为多个步骤。处于临界区的进程A可能已经完成了一些步骤,还有若干个步骤没有完成。也就是临界资源R可能处于一种中间或临时的状态。处于临界区的进程A如果被剥夺了CPU,CPU又选中了其它进程B运行:B如果不执行与临界资源R相关的操作。A再次被调度执行时,能够继续完成对R的剩余操作步骤。

6、B如果执行与临界资源R相关的操作,R所处于的中间状态就会遭到破坏。 A再次被调度执行时,无法继续完成对R的剩余几个操作步骤,从而导致运行错误。11要不出现运行错误,必须满足:OS必须保证进程A最好一次性(不被中断)完成对临界资源R的一次完整访问。如果不能保证一次性完成,最低也要保证新被调度到的进程不要执行与临界资源R相关的操作。也就是:并发进程不能同时处于某临界资源的临界区。121-8、临界区的设计和调度原则:互斥进入:在所有共享相同资源或对象的临界段中,每次只能允许一个进程进入空闲让进:当无进程在临界区中,且有进程希望进入临界区时,必须让某希望进入进程立即进入临界区。有限停留:不能让一个进程

7、无限时得停留在临界区,一个进程只能在临界段内停留有限的时间。公平进入:不能让某进程无限等待进入临界区。高效性:临界区的设计要尽可能短,从而使进程停留在临界区的时间尽可能短,提高进程的并发处理效率。131-9、开、关中断法实现临界区调度基本思想:互斥资源和临界区设置都是由于进程的并发特性引起的。每当进程处于临界区时,禁止进程间的并发特性,不允许重新进行进程调度。基本方法:进程在进入临界区时关闭系统中断。进程离开临界区时开放系统中断。关闭系统中断,意味着不可能出现进程重新调度。14主要不足:如果临界区比较长,长时间关闭中断会影响系统处理效率,甚至会紧急事件的处理能力。在多CPU系统中,禁止中断一般

8、只是禁止本CPU的中断处理,其它CPU上的并发进程仍可能进入临界区。降低了进程间的并发性能。因为运行进程A处在一个临界资源R的临界区时,可以重新调度到进程B,只要保证B进程不进入资源R的临界区。但这种方式下,A,B间并发就会受到影响。152、互斥锁与实现2-1、锁机制的背景和思路背景:临界区的基本调度目标:互斥进入和空闲让进避免长时间关闭中断的缺点。思路:通过锁(如布尔变量X)的状态来表示是否有进程在临界区X=0:打开状态X=1:关闭状态进程要进入临界区前,必须要测试锁的状态,只有打开状态时,才能进入临界区。进程在进入临界区的那一刻立即关锁进程在离开临界区时要立即开锁162-2、锁机制的安全性

9、保证条件安全性问题:锁的关闭操作包含测试锁的状态和关锁两个步骤。问题描述:如果进程A测试锁状态为开,但在加锁前被剥夺CPU;被调度的进程B发现锁状态为开,可能关锁并进入临界区。A恢复执行后,以为锁状态仍为开,于是关锁并进入临界区。可能出现两个进程同时进入临界区。安全性保证条件:把测试锁状态和关锁两个步骤实现为不可分割的原子性操作。172-3、锁机制的硬件实现测试并设置指令test&setCPU的指令系统中存在test&set指令test&set指令首先测试锁变量的值,如为1,则重复执行本指令(相当于阻塞在这里);如为0,则立即将锁变量的值置为1由于test&set是一条完整的指令,而在一条指令

10、的执行中间是不会被“中断” 的,故保证了锁的测试和关闭操作的原子性(即不可分解的特性)。18交换指令exchangeCPU的指令系统中存在交换指令,该指令能够实现两个变量之间的内容交换。基本思想:复制测试。复制同时进行加锁。19具体实现:设置:测试变量和锁变量进入临界区前:A、首先置测试变量的值为1,然后对测试变量和锁变量执行交换指令。B、如果测试变量值为0;进入临界区C、如果测试变量值为1;重新转向A。离开临界区:设置锁变量值为0;20用中断机制保证锁的安全性用中断机制保证测试锁状态和关锁操作的原子性。在测试锁状态前关闭中断;如果测试不通过,开中断,然后重新测试。如果测试通过,关锁,然后开中

11、断,进入临界区。优缺点:中断关闭时间短,只两条指令。不会影响到中断处理效率,也不会影响进程的并发特性。不能用于多CPU系统。212-4、锁机制的软件实现背景:硬件实现需要代价比较大移植性差,依赖具体的硬件平台在多处理环境下有些硬件实现方式不使用,如中断机制主要的软件实现方法1965年,Dekker提出的方法1981年,Peterson提出的方法22Peterson的算法描述假定两个互斥进程,编号为0,1全局变量:设置进程状态数组Wanted_In2,Wanted_In0/1 =False,表示0/1号进程不在临界区,也不处于希望进入临界区的状态。Wanted_In0/1 =True,表示0/1

12、号进程处在临界区,或者处于等待进入(或即将)临界区的状态。全局变量:Observer:标示最后一个试图(或成功)进入临界区的进程编号。23进入函数enter_section(int process):Int other = 1 process;Wanted_inprocess = TRUE;Observer = process;While (observer = process & wanted_inother )离开临界区的函数leave_section(int process)Wanted_inprocess = FALSE;使用方法:Enter_section(myself_id)临界区

13、代码Leave_section(myself_id)24Peterson算法的正确性分析进程状态分析不在临界区,也没参与竞争临界区:wanted_inself = FLASE;参与竞争临界区,但还没有设置观察进程(刚执行完wanted_inself = TRUE):刚设置了观察进程,但还没有执行测试进入: wanted_inself = TRUE处于循环等待态: wanted_inother = TRUE 并且 observer = self25刚进入临界区: wanted_inself = TRUECASE1: Wanted_inother = FALSE, observer = selfC

14、ASE2: Wanted_inother = TRUE, observer = other,CASE3: Wanted_inother = FALSE,且observer = other(实际上不可能出现)处于临界区:wanted_inself = TRUE26推论1:两进程处于竞争状态时,先执行观察者设定语句的进程能够竞争成功。后者只能等待前者退去临界区,再进入临界区。竞争状态的定义:两个进程都执行了wanted_inself = TRUE,但都还没有进入临界区。正确性论证:因为wanted_in1 / 0 = TRUEObserver的值为后执行观察者设定语句进程的编号先执行观察者设定语句

15、的进程不会阻塞在while处,从而能够进入临界区。后执行观察者设定语句的进程,阻塞在while处.27两个进程不可能同时进入临界区:(假定1)进程0先进入临界区:状态为wanted_in0 = TRUE(假定2)进程1要进入临界区只能是observer = other,也就是说需要进程0要在进程1后面执行观察者设定语句。假定1和假定2相互矛盾。因而两个进程不可能同时进入临界区。28空闲让进:CASE1:一个进程希望进入临界区,而另一个进程不在临界区中,也没来竞争,让该进程进入临界区。因为wanted_inother = FALSE. 进程不会阻塞在while处。CASE2:两个进程在处于竞争状

16、态时,不可能同时被阻塞。由推论1得到。293、信号量及互斥应用3-1、锁机制的主要问题忙等机制,不停的测试锁的状态,浪费了CPU时间。不公平。多个进程竞争时,可能会出现一个进程永远不能进入临界区,类似于随机调度。不能对同类的多资源的互斥处理:如系统存在两个打印机,如何进行互斥分配。忙等发生在高优先级进程时,容易出现死锁。303-2、同类多互斥资源下临界区的理解:把对一类资源(包含多个资源)的访问代码也称为临界区,可以称之为广义临界区互斥进入的新解释:假定资源数为n,同时进入广义临界区的最大进程不超过n。313-3、信号量的基本原理和思想:进程间通过信号实现相互协作和通信。信号在逻辑意义上对应于

17、资源,信号可以类似于短消息,可以缓存在某个地方(假定叫信号缓冲区)。进程在释放资源时,发出释放资源的信号。进程要申请互斥资源,要等待信号的到来。如果缓存区中有信号,消耗一个信号后,占有资源如果缓冲区中,没有信息,把自己阻塞在这个信号上。32如果在阻塞过程中,收到信号,消耗掉该信号后,进程被唤醒执行。如果多个进程阻塞在一个信号上,有信号到来,会根据调度原则,决定哪个进程真正收到该信号。333-4、信号量操作机制-信号量的具体实现:把信号量表示为一个整数,在逻辑上对应可分配的资源数量。初始值对应系统所有该类资源的数量资源申请操作(P操作,wait操作或sem wait操作)(进入临界区前调用该操作

18、):信号量的值减1;如果其值为负值,把进程阻塞在该信号上。34资源释放操作(V操作,signal操作或sem signal)(离开临界区前调用该操作):信号量的值增1;如果其值为负值或0,表明有进程阻塞在该信号上。从阻塞的进程中,按调度原则挑选一个唤醒。Wait和signal操作是不可中断的,所有一般把这种不能中断的操作称作原语。即wait原语、signal原语。35typedef struct semaphore int value ; Queue queue; Semaphore ;Semaphores;Void wait(semaphore s)s.value -; If (s.valu

19、e 0 )将进程放入等待队列s.queue阻塞该进程重新进程调度36Void signal(semaphore s)s.value +; If (s.value = 0 )从等待队列s.queue去出一进程唤醒该进程373-5、实现进程互斥,信号量的取值含义:正值:表示还能有几个进程分配到资源(即进入临界区)。0:表示没有待分配资源,但也没有进程在等待资源。负值:等待分配资源的进程数,即阻塞的进程数。38信号量的使用示意在相应进程Pi中Wait(s)临界区Signal(s)394、wait、signal操作用于进程同步4-1、基本思路:互斥:用信号量表示可分配的资源数。用wait原语表示资源申

20、请分配,用signal原语表示资源释放。信号量初始值为最大的资源数。wait、signal原语一般在临界区前后成对出现。40同步:用信号量来所等待的操作是否已经完成。用wait操作表示等待其他进程协作任务完成的通知,用signal操作表示发送协作任务完成的通知。信号量初始值一般为0。一般一个进程执行wait操作,另一个进程执行signal操作。414-2、同步的简单实例:背景:两个进程分别完成一个复杂函数计算,然后由一个进程计算函数结果的乘积。实现:置信号量s的初值为0 Pa Pb计算func1( ) 计算func2( )L1:wait(s) /等待func结果 将计算结果存入缓冲区获得Pb的

21、计算结果 L2:signal(s) /通告操作完成 计算乘积 424-3、全同步和半同步半同步:进程a要同步等待进程b,而进程b则不必同步等待进程a。全同步:进程a要同步等待进程b,而进程b也要同步等待进程a。43全同步的例子:设有两个进程Pa和Pb。进程Pa每次执行一个计算,缓存区空闲:将结果存入缓冲区;缓存区被占用,即上一个结果还没打印:阻塞自己,等待缓存区空闲。进程Pb试图从缓冲区中取出结果若有内容将结果打印出来,清空缓存区。若没内容,阻塞自己,等待结果写入缓存区444-4、全同步例子的实现进程b需要同步(等待)缓存区中有a计算出的新结果。可用信号量s1表示这种同步关系:表示是否有待打印

22、的数据,初始值为0。进程b打印前,执行wait(s1)原语。进程a计算完结果写入缓冲区后,执行signal(s1)原语。进程a需要等待缓存区空闲时,才能写入新的计算结果。可用信号量s2表示这种同步关系:表示缓冲区是否为空,初始值为1。进程a计算完,要将结果写入缓冲区前,执行wait(s2)原语。进程b打印后,执行signal(s2)原语。45计算进程Pa打印进程Pbcomputing wait(s1)wait(s2) get (result)put (result) signal(s2)signal(s1) printing图 4-6 两个进程之间的全同步464-5、生产者和消费者问题问题描述

23、:一群生产者,每个生产者每次生产一件产品。一群消费者,每个生产者每次消费一件产品。一个产品仓库(最大可暂存n个产品)。如果仓库满,生产者暂停生产。如果仓库中一个产品没有,消费者暂停消费。47信号量设置:Buffers:表示仓库(缓冲区)的空闲容量。生产者生产一个产品后,放入缓冲区前,对此执行wait操作消费者消费一个产品后,对此执行signal操作初始值为nProducts:表示仓库中的产品数量。生产者生产一个产品后,放入缓冲区后,对此执行signal操作消费者消费一个产品前,对此执行wait操作初始值为0Mutex:实现对缓存区操作的互斥1:表示没有进程进行缓冲区操作0:表示有一个进程正在对

24、缓存区进行操作。-m:表示有一个进程正在对缓存区进行操作,还有m个进程在等待进入缓存区操作。初始值为148 producers: customers: while ( ) while ( ) produce next product; wait (products); wait (buffers); wait (mutex); wait (mutex); get product from buffers; Put product into buffers; signal (mutex); signal (mutex); signal (buffers) signal (products); c

25、onsume product; 494-6、读者/写者问题问题描述:若干个并发进程对数据对象进行读写的情况。多个读操作可以同时执行。一个写者不能与任何的读者或者其它写者同时访问数据对象50解决思路:如果将所有读者的读操作视为一个操作,也就是说任何操作都是互斥的。可设置一个信号量Wrt来实现互斥对写操作,写前执行wait原语,写完成后执行signal原语。对读操作,读前执行wait原语,读后执行signal原语。具体分析不同的写操作只需在第一个读操作执行之前执行wait原语,在最后一个写操作完成以后执行signal操作51因为要判断出哪个读者是最后完成操作的,需要对正在进行读操作的读者用变量co

26、unt进行计数. 一个读者在读之前执行count+,在读之后执行count-。可能会存在多个读者同时修改变量count,使得无法判断出是否还有读操作在执行。需要设置信号量mutex对count实现互斥访问52全局变量和信号量设置:Count:表示正在执行读操作的进程数目初始值为0信号量Mutex:表示是否有读者在对全局变量count进行修改。初始值为1信号量Wrt:表示是否有进程在执行读或写的操作,1表示没有,0和负值表示有。初始值为153 readers:while ( ) wait(mutex); if( +count = = 1)wait(wrt);signal(mutex);Read

27、information; wait(mutex); if ( -count = 0 ) signal(wrt);signal(mutex);writers: while ( ) wait(wrt); write information signal(wrt); 544-7、思考题:背景:上述读者/写者的解决方案,对写者是不公平的,写者可能会饿死。公平的思路(先来先服务):如果写者已在等待进入,后来的读者不应该进入。思考题:是否能够按照先来先服务的思想,实现读者/写者问题。555 进程间的数据通信5-1、进程间通信的背景锁和信号量便于传递控制信息,重要用于进程间的运行控制。对大批量的数据传输而言

28、,还需要专门的数据通信机制。565-2、消息通信基本原理由系统的消息通信机构统一管理一组空闲的消息缓冲区。 一个进程要向另一个进程发送消息,先要向系统申请一个缓冲区,填写了消息正文和其它有关消息的特征、控制信息后。 接收进程在一个适当时机从消息队列中移出一个消息,读取所有的信息后,再释放消息缓冲区。57使用方法:创建消息队列:Msgid = msgget(key, flag),key是一个整型键值,flag表示权限特性和创建特性。进程要求创建一个消息队列时,核心先要按进程提供的关键字值查找系统的消息队列表;如已存在指定关键字的消息队列,则说明该队列已先由其它进程创建,只要权限允许,可简单地返回

29、该表项的描述符。通过多个进程同时对一个消息队列进行操作,从而实现进程间通信。58写消息:Msgsnd(msgid, msgbuf, msgsize, msgflag)Msgid:从msgget(key, flag)返回的值Msgbuf:要发送的消息缓冲区,包含type和textmsgSize:消息长度。Msgflag:控制字段,指定达到消息队列的最大长度时的处理方式。读消息:msgrcv(msgid, msgbuf, msgsize,msgtyp,msgflag)Msgid:从msgget(key, flag)返回的值Msgbuf:接收消息的缓冲区msgSize:消息长度。Msgtyp:消息的

30、类型Msgflag:指明消息处理方式。59信息传递的特点:在一定程度上(对同一类型的消息),消息队列具有先进先出的特点。以消息为基本单位进行信息传递。用户使用时不用担心对消息的同步读写问题,系统自动完成同步和互斥。605-3、共享内存基本思想:共享存储区机制可以把内存中的一个区域连接入多个进程的虚地址空间,当一个进程对该地址空间写入数据后,另一个进程就可以从自己所连入的虚地址空间直接读出共享存储区中的数据,就如同进程存取自己的私有数据一样方便。61实现技术:进程要求分配一个共享存储区时,核心先要按进程提供的关键字值查找系统的共享存储区段表,如已存在指定关键字的共享段,则说明该共享段已先由其它进

31、程创建,只要权限允许,可简单地返回该表项的描述符。如未找到指定关键字的表项,系统就根据进程对共享存储区的大小及存取控制权的要求,分配一个空闲的内存块,在共享存储区段表中填入共享段的关键字、大小、共享段的页表始址及存取控制权等信息,并返回该表项的描述符。进程可以根据表项描述符,把这一段内存块对应到进程地址空间。62具体使用:创建:shid=shget(key,size,shmflag)Key:键值Size:共享内存的长度Shmflag:控制标示挂接到进程地址空间:shmat (shid,*addr,flag):Shid:共享内存的描述符,shget的返回值;*addr:挂接到哪个地址;Flag:

32、挂接控制标示。取消挂接:shmdt(*addr)Addr:挂接的地址635-4、管道通信管道是一种信息流缓冲机构,它用于连接发送进程和接收进程,以实现它们之间的数据通信。管道以先入先出(FIFO)的方式组织数据的传输。在发送进程和接收进程之间能传递任意大的信息,但在实现时所开的缓冲区太小是有限的,故当管道写满时,发送进程就被阻塞,只有当接收进程从管道中读出一部或全部信息后,发送进程才能继续向管道写信息。反之也一样,当接收进程读空管道时,就要等待发送进程继续将信息写入管道。在UNIX中,管道是以文件为基础。646信号和信号处理6-1、背景一个进程在运行过程中,可能会碰到一些事件(进程终止),如何

33、把这些事件的发生及时通知给相关的其它进程(如父进程)呢?碰到一些异常事件,如何通知用户进程进行处理呢?如出现浮点溢出。6-2、解决思路。由于这些事件类型比较固定,可以用位图的形式来表示事件,通过设置和检测对应控制位方式完成。信号发起者(A进程或操作系统):在事件发生时,设置对应的控制位。信号接收者(B进程):通过检测相应控制位是否设置,来感受到是否有特定事件发生。65信号接收者轮询控制位的方式效率低下,需要结合中断的技术思想。用于事件类型固定,就几种或数十种。 B程序中可以预先设定每种事件的处理函数,并把对应关系告诉操作系统。操作系统在B程序的某对应信号设置后,会在合适的时机自动执行所设定的函

34、数。对一部分类型的事件,每类事件对不同的进程而言处理过程基本类似。操作系统为每类事件设置了默认处理函数。如果B进程不设置,事件发生时,操作系统调用默认处理函数进行处理。信号的处理方式和硬件中断的处理方式有类似之处,因此,信号又被称为“软中断”666-3、信号与硬件中断的不同中断有优先级的概念,而信号没有硬件中断是针对整个系统而言的,而信号是针对某个具体应用程序的硬件中断的处理是由CPU和OS共同完成的,比较及时,而信号处理是由应用程序和OS共同完成的,只在特定的执行点检查信号,处理不太及时中断处理函数运行在核心态,而信号处理函数执行在用户态。676-4、信号的产生和保存信号产生:硬件故障:软件

35、操作异常:终端操作(键盘按键等):某进程发送:父子进程间的信号发送通过系统调用kill向特定进程发送信号信号保存:在进程控制块中,有一个有关信号的数据结构p_sig 。该结构由操作系统进行置位。686-5、信号的类型0 没有收到信号1 SIGHUP 终止进程 终端线挂断2 SIGINT 终止进程 在键盘上击“ DELETE”键7 SIGFPE 产生core 浮点溢出9 SIGKILL 终止进程 无条件终止进程10 SIGBUS 产生core 总线错误11 SIGSEGV 产生core 段违例14 SIGALARM 终止进程 闹钟15 SIGTERM 终止进程 软件终止16 SIGUSR1 终止

36、进程 用户自定义17 SIGUSR2 终止进程 用户自定义19 SIGPWR 终止进程 电源故障696-6、信号处理信号处理方式进程控制块中存在数组signalNSIG,以信号类型作为该数组的下标索引,元素的值决定了对应信号的处理方式。信号的处理方式有三类0:执行信号机构定义的缺省动作。1(奇数):忽略该信号,不执行任何动作偶数:执行进程设定的信号处理函数一个进程在创建时,继承父进程所有的信号处理方式。70信号处理设置:除了SIGKIL外,信号表中定义的信号处理方式都可以用系统调用signal(sig,func)设置或修改。设置的方法是: int sig; int func(),(*oldpt

37、r)(); : oldptr = signal(sig,func); :其中sig为信号类型,取值范围为119,但不包括9(SIGKIL),func为新的信号处理函数,oldptr为函数指针,用于保存系统调用signal返回的信号sig原先处理函数入口地址,以便有必要时可恢复原先的信号处理方式。71特殊设置方式Signal(sig,SIG_DFL):恢复默认的信号处理方式Signal(sig,SIG_IGN):忽略该信号的处理72信号处理的时机:收到信号的进程并不是立即暂停手头工作,进行信号处理只有当进程从核心态即将返回到用户态时,即系统调用、陷入或中断返回时才检查p_sig项,并处理与信号对

38、应的事件。信号的产生伴随一些操作自动产生应用程序调用系统接口主动发送736-7、信号通信的实例利用信号实施进程间通信的主要方式是使用系统调用kill(pid,sig),其功能是将信号sig传送给由参数pid限定的进程。当: pid为正值时,对应于一个有效的进程标识数,该信 号就发送给这个唯一的进程。 pid为0时,将信号发送给受同一终端控制的所有进程。 pid为-1时,将信号发送给与发送进程用户标识数相同的所有进程。 pid -1时,将信号发送给组标识数为pid的绝对值的所有进程。74# include # include main ( )int status;pid_t pid;void f

39、unc ( );signal (SIGUSR1,func); /* 预置信号处理程序 */if (pid=fork () ) printf (Parent: will send signal.n); kill (pid, SIGUSR1); /* 发送信号 */ wait (& status); /* 等待子进程停止 */ printf (status=%d: Parent finished:n,status); else sleep (10); /* 等待接受信号 */ printf (Child:signal is received.n); exit (0); void func () p

40、rintf (It is signal processing function.n); 7 757、资源分配和死锁7-1、死锁产生的原因:硬件资源竞争:每个进程都竞争到部分资源,但这部分资源又不能让其继续运行到结束。硬件资源分配不当:软件资源竞争:wait、signal操作不当:7677进程B等待资源R1资源R1 进程B 进程A资源R2进程A占用资源R1进程A等待资源R2进程B占用资源R2图4-11两个进程的死锁787-2、死锁的定义和处理思路:死锁:如果在一个进程集合中的每个进程都在等待只能由该集合中的其他一个进程才能引发的事件,则称一组进程或系统此时发生了死锁。 死锁处理思路:悲观法:认为

41、死锁会经常出现,在分配资源时就加以考虑,避免死锁问题出现。缺点:设备利用率较低。乐观法:认为死锁很少出现,在分配资源时不加控制,待真正出现时再进行处理。缺点:等死锁真正出现时解决需要代价大。797-3、死锁产生的条件:同时具备下列三个静态的必要条件时,才有可能产生死锁。 (1) 互斥使用 每次只能允许一个进程占有和使用一个资源,其它申请该资源的进程被阻塞。(2) 保持并等待 当进程等待分配给它新的资源时,保持占有已分配的资源。(3) 不可剥夺 不能强迫移去进程占有的未使用完的资源。 上述这三个条件是产生死锁的必要条件,但即使存在全部这三个条件也不一定会发生死锁。要产生死锁必须存在第四个动态条件

42、:(4) 循环等待 存在一个闭合的进程资源链,以致每一个进程至少占有链中下一个进程所需要的一个资源。807-4、死锁预防死锁预防的思路:在系统设计时,通过确定资源的分配策略,预先排除死锁的可能性。死锁预防的手段:破坏发生死锁的四个条件之一互斥占用:是由资源的固有特性确定。81保持和等待:静态分配策路:系统一次申请它所有用到的资源,如果能满足就分配,如果不能满足,一个也不分配。缺点:设备利用率低若一个进程不能获得进一步的资源,就释放它占有的资源。缺点:有些设备不便于频繁释放。不可剥夺条件:一个进程需要申请当前正被其它进程占用的资源,操作系统就要求后者释放它所占用的这类资源。缺点:有些设备不便于释放,只有在资源状态容易保存和恢复时才比较有效82循环等待条件采用有序资源使用法可以防止循环等待条件。如果一个进程已经分配了类型R的资源,那么以后它只能申请在资源顺序表中排在R后面的资源类型。12345数模转换器磁带机打印机光刻机绘图仪83一般讲常用的、普通的设备编为低序号,将数量少、贵重的资源作为高编号。有利于提高后一类资源的利用率相对而言,比前两类预防方法,资源的利用率高,但前一类资源的利用率相对较低。847-5、死锁的避免基

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论