进程间同步和互斥:临界资源
各进程采取互斥的方式,实现共享的资源称作临界资源。
属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。 诸进程间应采取互斥方式,实现对这种资源的共享。
每个进程中访问临界资源的那段代码称为临界区。显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。为此,每个进程在进入临界区之前,应先对欲访问的临界资源进行检查,看它是否正被访问。如果此刻该临界资源未被访问,进程便可进入临界区对该资源进行访问,并设置它正被访问的标志;如果此刻该临界资源正被某进程访问,则本进程不能进入临界区。
在操作系统中,有临界区的概念。临界区内放的一般是被1个以上的进程或线程(以下只说进程)共用的数据。
临界区内的数据一次只能同时被一个进程使用,当一个进程使用临界区内的数据时,其他需要使用临界区数据的进程进入等待状态。
操作系统需要合理的分配临界区以达到多进程的同步和互斥关系,如果协调不好,就容易使系统处于不安全状态,甚至出现死锁现象。
例如,打印机不可能同时打印多个进程的结果,若将一个进程的结果打印几行,再打印另一个进程的结果,这会使打印的结果变得无法使用。所以两个或两个以上进程由于不能同时使用同一临界资源,只能一个进程使用完了,另一进程才能使用。
除了物理设备外,还有很多软资源如变量、表格、队列等也都属于临界资源,如果同时使用,同样会引起与时间相关的错误。例如,有两个进程P1和P2共享一个变量count,P1或P2的功能是,每执行完某些操作后,将count的值取出加1,R1和R2是工作寄存器。当两个进程按下述顺序执行时:
P1:操作序列;
Rl=count;
R1=R1+1;
count=R1;
P2:操作序列;
R2=count;
R2=R2+1;
count=R2;
其结果使count的值增加了2;倘若P1和P2按另一种顺序执行,例如:
P1:R1=count;
P2:R2=count;
P1:Rl=Rl+1;count=Rl;
P2:R2=R2+1;count=R2;
按此执行序列,虽使P1和P2都各自对count做了加1操作,但最后的count值却只增加了1,即出现了结果不确定的错误。显然这种错误与执行顺序有关,又叫与时间相关的错误。之所以出现这种错误,是由于变量count是临界资源,P1和P2不能同时使用,即仅当进程P1对count进行修改并退出后,才允许进程P2访问和修改,那么就可以避免上述的错误结果。