OS03进程之间的并发控制和死锁
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信号量实现进程之间的同步
利用信号量和P、V操作实现进程同步。 对有协作关系的并发进程来说,他们在 使用共享资源时必须互通消息,仅当进 程收到指定的消息后才能使用共享资源, 否则需等待,直到指定的消息到达。
第24页
104102页
[ 例 ] 用信号量实现计算进程与打印进程之间的同 步过程。假定计算进程和打印进程共同使用只有 一个单缓冲的缓冲区。为此,引入两个同步信号 量s1和s2。 S1:表示缓冲区是否空,初值为1; S2:表示缓冲区中是否有可供打印的计算结果, 初始值为0。
第16页 104102页
P操作原语: //wait(s) ; down(s)
void P (sem &s) { s.value = s.value-1; //表示申请一个资源(或通 过信号量s接收消息) if (s.value < 0)
{ add this process to s.pointer;
第21页 104102页
信号量解决临界区的互斥使用
int mutex=1; P1: … P(mutex); critical section; V(mutex); … P2: … P(mutex); critical section; V(mutex); …
第22页 104102页
用信号量可以方便地解决 n 个进程互斥使用临界
第8页
104102页
进程Pi要求进入临界区的代码
dห้องสมุดไป่ตู้{
flag[i]=true; turn=j; while( flag[j] && turn==j ); 临界区; flag[i]=false; remainder section; }while(1); 为了进入临界区,进程Pi首先设置flag[i]为true,设 置turn为j,从而表示如果另一个想进入临界区,那么 它能进入。如果两个进程同时试图进入,那么turn会 几乎同时设置成i和j,但只有一个赋值语句的结果会 保持,最终turn值决定了谁能进入临界区。
第30页 104102页
Consumer:{ … P(full); //申请有数据的缓冲 P(mutex); //申请访问共享缓冲区 y = buffer [j]; //取一个产品 j = (j+1) % k; V(mutex); V(empty); //空缓冲的个数加1 … }
第31页 104102页
void main(){ int w=0; /*资源空闲*/ n=/*并发进程数 */ p(1);p(2);…;p(n);} 第13页
显然,采用 这种加锁语 句,由于进 程循环测试, 白白浪费了 CPU的时间。 这种现象又 叫做“忙 等”。
104102页
3.2.2
进程之间的同步
同步的原因:一组进程要合作完成一项任务。
第4页
104102页
为了正确而有效地使用临界资源,系统 中的并发进程需要遵循如下四个准则: 任何两个进程不能同时处于其临界区。 不应对CPU的速度和数量做任何假设。 临界区外运行的进程不得阻塞其他进程 进入。 不得使进程无限期等待在临界区之外。 (饿死)
互斥使用;公平竞争;有空让进;有限等待
桔子 爸 爸 初始状态:同步信号量 s1=1,表示盘子为空。 放苹果发同步信号s2, 放桔子发同步信号s3。 盘子 苹果 女儿等信号s2, 发信号s1
第33页 104102页
儿子等信号s3, 发信号s1
Daughter: { while(1) { Father: p(s2); { while(1) { 从盘中取出苹果; p(s1); v(s1); } } if(放入的是苹果) v(s2); else v(s3); Son: } { while(1) { } p(s3); 从盘中取出桔子; v(s1);
第10页 104102页
优点:简单。 缺点: 系统无法响应任何中断,限制了系统并 发执行的能力。 多处理机系统,禁止中断仅仅对执行本 指令的那个CPU有效。其他CPU仍将继续 运行,并可以访问共享资源,而进入临 界区。并不能保证互斥。
第11页
104102页
(2) 使用测试和设置指令
锁位变量W :为每个临界资源设置一个,以指 示 其 当 前 状 态 。 W=0 , 表 示 资 源 空 闲 可 用 ; W=1,表示资源已被占用。
资源的问题。信号量的取值范围是 +1 ~ -(n-1) 。
信号量值为负时,说明有一个进程正在临界区执
行,其它的正排在信号量等待队列中等待,等待 的进程数等于信号量值的绝对值。 [ 例 ] 若 P 、 V 操作的信号量初值为 1 ,当前值为 -3 , 则表示有 3个等待进程。
第23页
104102页
第9页 104102页
用硬件实现互斥的方法
(1) (2)
关中断 在进程刚进入临界区之前,禁止 所有中断;离开之后再打开中断。因为 CPU只有在发生时钟中断或其它中断时才 会进行进程切换。
关中断(disable Interrupt) 〈critical section〉 开中断(enable Interrupt)
block(); // 资源用完,调用阻塞原语。“让 权等待” } }
第17页 104102页
V操作原语:// signal(s); up(s) Void V (sem &s) { s.value = s.value+1;
//释放一个资源(或通过信号量s发消息)
if (s.value <= 0) {//表示在信号链表中,仍有
[例]两个用户进程共享缓冲区。计算进程将计算结 果送入共享缓冲区,打印进程从缓冲区取数据打 印。缓冲区空时不能取数据,满时不能送数据。
由于计算进程与打印进程访问缓冲区的速度不匹 配,需要进行同步。
为了使进程同步,需要引入信号量机制。
第14页
104102页
2.6.3 信号量和P,V操作
1965年,荷兰学者Dijkstra提出的一种同 步机制---信号量机制。 基本原理:两个或多个进程可以通过简单 的信号实现合作。一个进程可以被迫在某 一位置等待,直到它接收到一个特定的信 号。
第3页 104102页
2.6.1 进程之间的互斥
进程的互斥是由于共享资源而引起的
共享资源:①慢速的硬设备,如打印机等资源,
②软件资源,如共享变量、共享文件等。
临界资源:一次仅允许一个进程使用的资源。 临界区(critical section):就是并发执行的进程访
问临界资源的那段必须互斥执行的程序。
[ 例] 假定有一组生产者和消费者进程,通过一个 有界环形缓冲区(有 k个缓冲块)发生联系。 生产者将生产的产品放入缓冲区,消费者从 缓冲区取用产品。 当缓冲区满时,生产者要等消费者取走一个 产品后才能向缓冲区放下一个产品;当缓冲 区空时,消费者要等生产者放一个产品后才 能从缓冲区取下一个产品。
计算进程 Pc
buffer
第25页
打印进程 Pp
104102页
int s1=1,s2=0; Pc:{… 生产一个数据 P(s1); 将数据加入缓冲区 V(s2); …} Pp:{… P(s2); 从缓冲区取一个数据 V(s1); 消费数据 …}
第26页
能否用一 个同步信 号量?
104102页
信号量解决生产者和消费者问题
第5页 104102页
A进入临界区
A离开临界区
进程A
B试图进入 临界区 B进入 临界区 B离开 临界区
B阻塞
进程B
T1 T2 T3
第6页
T4 time
使用临界区的互斥
104102页
解决进程之间互斥的方法
软件实现方法 硬件实现方法
第7页
104102页
临界区互斥软件实现方法
算法:设有两个进程Pi和Pj,通过两 个共享两个变量,控制进入临界区: boolean flag[2]; int turn; 初值,flag[i]=flag[j]=false; turn=0;
[例] 进程P1和P2在运行中都要使用打印机, 打印机的使用必须独占。
第2页
104102页
(2) 系统中存在若干协作进程
同步关系:通常,一个用户作业涉及一组并发进程 (输入、计算和输出进程),这些进程须相互协 作。在运行过程中,这些进程可能要在某些同步 点上等待协作者发来信息后才能继续运行。这种 制约关系叫做直接制约关系。 Type a.c|sort 进程的同步与互斥关系,叫做进程通信,也叫低级 通信。 (Inter-Process Communication, IPC)
第15页
104102页
信号量表示资源的物理实体 typedef struct{ //信号量的类型描述 int value; //表示该类资源的可用数量 struct process *pointer; //等待使用该
类资源的进程排成队列的头指针。
}semaphore, sem;
对信号量S只允许执行P、V操作。 P、V操作由原语组成,执行过程中不可分割。
第28页 104102页
生产者1 生产指针 i
消费指针 j
消费者1
生产者2
…
消费者2
… buffer [k]
生产者M
消费者N
empty:表示空缓冲区的容量,初值为k full:有数据的缓冲个数,初值为0 mutex:互斥访问缓冲区的信号量,初值为1
第29页 104102页
int mutex=1, empty=k, full=0, i=0, j=0; DataType x,y,buffer [k]; Producer:{ … produce a product x; P(empty); //申请空缓冲 P(mutex); //申请访问共享缓冲区 buffer [i] = x; //放入一个产品 i = (i+1) % k; V(mutex); V(full); // 有数据的缓冲个数加1 … }
等待使用该资源的进程被阻塞。
remove a process P from s. pointer; wakeup(P);//调用唤醒原语。 }
}
第18页 104102页
显然, P 、 V 操作的引入,克服了加锁操 作的忙等待现象,提高了系统的效率。
操作系统正是利用信号量的状态来对进 程和资源进行管理和控制的。
第19页
104102页
根据用途不同,可以把信号量分为公用 信号量和私用信号量。 公用信号量(互斥信号量)用于解决进 程之间互斥进入临界区。 私用信号量(同步信号量)用于解决异 步环境下进程之间的同步。
第20页
104102页
利用信号量实现进程之间的互斥
设置一个互斥信号量 mutex ,初值为 1 ,表 示该临界资源空闲。 调用P(mutex)申请临界资源。 调用V(mutex)释放临界资源。 只需把临界区代码置于P(mutex)和 V(mutex) 之间,就可实现临界资源的互斥使用了。
[注意P操作的次序]
在确信有可用资源后再申请对整个缓冲区 的互斥操作。若先申请对整个缓冲区的互 斥操作,后申请自己对应的缓冲区资源, 就可能死锁。 出现死锁的条件:申请到对整个缓冲区的 访问操作后,才发现自己对应的缓冲区资 源已经用完。
第32页 104102页
[例 ] 桌上有一空盘,一次只允许放一只水果。爸爸不 断向盘中放苹果或桔子,儿子专吃盘中的桔子, 女儿专吃盘中的苹果。请用 P 、 V 操作实现爸爸、 儿子、女儿三个并发进程的同步。
生产者和消费者是相互合作进程关系的一种抽象 生产者:当进程释放一个资源时,可把它看成是 该资源的生产者, 消费者:当进程申请使用一个资源时,可把它看 成该资源的消费者。
[例] 上述例子中 计算进程:打印数据的生产者;空缓冲的消费者 打印进程:打印数据的消费者;空缓冲的生产者
第27页 104102页
testandset指令可定义如下:
Testandset(){ K: if(w==1) goto k; else w=1; }//一条机器指令,其执行不可被中断。
第12页 104102页
void p(int i){ while(1){ testandset(); <critical section> w=0; <remainder section> } }
第3章
1. 2. 3.
进程之间的并发控制和死锁
进程的低级通信:互斥、同步、P/V操 作、管程 进程的高级通信:消息传递 死锁:多进程竞争有限资源
第1页
104102页
(1) 各并发进程对资源的共享
互斥关系:通过共享资源而使进程之间产 生的关系叫做间接制约关系,又叫做互斥 关系。可用“进程-资源-进程”来描述。