初始化为零的共享变量 x 由四个并发进程 W、X、Y、Z 操作,如下所示。进程 W 和 X 中的每一个都从内存中读取 x,递增 1,将其存储到内存中,然后终止。进程 Y 和 Z 中的每一个都从内存中读取 x,递减 2,将其存储到内存中,然后终止。每个进程在读取 x 之前都会对计数信号量 S 调用 P 操作(即等待),并在将 x 存储到内存之后对信号量 S 调用 V 操作(即信号)。信号量 S 被初始化为 2。所有进程执行完毕后 x 的最大可能值是多少?
(一) -2
(乙) -1
(三) 1
(四) 2答案: (D)
解释:
背景说明:
进程可能在其中更改公共变量、更新表、写入文件和执行其他函数的临界区。重要的问题是,如果一个进程在其临界区执行,则不允许其他进程在其临界区执行。每个进程都必须请求进入其临界区的权限。信号量是一种同步工具,用于消除临界区问题,即没有两个进程可以同时运行,因此使用名为等待和信号的操作来消除这两个信号操作,用于消除相互排斥临界区。作为无符号同步原语中最重要的一个,因为可以构建很多其他的信号量,递减称为获取或锁定它,递增称为释放或解锁。
解决方案 :
由于信号量的初始值是 2,两个进程可以同时进入临界区——这很糟糕,我们可以看到原因。
假设,X 和 Y 是进程。X 将 x 增加 1,Z 将 x 减少 2。现在,Z 存储回来,然后 X 存储回来。因此,x 的最终值是 1 而不是 -1,并且两次 Signal 操作使信号量值再次变为 2。所以,现在 W 和 Z 也可以这样执行,x 的值可以是 2,这是进程执行的任何顺序中可能的最大值。 (如果信号量被初始化为 1,processed 将正确执行,我们得到最终的
x 的值为 -2。)
选项(D)是正确答案。
另一个解决方案:
进程可以以多种方式运行,下面是 x 达到最大值的情况之一 信号量 S 被初始化为 2
进程 W 执行 S=1, x=1 但它不更新 x 变量。
然后进程 Y 执行 S=0,它递减 x,现在 x= -2 并且信号量 S=1
现在进程 Z 执行 s=0, x=-4, signal semaphore S=1
现在进程 W 更新 x=1, S=2 然后进程 X 执行 X=2
所以正确选项是D
另一个解决方案:
S 是一个初始化为 2 的计数信号量,即,两个进程可以进入受 S.W 保护的临界区,X 读取变量,增加 1 并将其写回。 Y、Z可以读取变量,减2写回。
每当 Y 或 Z 运行时,计数都会减少 2。因此,要获得最大总和,我们应该将变量复制到增加计数的进程之一中,同时递减处理应并行运行,以便无论它们写回内存可以通过递增过程来覆盖。因此,实际上递减永远不会发生。
相关链接:
https://www.geeksforgeeks.org/introduction-of-process-synchronization/
http://geeksquiz.com/operating-systems-process-management-question-11/ 解释
此解决方案由Nitika Bansal 提供
这个问题的测验