标签:
进程间通信需要解决三个问题:
第一个问题对线程而言比较容易,因为多个线程共享一个进程的地址空间(在多个地址空间通信的多个线程属于进程间通信的范畴)。其他两个问题对于线程而言同样适用。
概念1. 竞争条件
概念2. 临界区
要解决上述错误,关键是要阻止多个进程同时读写共享的数据。换言之,就是要实现互斥(mutual exclusion)。一个进程在一部分时间可能做一些内部运算或是其他不会引起竞争条件的部分,而某些时间则需要对共享内存或是共享文件进行访问,或执行另外一些导致竞争的操作。
概念3. 忙等待的互斥
如何利用临界区避免竞争条件?:①屏蔽中断,每个进程进入临界区后,屏蔽所有中断(进行进程切换的必要条件),再要离开之前打开中断。但这个一方面存在风险,因为将屏蔽中断的能力交给用户进程,有可能因为用户进程不再打开中断导致系统终止,另一方面在多处理器上不适用,因为屏蔽中断只对其所运行的CPU有效,这样仍有可能发生竞争条件。所以这个依赖于CPU的数量。②锁变量,某个进程检测到锁变量是0,就将其修改为1,进入到临界区,如果是1,就等待。这个会出现类似假脱机目录一样的问题。③严格轮转法,每个进程进入临界区的条件对应于轮转变量的一个特定值,例如轮转变量为1,A进程进入临界区,为2,B进程进入临界区。但是这有可能进程被临界区之外的进程阻塞的情况:轮转变量为1=>A进程进入临界区=>A出临界区,将轮转变量修改为2=>A进入非临界区,B进入临界区=>B出临界区,将轮转变量修改为1,A运行完非临界区代码,B开始运行非临界区代码=>A重新进入临界区,出临界区,修改轮转变量为2. 这个时候加入A进程很快运行完非临界区代码,而B进程还在运行非临界区代码(可能还需要更长时间),这时A就会被临界区之外的进程阻塞。
标签:
原文地址:http://www.cnblogs.com/hubavyn/p/4186842.html