首页 > 编程知识 正文

临界区是一段程序,垄断条件下的竞争及特点

时间:2023-05-04 02:27:20 阅读:150231 作者:4341

竞争条件与临界区竞争条件临界区

竞争条件

在某些操作系统中,协作进程可能共享可互相读写的共享存储区。 此共享存储可以位于内存中,也可以位于内核数据结构中,还可以是共享文件。 这里的共享存储器区域的位置,不影响通信的本质和伴随的问题。 为了理解实际的进程间通信是如何工作的,请考虑一个简单而一般的例子。 是假脱机打印机。 如果进程需要打印文件,则文件名将放在特殊的假脱机目录“假脱机目录”下。 另一个进程(打印机守护进程)定期检查是否存在需要打印的文件,如果存在,则打印,然后从目录下删除文件名

假设假脱机目录中有许多槽位,并且每个槽位都包含文件名,编号顺序为0、1、2、 假设有两个共享变量out指向下一个要打印的文件: in,指向目录中的下一个空闲插槽。 这两个变量可以保存在所有进程都可以访问的文件中。 此文件的长度为两个字符。 在某个时间点,0号到3号插槽是空的,其中的文件已经打印完毕。 4号到6号插槽被占用。 其中排列着要打印的文件名。 几乎在同一时间,进程a和进程b决定对文件进行排队以进行打印。 图中显示了这种情况

可能出现以下情况: 过程a读取in的值为7,并将7存储在一个局部变量next_free_slot中。 此时发生时钟中断,CPU判断进程a已经运行了足够长的时间,决定切换到进程b。 过程b也读取in,同样得到值7,在b的局部变量next_free_slot中存在7。 此时,这两个进程都认为下一个可用的时隙位是7

当前,进程b继续执行,文件名存在于槽位7中,in的值更新为8。 然后,离开,继续其他操作

最后,进程a将从上次中断的地方再次运行。 因为它检查变量next_free_slot,发现其值为7,所以将打印文件名存储在第七个插槽中,并且进程b重写其中存在的文件名。 然后将next_free_slot加1,当值变为8时,将8存储在in中。 此时,由于假脱机目录内部一致,打印机守护进程找不到错误,但进程b无法获得打印输出。 这种情况称为竞争条件(race condition ),因为两个或多个进程读写某些共享数据,最终结果取决于进程运行的准确时间。 调试有竞争条件的程序是令人头痛的事情。 大多数测试的结果都很好,但会出现极少数无法解释的奇怪现象

临界区如何避开竞争条件? 实际上,如果涉及内存共享、文件共享、资源共享等,就会发生上述错误。 要避免出现这种错误,重要的是找到一种防止多个进程同时读写共享数据的方法。 这意味着,当一个进程使用共享变量或文件时,需要采取某种措施阻止其他进程执行相同的操作的互斥(mutual exclusion )。 上述问题的核心是在进程a使用共享变量还没有结束之前,进程b就使用它。 选择合适的原语以实现互斥是任何操作系统的主要设计内容之一

避免竞争条件的问题也可以用抽象的方法来描述。 在某个过程的一部分时间内进行内部计算,或者进行不引起其他竞争条件的操作。 在某些情况下,进程可能需要访问共享内存和共享文件,或者执行可能导致冲突的其他操作。 用于访问共享存储器的程序的片段被称为临界区(critical region )或临界区(critical section )。 如果能妥善安排,使两个进程不能同时处于临界区域,就可以避免竞争条件

需要满足几个条件:

两个进程不能同时位于其临界区域。即使做出与CPU的速度和数量不对应的假设,在临界区域外运行的进程也不能阻塞其他进程。 不要等待进程无限期进入临界区域。 抽象地看,我们希望的过程行为如图所示。 图中的过程a在时刻T1进入临界区。 然后,在时间T2,进程b试图进入临界区域,但失败了。 因为另一个进程已经在这个临界区域内,在某个时刻只允许一个进程在临界区域内。 然后,在时刻T3,b被暂停直到a离开临界区域,b被立即允许进入。 最后,b离开,回到了在(时刻T4 )临界区域没有进程的原来的状态

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。