2021-12-27

进程与线程

进程间通信

竞争

在这里插入图片描述

当程序中有大家都能读取的共享变量或文件,就会产生竞争情况,考虑一个假脱机打印程序,该程序有一个脱机打印目录,里面是需要被打印的文件名,in指向最后一个空位,out指向下一个应该被打印的文件。如果进程A想打印文件,它读到in的位置是7,然后发生了中断,转到进程B执行,B也读到in为7,于是B把要打印的文件放入7,然后使in+1,这时B也中断,回到进程A,A将自己的文件也放入7,覆盖了B的文件,然后让in=8。这种竞争情况下,会使B永远无法打印文件。

解决这个问题的方法是设置临界区,临界区内有且只能有一个进程运行,其他进程想进入临界区需要等待临界区内现有的进程运行完毕才行

屏蔽中断

最简单的实现临界区的方法就是当一个进程进入临界区后,屏蔽所有中断,直到进程快运行完再打开中断,但是将中断权利交给用户是不明智的,如果进程忘记打开中断,会导致其他进程永远无法运行

锁变量

锁变量是指示临界区内是否有进程的变量,例如有就为1,无就为0,使用这种方法可能会出现与假打印程序一样的问题,进程A读到锁变量为0,然后中断了,进程B也读到是0,进入临界区,再次转到A运行时A也进入临界区,临界区内就有两个进程了

自旋锁

在这里插入图片描述

设定一个turn变量,当他为0时进程0可进入临界区,为1时进程1可进入临界区,也就是说自旋锁就是两个进程严格轮流进入临界区。
假设一开始turn为0,这时进程1想进入临界区,发现turn为0,进程1就只能在等待期间不断扫描turn,直到turn变成1,进程0想进入临界区,发现turn为0,则可直接进入,在进程0离开临界区时,将turn置为1。

这个方法的弊端就是,两个进程严格轮流进入临界区,如果一个进程比另一个进程慢很多,则速度快的进程运行效率会被拖慢

互斥锁

互斥锁一次只能被一个线程获得,在他被置1时,其他程序想获取锁只能等待

读写锁

读写锁的特点是,锁是一个共享资源,所有线程都可以随时对锁进行读模式的加锁,而只有一个线程能对锁进行写操作,在锁被置为1的时候,想对锁进行写操作的线程都将进入忙等待,直到锁被置为0为止

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值