Multithreading 如何有效地表示或建模锁定序列?

Multithreading 如何有效地表示或建模锁定序列?,multithreading,concurrency,locking,file-locking,concurrent-programming,Multithreading,Concurrency,Locking,File Locking,Concurrent Programming,我目前正在解决的问题需要使用两个或多个锁(本例中为文件锁)来避免并发问题 但是,我在表示将用于解决方案的(锁定)模型时遇到问题 也就是说,我想通过某种类型的图表来解释我正在编码的问题和解决方案,该图表允许我显示锁定顺序、并发影响(例如,如果我们在这个锁之前释放这个锁,我们将遇到这个问题等)和其他此类有用信息 表示锁模型的好方法是什么 一方面,我一直在尝试使用流程图来实现这一点,因此我可以显示导致我必须获得锁或不获得锁的代码流(例如,我使用独占非阻塞锁来确定某个进程是否已经在监视某个文件,如果没有

我目前正在解决的问题需要使用两个或多个锁(本例中为文件锁)来避免并发问题

但是,我在表示将用于解决方案的(锁定)模型时遇到问题

也就是说,我想通过某种类型的图表来解释我正在编码的问题和解决方案,该图表允许我显示锁定顺序、并发影响(例如,如果我们在这个锁之前释放这个锁,我们将遇到这个问题等)和其他此类有用信息

表示锁模型的好方法是什么

一方面,我一直在尝试使用流程图来实现这一点,因此我可以显示导致我必须获得锁或不获得锁的代码流(例如,我使用独占非阻塞锁来确定某个进程是否已经在监视某个文件,如果没有,我启动监视器),另一方面,我一直认为序列图可以,但我对结果不满意

有没有其他可视化工具可以让我描述这个问题

对于分布式系统等非常复杂的问题,工程师如何解决这个问题


是否有一个图表可以说明这一点,或者更像是用来描述这一点的一组图表?

对于真正复杂的无锁算法验证,没有这样的可视化可以帮助证明其正确性。相反,有一些工具可用于多线程软件应用程序的正式验证

例如,请查看设计用于验证每个并发执行线程组合的。自旋模型的一个例子如下:

// a small example spin model
// Peterson's solution to the mutual exclusion problem (1981)

bool turn, flag[2];     // the shared variables, booleans
byte ncrit;             // nr of procs in critical section

active [2] proctype user()  // two processes
{
    assert(_pid == 0 || _pid == 1);
again:
    flag[_pid] = 1;
    turn = _pid;
    (flag[1 - _pid] == 0 || turn == 1 - _pid);

    ncrit++;
    assert(ncrit == 1); // critical section
    ncrit--;

    flag[_pid] = 0;
    goto again
}
// analysis: 
// $ spin -a peterson.pml
// $ cc -o pan pan.c
// $ ./pan

这里,您将描述线程如何通信和定义预期程序状态的条件。如果任何一种可能的执行组合导致断言失败,那么它将与导致断言失败的控制流一起报告

我应该从多个UML序列图(每个争用案例一个)开始,巧妙地使用标记(颜色、注释、片段、OCL)

实时系统过去设计时有很多时序图。但我不习惯

大多数时候,我有一个很好的代码思维导图,我会问自己每一条指令,如果此时有线程在运行会发生什么,什么是禁止状态。它非常类似于(可以通过“标记”在序列图上显示的契约)


每次我使用并发代码时,如果设计得好,您只需关注关键片段(仅限于几行代码)。

描述此锁定微体系结构可能需要两到三个机制视图。其中一个可能是状态图(下面是一个示例,优雅地演示了Java6线程状态和生命周期)

序列图可能会说明监视器的轮询行为——假设监视器正在序列化资源访问并为读取请求授予多个读锁,但为写入请求授予单次访问权。在这种情况下,您可能会说明,如果存在未完成的读取请求,则写入请求将被阻止,直到所有读取都被锁定omplete——同时仍然显示写请求是按优先级顺序排队的,这样就不会无限期地等待。(对不起,我对您的算法做了很多假设,但许多悲观的算法都是以这种方式运行的)

最后,UML泳道图可以很好地显示各种代理的并发活动——读写请求、监视器等等

我找到的关于软件架构的最好的书之一是。你会发现它非常值得你花时间(IMHO)

干杯!好问题!

历史上用于并发(和并发分布式系统)建模。作为一个正式的数学概念,它们允许您对操作序列、状态可达性进行推理(例如,可以方便地证明锁和/或资源状态的不可接受配置从未发生),活跃性、有界性、死锁性等有用信息,并具有良好、清晰的视觉表现。 但使用Petri网时,人们必须处理诸如位置和过渡之类的低级概念,因此无法进行抽象建模。因此,即使是中等规模的问题,它们的可视化描述通常也会变得非常庞大。彩色、优先级、定时和其他增强Petri网有时会起到解救作用,但对于更复杂的抽象系统ms更适合

下面是一些关于使用Petri网进行锁定序列分析的示例(有关更多详细信息,请参阅出版物):

  • 基于Petri网的两相锁定策略建模
  • 晶圆流型共享策略的Petri网模型 (这个包含一个 详细的死锁分析)

  • 如果你问谷歌,它是(但话说回来,在谷歌眼中,什么不是收藏?).我认为这是一个很好的开始,而序列图正是我一直在使用的。但最后,序列在我的脑海中,我经历了所有可能的状态/组合。这正是我希望能够向我脑海之外的人展示的:)时序图似乎是我可以研究的东西。有趣的是,你也可以尝试制作动画。例如:这是一个有趣的项目,使用这个工具肯定会很好,但是对于我的特定用例,我实际上需要向其他人展示信息,不仅是为了验证正确性,而且是为了解释n发生了什么以及为什么我会遇到这样的问题。谢谢你的提示!我会看看那本书,它看起来很有趣。这就是我一直在寻找的。最后,要表达如此复杂的互动似乎真的不是那么容易,但这是我能想到的最接近我所寻找的东西