系统中同时存在着许多进程,它们共享各种资源。然而有许多资源在某一时刻只能允许一个进程使用,如打印机、磁带机等硬件设备,以及软件中的变量、队列等数据结构。如果多个进程同时使用这类资源就会造成混乱,因此必须保护这些资源,避免两个或多个进程同时访问这些资源。把一段时间内只允许一个进程使用的资源称为临界资源。
几个进程若共享同一个临界资源,则它们必须以相互排斥的方式来使用这个临界资源,即当一个进程正在使用某个临界资源且尚未使用完毕时,其他进程必须延迟对该资源的使用;当使用该资源的进程将其释放后,其他进程才可使用该资源。也就是说,任何其他进程不得强行插进去使用这个临界资源,否则将会造成信息混乱或操作出错。
所以对临界资源的访问必须互斥进行,即各进程对同一临界资源进行操作的程序段(代码段)也应互斥执行,只有这样才能保证对临界资源的互斥访问。把进程中访问临界资源的代码段称为临界区(Critical Section)。
以进程P1和进程P2共享一个公用变量(共享变量)S为例,假设进程P1需要对变量S进行加1操作,而进程P2需要对变量S进行减1操作。
由于对临界资源的使用必须互斥进行,所以进程在进入临界区时首先要判断是否有其他进程在使用此临界资源,如果有,则该进程必须等待;如果没有,则该进程才能进入临界区执行临界区代码,同时还要关闭临界区以防止其他进程进入。当进程使用完临界资源时,要开放临界区以便其他进程进入。因此使用临界资源的代码结构为
有了临界资源和临界区的概念,进程之间的互斥可以描述为禁止两个或两个以上的进程同时进入访问同一临界资源的临界区。此时,临界区就像一次仅允许一条船进入的船闸,而进程就像航行的船只。要进入船闸必须先开启闸门(进程在进入临界区前必须先经过进入区来占有临界区的使用权),一旦有船只进入船闸就关闭闸门防止其他船只进入(进程进入临界区后阻止其他进程进入临界区)。当船离开船闸时则再次开启闸门,以便其他船只进入船闸(进程离开临界区时要经过退出区,通过退出区来释放临界区的使用权,以便其他进程进入临界区)。(www.xing528.com)
为了实现进程互斥地进入自己的临界区可以采用软件方法,但更多的是在系统中设置专门的同步机构来协调各进程间的运行。无论采用何种同步机制,都应该遵循以下4条准则。
(1)空闲让进。无进程处于临界区时意味着临界资源处于空闲状态,这时若有进程要求进入临界区应立即允许进入。
(2)忙则等待。当已有进程进入其临界区时则意味着某临界资源正在使用,所有其他欲访问该临界资源的进程,试图进入各自临界区时必须等待,以保证各进程互斥地进入访问同一个临界资源的临界区。
(3)有限等待。若干进程要求进入访问同一个临界资源的临界区时,应在有限时间内使一个进程进入临界区,即不应出现各进程相互等待而都无法进入临界区的情况。
(4)让权等待。当进程不能进入其临界区时,应立即释放所占有的CPU,以免陷入“忙等”(进程在占有CPU的同时又一直等待),保证其他可执行的进程获得CPU运行。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。