操作系统设计与实现 第二章 进程(二)

2.2 进程间通信

进程间通信有三方面内容:

第一方面内容:一个进程如何向另一个进程传送信息;
第二方面内容:必须保证两个或多个进程在设计临界活动时不会彼此影响;
第三方面内容:当存在依赖关系时确定适当的次序。

以上三个内容,后两个对于线程也适用。第一个传递信息的问题在线程中很容易解决,因为他们拥有相同的地址空间。后两个关于互不妨碍和排序恰当的问题对于线程同样适用。

2.2.1 竞争条件

类似某种情况,即两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,就成为竞争条件。

2.2.2 临界区

前述问题的症结就在于,在进程A对共享变量的使用未结束之前进程B就是用它。所以,该问题的关键就是,要找出某种途径防止多个进程同时访问共享数据。换言之,这里需要讨论的就是互斥,即以某种手段确保当一个进程在使用一个共享变量或文件时,其他进程不能做同样的操作。

对共享内存进行访问的程序片段称为临界区。如果能够进行适当的安排,使得两个进程不可能同时处于临界区,就能够避免竞争条件。

对于一个好的方案,有以下四个条件:

1. 任何两个进程不能同时处于临界区。
2. 不应对CPU的速度和数目做任何假设。
3. 临界区外的进程不得阻塞其他进程。
4. 不得使进程在临界区外无休止地等待。

这里写图片描述

2.2.3 忙等待形式的互斥

几种解决互斥的方案:

关闭中断:在每个进程进入临界区后先关闭中断,在离开之前在开启中断。中断被关闭后,时钟中断也被屏蔽。

但这种方案不好,因为把关中断的权利交给用户进程是非常不明智的。而且,若有两个或多个共享内存的处理器,则关闭中断指令仅对执行本指令的CPU有效,其他CPU继续运行,并可以访问共享内存。

所以,关中断对操作系统本身是一种很有用的技术,但是对于用户进程则并不是一种合适的通用互斥机制。

锁变量:当一个进程想要进入其临界区时,首先测试这把锁,如果锁的值为0,则进程将其设置为1并进入临界区。若锁的值已经为1,则指等待到其值变为0。于是,0表示临界区内没有进程,1表示临界区内已经进入了某个进程。

遗憾的是,这种想法同样有纰漏。结社一个进程读锁变量的至并发现它为0,而恰好在它将它置为1之前,电镀运行了另一个进程将其锁变量置为了1。这样两个进程就同时处于临界区内。

严格交替法:轮流进入临界区在一个进程比另一个慢很多的情况下并不是一个好办法。
这里写图片描述
Peterson解决方案:如果考虑两个进程几乎同时调用enter_region的情况。它们都将自己的进程号存入turn。但只有后一个被保存进去的进程号才有效,前一个是无效的。
这里写图片描述
TSL指令:特别是那些为多处理机设计的计算机,都有一条指令:

TSL RX, LOCK

其工作原理如下所述:它将一个存储器读到寄存器中,然后在该内存地址上存一个非零值。读数和写数操作保证是不可分割的,即该指令结束之前其它处理机均不允许访问该存储器。执行TSL指令的CPU将锁住内存总线以禁止其他CPU在本指令结束之前访问内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值