进程同步偏向于相互合作,协调先后关系。如: 接力比赛
进程互斥通常是进程之间争夺资源。如:抢CPU
举个形象的例子:
运动会上,我们有篮球比赛和接力比赛。在篮球比赛上,每个球员都努力去争抢篮球,这里我们可以把篮球想象成临界资源,每个球员相当于一个进程。一个球员抢到篮球之后,其他球员就不能再拿球了,除非该球员将篮球释放掉。
而在接力比赛中,老师都会给每个同学分配一个任务。你跑第二棒,他跑第三棒…那么这时,各个同学的跑步顺序就是被指定好的,最后会按照这个协调好的顺序执行下去,而不会出现,枪响之后全部跑出去的情况!
饥饿:拿不到自己所需的资源,其他进程抢走后可能在运行。
死锁:各自拿着对方要的资源,并且等待对方释放自己所需的其他资源
进程同步和互斥概念区别:
1、图书馆大家借同一本书。互斥
2、篮球比赛大家抢球。互斥
3、流水线生产。同步
4、商品的生产和消费。同步
生活中的进程互斥:
在购买电影票的时候,假如某一时刻,小明和小红同时点进了购买系统,发现剩余座位数x = 1。他们都很高兴,然后购买了这个位置的票。x = x - 1。等到他们来到电影院的时候,小红便与小明发生了争执,都认为这个位置是自己的。那么到底是发生了什么问题呢?
这就是因为没有很好的控制进程互斥的原因。
选定某一个位置的操作是互斥的,即我们选到了某一个位置后,其他人是不能再选这个位置了,除非我将这个位置的票退掉!
因此在电影定票系统中,我们选好座位支付的时候,它会限定时间,如果你在这个时间内没有完成支付操作,那么这个位置就将对其他用户开放。
那么怎么锁门?可以用互斥锁,现在更多用信号量!
ps.临界资源:一次仅允许一个进程使用的资源。
其中:生产者消费者问题便是一个经典的进程同步和进程互斥问题。
在生产者消费者问题中,我们不仅需要解决对临界资源访问的互斥,还要解决生产者进程和消费者进程的同步。
原因很简单,如果没有互斥,那么就出现了电影定票系统的问题,假设多个生产者同时往一个位置放东西,那么货物数量x,实际的操作只有x = x + 1。但实际上,生产了多件物品。
如果没有同步,消费者在还没有生产出物品的时候就开始消费,这显然是不合理的!
我们将利用信号量解决这个问题。