RESOURCE = (acquire->continue->RESOURCE).
USER = (acquire->use->continue->USER).
||RESOURCE_SHARE = (a:USER || b:USER || {a,b}::RESOURCE).
continue
和a.USER
之间的共享操作a.RESOURCE
如何确保a.USER
路径不会与b.USER
路径交织在一起?例如,我LTSA不允许以下跟踪,我不明白为什么不。
a.acquire->b.acquire->a.use->b.use->...
这种混淆是通过将其与以下FSP / LTSA进行比较而得出的。删除这两个流程中的continue
操作,我们留下:
RESOURCE = (acquire->RESOURCE).
USER = (acquire->use->USER).
||RESOURCE_SHARE = (a:USER || b:USER || {a,b}::RESOURCE).
这个FSP / LTSA突然允许USER
路径交织在一起,因为我们可以执行以下跟踪:
a.acquire->b.acquire->a.use->b.use->...
显然添加继续强制USER
路径分开。为什么呢?
来源: 第一个FSP来自“并发”一书。作者:Jeff Magee和Jeff Kramer。
答案 0 :(得分:0)
我发了一封邮件给老师帮助我。我会用他的话来解释:
有三个进程,两个前缀a和b的USER和 {A,B} :: RESOURCE。来自a.USER和b.USER 的动作“获取”合并 来自{a,b}的{a,b} .acquire :: RESOURCE。这也适用于 {A,B}。继续。
因此,在第一个状态中,启用了两个可能的跟踪:a.acquire OR b.acquire。假设选择了动作a.acquire。发生转变 和a.USER只启用动作a.use,而 {a,b} :: RESOURCE启用了两个选项:{a,b} .continue。
由于a.USER中尚未启用a.continue,因此无法继续执行 在{a,b} :: RESOURCE中。剩下的唯一动作是a.use发生。在里面 与此同时,b。美国仍然处于第一状态,无法运行b.acquire 因为{a,b} :: RESOURCE只启用了{a,b} .continue。
在a.use转换之后,a.USER现在已准备好进行共享操作 a.continue。一旦发生这种情况,所有三个过程都会回到原点 开始状态。