OS03 进程之间的并发控制与 死锁.ppt

  1. 1、本文档共76页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
104 第3章 进程之间的并发控制和死锁 进程的低级通信:互斥、同步、P/V操作、管程 进程的高级通信:消息传递 死锁:多进程竞争有限资源 (1) 各并发进程对资源的共享 互斥关系:通过共享资源而使进程之间产生的关系叫做间接制约关系,又叫做互斥关系。可用“进程-资源-进程”来描述。 [例] 进程P1和P2在运行中都要使用打印机,打印机的使用必须独占。 (2) 系统中存在若干协作进程 同步关系:通常,一个用户作业涉及一组并发进程(输入、计算和输出进程),这些进程须相互协作。在运行过程中,这些进程可能要在某些同步点上等待协作者发来信息后才能继续运行。这种制约关系叫做直接制约关系。 Type a.c|sort 进程的同步与互斥关系,叫做进程通信,也叫低级通信。 (Inter-Process Communication, IPC) 2.6.1 进程之间的互斥 共享资源:①慢速的硬设备,如打印机等资源,②软件资源,如共享变量、共享文件等。 临界资源:一次仅允许一个进程使用的资源。 临界区(critical section):就是并发执行的进程访问临界资源的那段必须互斥执行的程序。 任何两个进程不能同时处于其临界区。 不应对CPU的速度和数量做任何假设。 临界区外运行的进程不得阻塞其他进程进入。 不得使进程无限期等待在临界区之外。(饿死) 解决进程之间互斥的方法 软件实现方法 硬件实现方法 临界区互斥软件实现方法 算法:设有两个进程Pi和Pj,通过两个共享两个变量,控制进入临界区: boolean flag[2]; int turn; 初值,flag[i]=flag[j]=false; turn=0; 用硬件实现互斥的方法 关中断 在进程刚进入临界区之前,禁止所有中断;离开之后再打开中断。因为CPU只有在发生时钟中断或其它中断时才会进行进程切换。 优点:简单。 缺点: 系统无法响应任何中断,限制了系统并发执行的能力。 多处理机系统,禁止中断仅仅对执行本指令的那个CPU有效。其他CPU仍将继续运行,并可以访问共享资源,而进入临界区。并不能保证互斥。 (2) 使用测试和设置指令 锁位变量W :为每个临界资源设置一个,以指示其当前状态。W=0,表示资源空闲可用;W=1,表示资源已被占用。 testandset指令可定义如下: void p(int i){ while(1){ testandset(); <critical section> w=0; <remainder section> } } 3.2.2 进程之间的同步 同步的原因:一组进程要合作完成一项任务。 [例]两个用户进程共享缓冲区。计算进程将计算结果送入共享缓冲区,打印进程从缓冲区取数据打印。缓冲区空时不能取数据,满时不能送数据。 由于计算进程与打印进程访问缓冲区的速度不匹配,需要进行同步。 为了使进程同步,需要引入信号量机制。 2.6.3 信号量和P,V操作 1965年,荷兰学者Dijkstra提出的一种同步机制---信号量机制。 基本原理:两个或多个进程可以通过简单的信号实现合作。一个进程可以被迫在某一位置等待,直到它接收到一个特定的信号。 typedef struct{ //信号量的类型描述 int value; //表示该类资源的可用数量 struct process *pointer; //等待使用该类资源的进程排成队列的头指针。 }semaphore, sem; 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; block(); //资源用完,调用阻塞原语。“让权等待” } } V操作原语:// signal(s); up(s) Void V (sem &s) { s.value = s.value+1; //释放一个资源(或通过信号量s发消息) if (s.value <= 0) {//表示在信号链表中,仍有等待使用该资源的进程被阻塞。 remove a process P from s. pointer; wakeup(P);//调用唤醒原语。 } } 显然,P、V操作的引入,克服了加锁操作的忙等待现象,提高了系统的效率。 操

文档评论(0)

189****6140 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档