首页计算机计算机软件计算机操作系统 03 第二章 进程管理 2.3-2.4.pptx

03 第二章 进程管理 2.3-2.4.pptx

页数:58页文件大小:363.0 KB来源: 计算机操作系统ppt课件

本课件讲解进程同步,先区分互斥与同步两类制约关系,说明临界区与同步机制四条准则,继而展开整型、记录型与 AND 信号量及管程机制,最后用信号量求解生产者消费者、哲学家进餐、读者写者等经典同步问题。

计算机操作系统第二章进程管理封面,标示本章围绕进程同步、信号量机制与经典同步问题展开。
2.3进程同步,间接相互制约源于资源共享。
进程的同步与互斥,临界资源:一次只允许一个进程使用的系统资源。
查看本课件的文字版(共 58 页,供检索与复制)

第1页:第二章 进程管理封面

第二章 进程管理:本页为《计算机操作系统》课件封面,标注课程名称与英文名称 Operating Systems,并列出 WINDOWS、UNIX、LINUX 等常见操作系统类型。

第2页:2.3进程同步

2.3进程同步

  • 进程同步的基本概念
  • 两种形式的制约关系
  • ①间接相互制约关系
  • 间接相互制约源于资源共享
  • ②直接相互制约关系
  • 主要源于进程间的合作

第3页:进程的同步与互斥

进程的同步与互斥

  • 进程的两大关系
  • 互斥(间接制约关系)
  • 各进程竞争使用同一临界资源
  • 临界资源:一次只允许一个进程使用的系统资源
  • 进程同步(直接制约关系)
  • 根据一定的时序关系合作完成一项任务
  • 为完成共同任务的并发进程基于某个条件来协调其活动

第4页:生产者-消费者问题描述

生产者-消费者问题描述:生产者-消费者问题。

第5页:生产者-消费者问题的程序描述

生产者-消费者问题的程序描述

生产者-消费者问题producer:repeat…produce an item in nextp;…while counter=n do no-op;buffer[in]:=nextp;in:=(in+1) mod n;counter:=counter+1;until falseconsumer:repeatwhile counter=0 do no-op;nextc:=buffer[out];out:=(out+1) mod n;counter:=counter-1;consumer the item in nextc;until false

第6页:counter变量的机器指令分解

counter变量的机器指令分解

生产者-消费者问题counter:=counter+1:register1:=counter;register1:=register1+1;counter:=register1;counter:=counter-1:register2:=counter;register2:=register2-1;counter:=register2

第7页:并发执行导致结果不可再现

并发执行导致结果不可再现

生产者-消费者问题生产者进程://counter初始值=5 ⑥counter:=register2;;程序的执行已经失去了再现性。解决此问题的关键是应把变量counter作为临界资源处理,令生产者进程和消费者进程互斥地访问变量counter。5register15register2465counter46

第8页:临界区的概念

临界区的概念

临界区 把在每个进程中访问临界资源的那段代码称为临界区

第9页:临界区的进入与退出

临界区的进入与退出:临界区。

第10页:同步机制应遵循的规则

同步机制应遵循的规则:同步机制应遵循的规则1.空闲让进。2.忙则等待。3.有限等待。4.让权等待。

第11页:2.3.2信号量机制

2.3.2信号量机制

2.3.2信号量机制1整型信号量 定义为一个用于表示资源数目的整型量S

第12页:记录型信号量

记录型信号量

  • 2记录型信号量
  • 记录型信号量机制是一种不存在“忙等”现象的进程同步机制
  • 增加一个进程链表指针L
  • 用于链接上述的所有等待进程

第13页:wait与signal操作原语

wait与signal操作原语

申请一个单位资源:procedurewait(S)var S:semaphore;beginS.value:=S.value-1;if S.value<0 thenblock(S.L);end释放一个单位资源:procedure signal(S)var S: semaphore;BeginS.value:=S.value+1;if S.value<=0 thenwakeup(S.L);end

第14页:信号量的物理意义

信号量的物理意义

  • 一般信号量
  • 若信号量s.value为正值
  • 则s.value所代表的实际还可以使用的物理资源数
  • 若信号量s.value为负值
  • 则其绝对值等于登记排列在该信号量s队列之中等待的进程个数
  • S.value的初值为1时
  • 表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量,用于进程互斥。信号量的值value信号量队列指针

第15页:多临界资源互斥引发的死锁

多临界资源互斥引发的死锁:上述的进程互斥问题,是针对各进程之间只共享一个临界资源而言的。process A:process B:wait(Dmutex);wait(Emutex);wait(Emutex);wait(Dmutex);若进程A和B按下述次序交替执行wait操作:process A: wait(Dmutex);于是Dmutex=0process B: wait(Emutex);于是Emutex=0process A: wait(Emutex);于是Emutex=-1 A阻塞process B: wait(Dmutex);于是Dmutex=-1 B阻塞。

第16页:3AND同步机制的基本思想

3AND同步机制的基本思想

3AND同步机制的基本思想 采取原子操作方式 要么把它所请求的资源全部分配到进程 要么一个也不分配 可避免上述死锁情况的发生 在wait操作中,增加了一个“AND”条件 AND同步,或称为同时wait操作

第17页:Swait操作的定义

Swait操作的定义

Swait(S1,S2,…,Sn)if S1>=1 and…and Sn>=1 thenfori:=1 to n doSi:=Si-1;endforelse当发现第一个Si<1就把该进程放入等待队列,并将其指令计数器置于Swait操作的开始位置endif

第18页:Ssignal操作的定义

Ssignal操作的定义

Ssignal(S1,S2,…,Sn)fori:=1tondoSi:=Si+1;RemovealltheprocesswaitinginthequeueassociatedwithSiintothereadyqueue.endfor

第19页:信号量实现进程互斥

信号量实现进程互斥

2.3.3信号量的应用利用信号量实现进程互斥Varmutex:semaphore=1;beginparbeginprocess1:beginrepeatwait(mutex);critical section;signal(mutex);remainder section;until false;endprocess 2: beginrepeatwait(mutex);critical section;signal(mutex);remainder section;until false;Endparendmutex10NULL-1

第20页:2.3.4管程机制

2.3.4管程机制

  • 管程引入
  • 把分散在各进程中的临界区集中起来进行管理
  • 防止进程有意或无意的违法同步操作
  • 可利用共享数据结构抽象地表示共享资源,把对共享数据结构实施的操作定义为一组过程
  • 进程对共享资源的操作,都是通过这组过程对共享数据结构的操作来实现的
  • 确保每次仅有一个进程使用共享资源

第21页:管程的定义

管程的定义

  • 一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据
  • 管程的组成1.名称;2.局部于管程内部的共享数据结构说明;3.对该数据结构进行操作的一组过程;4.对局部于管程内部的共享数据设置初始值语句

第22页:管程的示意图

管程的示意图:管程的示意图conditionc1wait(c1)…conditioncnwait(cn)局部数据条件变量过程/函数1过程/函数k出口初始化代码入口管程等待调用过程的进程队列管程等待区…。

第23页:管程的条件变量

管程的条件变量

  • 条件变量
  • 出现在管程内的一种数据结构Varx,y:condition
  • 只有在管程中才能被访问
  • 它对管程内的所有过程是全局的
  • 只能通过两个原语操作wait和signal来控制它

第24页:x.wait操作

x.wait操作

  • 正在调用管程的进程因x条件需要被阻塞或挂起时调用x.wait
  • 将自己插入到x条件的等待队列上并释放管程
  • 直到x条件变化
  • 此时其它进程可以使用该管程

第25页:x.signal操作

x.signal操作

  • 正在调用管程的进程发现x条件发生了变化,则调用x.signal
  • 重新启动一个因x条件而阻塞或挂起的进程
  • 这与信号量机制中的signal操作不同
  • 若进程Q因x条件阻塞,而正在调用管程的进程P执行x.signal操作后,Q被重新启动,可采用下述两种方式之一进行处理
  • P等待,直至Q离开管程或等待另一条件
  • Q等待,直至P离开管程或等待另一条件

第26页:管程的主要特性

管程的主要特性

  • 管程主要特性
  • 模块化
  • 基本程序单位,可以单独编译
  • 抽象数据类型
  • 包含数据和操作
  • 信息隐蔽
  • 从外部看不到内部信息

第27页:管程与进程的区别

管程与进程的区别

  • 管程和进程不同
  • 管程定义的是公共数据结构
  • 进程定义的是私有数据结构PCB
  • 管程把共享变量上的同步操作集中起来
  • 临界区却分散在每个进程中
  • 管程的设置则是解决共享资源的互斥使用问题
  • 设置进程的目的在于实现系统的并发性
  • 进程通过调用管程中的过程对共享数据结构实行操作
  • 管程为被动工作方式,进程则为主动工作方式

第28页:管程与进程的区别(续)

管程与进程的区别(续)

  • 管程和进程不同(续)
  • 管程不能与其调用者并发
  • 进程之间能并发执行
  • 管程是操作系统中的一个资源管理模块,供进程调用
  • 进程具有动态性,由“创建”而诞生,由“撤销”而消亡

第29页:2.4经典进程的同步问题

2.4经典进程的同步问题

  • 2.4.1生产者—消费者问题
  • 生产者—消费者问题是相互合作的进程关系的一种抽象
  • 制约关系
  • 只要缓冲池未满,生产者便可将消息送入缓冲池

第30页:信号量解决生产者消费者问题

信号量解决生产者消费者问题

  • 用信号量及P、V操作解决进程间同步问题
  • ①一个生产者、一个消费者共享一个缓冲区
  • ②多个生产者、多个消费者共享多个缓冲区

第31页:单生产者单消费者共享单缓冲

单生产者单消费者共享单缓冲:①一个生产者、一个消费者共享一个缓冲区的解int B;semaphore empty;

第32页:单缓冲同步的伪代码解

单缓冲同步的伪代码解

一个生产者、一个消费者共享一个缓冲区cobeginprocess producer(){ process consumer(){while(true){ while(true) {produce( );P(empty);append( ) to B;V(full);} }} }coendEmptyfull空1不满00满1无缓冲区-1空-1P(full);V(empty);consume( );take( ) from B

第33页:多生产者多消费者环形缓冲

多生产者多消费者环形缓冲:②一组生产者,一组消费者,公用n个环形缓冲区。

第34页:记录型信号量解生产者-消费者

记录型信号量解生产者-消费者

利用记录型信号量解决生产者—消费者问题Varbuffer:array[0,…, n-1]of item;in,out:integer:=0,0;

第35页:生产者-消费者问题的解

生产者-消费者问题的解

生产者/消费者、共享多个缓冲区的解parbeginProceducer_i:beginrepeat…produce an itemnextp;…wait(empty);wait(mutex);buffer(in) :=nextp;in:=(in+1) mod n;signal(mutex);signal(full);until false;endparendConsumer_j:beginrepeatwait(full);wait(mutex);nextc:=buffer(out);out:=(out+1) mod n;signal(mutex);signal(empty);consumer the item in nextc;until false;endparendend

第36页:并发解法中的永远等待问题

并发解法中的永远等待问题

永远等待cobeginprocessproducer_i(){while(true){produce();P(mutex);P(empty);append to B[in];in=(in+1)%k;V(mutex);V(full);}}coendprocessconsumer_j(){while(true){P(full);P(mutex);take( ) from B[out];out=(out+1)%k;V(mutex);V(empty);consume( );}}emptyfull0kMutex=1Mutex=0-1

第37页:信号量及P、V操作讨论

信号量及P、V操作讨论

  • P、V操作必须成对出现
  • 当为互斥操作时,它们处于同一进程
  • 当为同步操作时,则不在同一进程中出现
  • 如果P(S1)和P(S2)两个操作在一起,那么P操作的顺序至关重要
  • 一个同步P操作与一个互斥P操作在一起时,同步P操作在互斥P操作前
  • 两个V操作无关紧要

第38页:哲学家进餐问题

哲学家进餐问题:有五个哲学家围坐在一圆桌旁,桌中央有一盘通心面,每人面前有一只空盘子,每两人之间放一把筷子。每个哲学家思考、饥饿、然后吃通心面。为了吃面,每个哲学家必须获得两只筷子,且每人只能直接从自己左边或右边去取筷子。

第39页:哲学家进餐问题的解决思路

哲学家进餐问题的解决思路

  • 解决思路
  • 5位哲学家看作5个进程
  • 筷子是临界资源,在一段时间内只允许一位哲学家使用
  • 可以用一个信号量表示一只筷子
  • 所有信号量均被初始化为1

第40页:记录型信号量解哲学家进餐

记录型信号量解哲学家进餐

用记录型信号量解决哲学家进餐问题

第41页:哲学家进餐解法的分析

哲学家进餐解法的分析

  • 分析
  • 上述解法可保证不会有两个相邻的哲学家同时进餐

第42页:哲学家进餐解法的问题

哲学家进餐解法的问题

  • 问题
  • 有可能引起死锁
  • 可能出现永远等待

第43页:避免哲学家进餐死锁的办法

避免哲学家进餐死锁的办法

  • 有若干种办法可避免这类死锁
  • 至多允许四个哲学家同时吃
  • 奇数号先取左手边的筷子,偶数号先取右手边的筷子
  • 每个哲学家取到手边的两把筷子才吃,否则一把筷子也不取
  • 本质上就是AND同步问题
  • 用AND信号量机制可获得最简洁的解法

第44页:AND信号量解哲学家进餐

AND信号量解哲学家进餐

利用AND信号量机制解决哲学家进餐问题Var chopsiick array of semaphore:=(1,1,1,1,1);processirepeatthink;Swait(chopstick[(i+1)mod 5],chopstick[i]);eat;Ssignal(chopstick[(i+1)mod 5],chopstick[i]);until false

第45页:读者-写者问题

读者-写者问题

  • 有两组并发进程
  • 读者和写者
  • 共享一个文件F
  • 要求
  • 允许多个读者同时执行读操作
  • 只允许一个写者执行写操作
  • 不允许任意一个写者和其他读者或其他写者同时访问文件

第46页:读者-写者问题的解决思路

读者-写者问题的解决思路

  • 读者-写者问题:解决思路
  • 为解决Reader与Writer进程间互斥
  • 设置信号量Wmutex
  • 表示是否允许写的,初值为1

第47页:读者-写者问题的Readcount

读者-写者问题的Readcount

  • 读者-写者问题:解决思路
  • 设置一个整型变量Readcount表示正在读的进程数目
  • 初值为0
  • Readcount是一个可被多个Reader进程访问的临界资源
  • 为它设置一个互斥信号量rmutex
  • 初值为1

第48页:读者-写者问题解法(一)

读者-写者问题解法(一)

parbeginReader: beginrepeatwait(rmutex);if readcount=0 thenwait(wmutex);Readcount:=Readcount+1;signal(rmutex);perform read operation;wait(rmutex);readcount:=readcount-1;if readcount=0 thensignal(wmutex);//最后一个读者离开时通知写者signal(rmutex);untilfalse;endparendwriter: beginrepeatwait(wmutex);perform write operation;signal(wmutex);until false;End

第49页:读者-写者问题解法(二)

读者-写者问题解法(二)

parbeginReader: beginrepeatwait(rmutex);if readcount=0 thenwait(wmutex);Readcount:=Readcount+1;signal(rmutex);perform read operation;wait(rmutex);readcount:=readcount-1;if readcount=0 thensignal(wmutex);//最后一个读者离开时通知写者signal(rmutex);untilfalse;endparendwriter: beginrepeatwait(wmutex);perform write operation;signal(wmutex);until false;End

第50页:读者-写者问题解法(三)

读者-写者问题解法(三)

parbeginReader: beginrepeatwait(rmutex);if readcount=0 thenwait(wmutex);Readcount:=Readcount+1;signal(rmutex);perform read operation;wait(rmutex);readcount:=readcount-1;if readcount=0 thensignal(wmutex);//最后一个读者离开时通知写者signal(rmutex);untilfalse;endparendwriter: beginrepeatwait(wmutex);perform write operation;signal(wmutex);until false;End

第51页:苹果桔子问题

苹果桔子问题:桌上有一只盘子,每次只能放入一只水果;爸爸专向盘子中放苹果,妈妈专向盘子中放桔子;一个儿子专等吃盘子中的桔子,一个女儿专等吃盘子里的苹果。

第52页:苹果桔子问题的解决思路

苹果桔子问题的解决思路

  • 苹果桔子问题
  • 解决思路
  • 生产者消费者问题的变形,有两类生产者和两类消费者
  • 互斥
  • 盘子
  • 同步
  • 爸爸和女儿
  • 妈妈和儿子
  • 进程数目

第53页:苹果桔子问题的信号量设置

苹果桔子问题的信号量设置

分析 设置3个信号量 empty表示盘子能放的水果数目,初值为1 full_o表示盘子里有无桔子,初值为0

第54页:苹果桔子问题:爸爸与儿子进程

苹果桔子问题:爸爸与儿子进程

process fatherbeginL1:削一个苹果;P(empty);放苹果;V(full_a);goto L1;end;process motherbeginL2:剥一个桔子;P(empty);放桔子;V(full_o);goto L2;end;process daughterbeginL4:P(full_a);取苹果;V(empty);吃苹果;gotoL4;end;process sonbeginL3: P(full_o);取桔子;V(empty);吃桔子;gotoL3;end

第55页:苹果桔子问题的扩展

苹果桔子问题的扩展

问题 可以放n个水果? empty表示盘子能放的水果数目,初值为n full_o表示盘子里有无桔子,初值为0 full_a表示盘子里有无苹果,初值为0

第56页:苹果桔子问题的改进解法

苹果桔子问题的改进解法

process fatherbeginL1:削一个苹果;P(empty);P(mutex);放苹果;V(mutex);V(full_a);goto L1;end;process daughterbeginL4:P(full_a);P(mutex);取苹果;V(mutex);V(empty);吃苹果;gotoL4;end

第57页:苹果桔子问题:妈妈与女儿进程

苹果桔子问题:妈妈与女儿进程

process motherBeginL2:剥一个桔子;P(empty);P(mutex);放桔子;V(mutex);V(full_o);goto L2;end;process sonbeginL3:P(full_o);P(mutex);取桔子;V(mutex);V(empty);吃桔子;gotoL3;end

第58页:作业

作业:作业。

顶部目录