一 并发进程之间的关系
1 独立关系
并发的进程之间假如没有数据交换的话,那么这并发的进程就是相互独立的,谁也不影响谁。
比如:我们的QQ进程和微信进程,就是典型的独立关系,QQ发的消息,微信并不会收到!
2 交互关系
并发进程之间假如有数据交换,或者共享数据的话,那么就是属于交互关系!
比如:我们常见的银行服务器,有一个接受数据的进程,一个处理数据的进程;
处理数据的进程需要等待接收数据的进程接收到数据且交互给处理数据的进程时候,处理数据的进程才可以工作!处理数据的进程也需要把数据处理之后,才可以给接受数据的进程,接受数据的进程才可以工作!
这是一种典型的协作关系的交互进程
并发进程的交互关系分又两种关系:一种是竞争关系,比如竞争同一资源时候,一种是协作关系,比如交换数据时候!
二 并发进程的竞争关系理解
比如上图有红车和蓝车,它们两需要通过同一条窄路,这条窄路只能允许一辆车通过;
假如两辆车同时进入窄路时候,就会发生碰撞;我们不希望碰撞,所以我们需要设置一种方式解决这个问题。
我们假设红车先过窄路通过窄路,那么红车就占有该窄路的使用权,于此同时红车通过窄路路口时候,就设置一个红旗的标志,这个红旗的标志表示红车正在行驶这个窄路,蓝车看到红旗时候,需要等待,不能通过在撸,等待到红车经过窄路后,把红旗拿走,那么蓝车就可以行驶窄路了!
通过设置红旗标志的方式,就可以防止红蓝车因为竞争同一个窄路而发生危险的问题。
我们把通过交叉路口这个地方称为临界区;
把这个红旗称为竞争条件;
三 异步进程引发的错误
异步的意思可以等价为随机的意思;
并发的进程假如不加以控制的话,那么这并发的进程就是异步的并发执行,意思就是并发的进程,想什么时候执行就什么时候执行,不过这也是看cpu什么时候调度它们,也就是说cpu调度它们时间会很随机。
举个例子:异步并发进程引发的错误!
如上图:两个进程终端:T1 和 T2, 有个共享资源 x = 2;
T1 和 T2的进程是并发执行,那么就会走走停停,并且它们异步执行,也就是说随机执行!
假设T1先执行,此时 T = 2; 但是由于并发异步,跑到了T2执行,T = 2;
又并发跳到了T1,执行if,判断为true;又并发跳到 T2,执行if,判断为true;
又并发跳到T1,执行x = T-1,此时x = 1,表示卖出一张票; 又并发跳到T2,执行x = T-1,此时x = 1,表示也卖出一张票;
很明显上面的两个进程:T1 和 T2 都卖出了一张票,此时的共享的资源 x = 2被卖出两张票后;应该等于 0才对,但是上面的结果导致 x = 1;
此时就会发生错误。
异步的进程就会引发竞争条件:由于同时操作一个数据导致结果依赖进程的执行顺序!
所以我们必须控制执行顺序,进而引出了一个词汇:同步,同步就是来控制异步进程的执行顺序的问题!
四 同步的概念
中文大概翻译:
进程同步就是一种机制:该机制是用来维护数据的一致性,这些被维护的数据是共享于交互的进程。
很明显:在交互之间的进程之间,需要同步的机制来维护共享于交互进程之间的数据。
五 总结
对于并发的进程:分为独立关系和交互关系;
独立关系的并发进程:异步执行没关系,因为他们没有共享数据,所以不需要同步机制;
交互关系又有竞争和协作:无论是竞争关系还是协作关系的进程,都是需要同步机制来保证它们访问共享数据时候,保持一致性;
在我们操作系统中,提供两种同步机制的方式,来解决交互的进程访问共享数据一致性的问题!!!
一种是互斥锁:通常用来解决竞争的问题;
另一种是信号量,信号量是一种比互斥锁更加强大功能的一种同步机制,通常来解决协作的问题;