操作系统初探-同步中的互斥问题

同步中的互斥

标签(空格分隔): 操作系统


系统运行过程中总会存在这样的问题:两个不同的进程可能需要“同时”访问同一资源区域。这叫同步中的互斥问题。(比如火车卖票系统卖出一张票就需要修改票的数目,然而同一时刻可能有多个人同时买了一张票)

这里为什么“同时”加引号呢,因为微观上来看,它再怎么同时,从发出请求到系统响应之间还是会有一个先来后到的顺序的,假设同时发出了A,B,C三个进程,但是,在执行x-=1这个语句也是需要时间的,看一下这个语句x-=1这个语句按执行顺序来看是先调取x的值减1,再把值赋给x,因为A,B,C进程间切换的时间很短暂,所以可能导致了A的x-1完毕后还没来得及赋值给系统中的那个总的X变量,B和C的x-1就已经完毕了,这就导致了最后系统中的X变量只被减了一次,也就是说A,B,C买了三张票,结果是系统只减少了一张票,这样会出大问题的。

上述可知,在A执行x-1这个操作时,B,C也都可以执行x-1操作,所以这三个进程共用的是之前那个时刻的共同数值的x,就是由于这个原因导致了最后的把A,B,C的x-1的数值返回给系统的X时返回的都是一个数值。


那么解决这个问题的关键就是要求系统变量X在某一进程进行完x=x-1操作后才能被继续访问调用。但进程如何判断它前面的那个进程到底有没有进行完呢?

想象一列排队进外婆家吃饭的人,每个人就是一个x-=1语句,后来的语句必须在前一个语句的后面执行。你去外婆家吃饭,你又没上楼,你怎么知道楼上有没有人在吃饭,有几个人在吃,所以每个进程并不知道自己的前面有没有语句执行完,所以这个时候外婆家就提供一个显示屏,显示你前面还有几桌客人排在你前面等待。你看见了那些数字,就知道“噢,我前面还有人在吃饭,那我没办法上去吃饭,如果我这个时候上去吃饭,就会和他们争抢同一桌的饭,就会打起来的”。

抽象起来,这和系统解决这种同步中的互斥问题的思路一致,即设置了一块“显示屏”,系统管这个叫“Semaphore”(信号量),进程从四面八方涌进来,哪个进程“上楼”了,“显示屏”就会随之发生变化,“楼上的桌子坐满了”,后来的进程一看“显示屏”就知道“噢,桌子坐满了,我得等了”。


所以信号量只是一个判别能否进入资源区使用的标准,但有两点必须保证:

  • 对信号量进行加减操作的时候,加减语句不能被干扰打断,操作系统的原语用来保证这一点。我们称这加减语句为PV操作。(荷兰文,译为P通过,V释放)
  • PV操作必须成对出现,不能客人在楼上吃完下来了,你的显示屏还没有变化。

咱们梳理一下同步中的互斥问题的思路:

  • 最初是为了解决多个语句同时访问同一个系统变量的问题。
  • 又变成了如何让进程知道自己前面是否有进程调用系统变量完毕的问 题,咱们利用信号量直接给需要访问调用的进程排了个队。
  • 最后要保证信号量的PV操作时,操作不能被打断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值