进程间的通信IPC
进程间的通信
abandonment进程间的通信(Inter Process Communication, IPC)问题主要有3个:
(1) 一个进程如何把信息传递给另一个进程;
(2) 确保两个或更多进程在关键活动中不会出现交叉;
(3) 有协作关系的进程的时序问题。
两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件(race condition)。我们把对共享内存进行访问的程序片段称作临界区域(critical region)或临界区(critical ction),如果我们能够保证两个进程不可能同时处于临界区中,就能避免竞争条件。为了避免竞争条件,以某种手段确保当前一个进程在使用一个共享变量或文件时,其他进程不能做同样的操作,称为互斥(mutual exclusion)。
tbc什么意思
一个好的互斥方案需要满足下面4个条件:
(1) 任何两个进程不能同时处于其临界区;
choices(2) 临界区外运行的进程不得阻塞其他进程;
(3) 不得使进程无限期等待进入临界区;
(4) 不应对CPU的速度和数量做任何假设。
下面将讨论几种实现互斥的方案。
1、忙等等(busy waiting)
1.1 屏蔽中断
在单处理器系统中,最简单的办法是使每个进程在刚刚进入临界区域后立即屏蔽所有中断,并在就要离开之前打开中断。在屏蔽中断之后,CPU将不会切换到其他进程。
但这个方案并不好,把屏蔽中断的权利交给用户进程会引发风险,如果进程中断屏蔽后不再打开,将使得整个系统终止。此外,在多CPU系统中,屏蔽中断仅仅对执行disable指令的那个CPU有效,其他CPU仍将继续运行,并可以访问共享内存。
1.2 锁变量
设想有一个共享锁变量,其初始值为0。0表示临界区没有进程,1表示已经有某个进程进入临界区。
当一个进程要进入临界区时,先测试这把锁,如果该锁的值为0,则该进程将其设置为1并进入临界区,若这把锁的值为1,则该进程将等待直到其值变为0。
锁变量的缺陷:如果一个进程读出锁变量的值为0,但在将它设置为1之前,另一个进程被调度运行,将该锁变量设置为1。当第一个进程再次能运行时,它同样也将该锁设置为1,则此时有两个进程进入临界区中。
1.3 严格轮转法
[cpp] view plaincopy
1.//进程0
2.while(True){
3.while(turn != 0); //等待turn等于0
4.critical_region();
5.turn = 1; //离开临界区
6.noncritical_region();
7.ons什么意思}
8.//进程1
9.while(True){
10.while(turn != 1); //等待turn等于1
11.critical_region();
12.turn = 0; //离开临界区
13.背英语noncritical_region();
14.}
严格轮转法采用忙等待,即连续测试一个变量直到某个值出现为止,用于忙等待的锁称为自旋锁(spin lock),这种方式比较浪费CPU时间,通常应该避免。
代码说明:进程0离开临界区,将turn设置为1,以便允许进程1进入其临界区。假设进程1很快便离开临界区,则此时两个进程都处于临界区之外,turn的值又被设置为0。如果此时进程1突然结束了非临界区并且返回循环的开始,但是,这时它不能进入临界区,因为turn的值为0,而此时进程0还在忙于非临界区的操作,进程1只有继续while循环,直到进程0把turn的值改为1。这实际上违反了前面叙述的互斥条件(2),即临界区外运行的进程不得阻塞其他进程。
1.4 Peterson解法
[cpp] view plaincopy
1.#define N 2 //进程数量
2.int turn; //锁变量
3.int interested[N];
4.
5.void enter_region(int process){
6.int other;
2012年大学英语四级成绩查询7.other = 1 - process; //其他进程
8.interested[process] = True;
9.turn = process;
10.while(turn==process && interested[other]==True); //等待other离开临界区
11.}
12.
13.void leave_region(int process){
14.interested[process] = Fal;
soo
15.}
代码说明:一开始,没有任何进程处于临界区,现在进程0调用enter_region,它通过设置数组元素和将turn置为0来表示它希望进入临界区。由于进程1并不处于临界区,enter_region很快便返回。如果此时进程1调用enter_region,进程1将在此处挂起直到interested[0]变成Fal,该事件只有在进程0调用leave_region退出临界区时才会发生。
1.5 TSL指令/XCHG指令
在某些计算机上,有下面这样的指令:
TSL RX, LOCK
TSL(Test and Set Lock)指令将一个内存字lock读入寄存器RX中,然后将该内存地址上存一个非零值。读字和写字操作保证是不可分割的,即该指令结束之前其他处理器均不允许访问该内存字。执行TSL指令的CPU将锁住内存总线,以禁止其他CPU在本指令结束之前访问内存。
[plain] view plaincopy
1.//用TSL指令进入和离开临界区
2.enter_region:
3.TSL REGISTER, LOCK ;复制锁变量到寄存器,并将锁设为1
4.CMP REGISTER, #0
5.化学工程与工艺专业英语翻译JNE enter_region ;若锁不等于0,继续循环等待
pasio6.RET
7.
8.leave_region:
9.MOVE LOCK, #0
童话故事10.RET
从代码可以看出,进程在进入临界区之前先调用enter_region,这将导致忙等待,直到锁空闲为止,随和它获得该锁并返回。在进程从临界区返回时它调用leave_region,这将把锁设置为0。