操作系统笔记——2.进程间通信

1.1竞争条件

对于共享变量,什么情况下会出现竞争呢,举个例子:假设进程C是一个打印机,周期性打印目录里面的文件名所对应的文件,10s打印一次,这时候,一个目录(数组)1-3是空的,进程A读取这个目录,发现1是空的,将1保存到一个局部变量里面,但是这时候,一个时钟中断,操作系统认为A运行过长,换B吧,B也需要打印东西,B正常操作,查看目录,1是空的,往1写入文件名,结束,A接下来上CPU,继续执行程序,将局部变量的值获取到目录位置(1),直接将1的信息擦除,写入A想要打印的文件名,那么B的文件将不会被打印到了,这就是竞争。

1.2临界区

需要做到互斥,对共享内存访问的程序片断被称之为临界区,避免多个进程同时处于临界区,就可以避免竞争条件,但是为了进程并发正确和高效地进行操作,一个方案需要满足四个条件:

1、任何进程不同时处于临界区

2、不应对CPU数目和速度做任何假设

3、临界区以外的进程不得堵塞其他进程

4、进程不得在临界区以外无休止等待

1.3忙等待的互斥

tips:CPU发生时钟或者其他中断的时候才会进行进程切换

一些比较容易想到的解决办法和优缺点:

1、关中断,我要访问共享内存,我关中断,CPU我独占,我忙完了开中断,其他人再使用CPU,如果有多个CPU,其他进程就可以在其他CPU访问临界值

2、锁变量,锁作为一个共享值,但是引入一个问题,锁也是临界值,和打印机问题一样

3、严格轮换法,不断while检测是否是自己的turn,如果是就执行,执行完了马上换turn给其他人用,不然忙等待,带来的坏处是如果我马上访问完了,我释放了turn,但是我无视可做,我想要再次访问临界区,这时候另一个还在做其他操作,没有能马上进入临界区访问完释放权限,我就一直等,耗时很长

4、peterson算法

顶一个一个全局的turn,不在乎谁最后一次修改他,这个turn作为一个临界区不重要,进程想访问,定义turn为自己,接下来的while中判断turn是否是自己,和其他人是否想访问临界区,如果都满足,就等其他人访问完,不然就等,这个算法的巧妙之处在于turn作为一把“锁”,不在乎最后的turn是谁,不巧被另一个进程修改了,那么我不介意,我等一会

5、TSL指令,硬件的办法,全名test and set lock,其实就是为了保证读和写不可分割,会忙等待,进程有欺诈行为,那么互斥失败

1.4睡眠和唤醒

生产者消费者问题,双方都需要获取到一个共享变量count,消费者获取到count == 0 的时候,就会sleep,而当这个sleep执行之前,生产者进程上CPU,也获取到count,然后生产count + 1,这是认为从0到1,消费者应该在睡眠,所以唤醒,但是此时消费者并没有,所以唤醒信号丢失,换到消费者进程上CPU,继续sleep,所以一直sleep,最后生产者生产满了也会sleep。

唤醒等待位,进行补充修补,唤醒就为1,消费者得到这个信息,就不要休息,但是还是没有能从根本解决问题

1.5信号量

相当于读写操作变成一个原子操作,将这个操作交给和内核完成,内核做这个事情是通过自己将中断关闭进行的一个原子中断,如果是多个CPU,内核会使用TSL保证只有一个CPU能访问到,

1.6管程

信号量容易出错,何不将一个过程变成一个单独的进程,在一个空间里面,这个空间里面只允许一个进程运行,这样就可以实现互斥的效果

1.7消息传递

使用操作系统原语进行操作,没有消息可用,receive会一直堵塞,

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值