如何有效地表示或建模锁定序列?
How can I effectively represent or model a locking sequence?
我目前正在解决的问题需要使用两个或多个锁(本例中为文件锁)来避免并发问题。
但是我在表示我将用于解决方案的(锁定)模型时遇到了问题。
即我想通过某种类型的图表来解释我正在编码的问题和解决方案,这些图表让我可以显示锁定顺序、并发影响(例如,如果我们在此之前释放此锁,我们将遇到此问题,等等)和其他类似的有用的信息。
什么是表示锁模型的好方法?
一方面,我一直在尝试用流程图来做到这一点,这样我就可以展示导致我是否必须获得锁的代码流(例如,我使用独占非阻塞锁来确定一个进程是否已经在监视一个文件,如果没有我就启动监视器),另一方面我一直认为序列图可以,但我对结果不满意。
是否有任何其他可视化工具可以让我展示这个问题?
工程师如何解决分布式系统等真正复杂的问题?
是否有任何一个图表或它更像是一组用于描述此的图表?
对于真正复杂的无锁算法验证,没有这样的可视化可以帮助证明其正确性。相反,有一些工具可用于对多线程软件应用程序进行形式验证。
例如请看一下 Spin ,它旨在验证并发执行线程的每个组合。 Spin 的此类模型的一个示例如下:
// 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)。
以前的实时系统都是用很多时序图来设计的。但是我不习惯。
大多数时候,我对我的代码有一个很好的思维导图,我会问自己每条指令,如果此时任何线程是 运行 会发生什么,禁止状态是什么。它与 Design by contract 非常相似(可以通过 "markers" 在序列图中显示的合约。
每次我使用并发代码时,如果设计良好,您只需关注关键片段(仅限于几行代码)。
描述此锁定微体系结构可能需要对该机制有两个或三个视图。一个可能是状态图(这是一个示例,优雅地说明了 Java 6 个线程状态和生命周期)Thread States。
序列图可能会说明您的监视器的轮询行为——假设您的监视器正在序列化资源访问并为读取请求授予多个读取锁,但为写入请求授予单一访问权限。在这种情况下,您可能会说明,如果有未完成的读取请求,写入请求将被阻塞,直到所有读取完成——同时仍然显示写入请求按优先级顺序排队,以免无限期地等待。 (抱歉,我对您的算法做了很多假设,但许多悲观算法都以这种方式运行)。
最后,UML 泳道图可以很好地显示各种代理的并发活动——读取和写入请求、监视器等。
我找到的关于软件架构的最好的书之一是 "Documenting Software Architectures, Views and Beyond" 。你会发现它非常值得你花时间(恕我直言)。
干杯!奇妙的问题!
Petri nets 历史上用于建模并发(和并发分布式系统)。作为一个正式的数学概念,它们允许您推理操作序列、状态可达性(例如可以很方便地证明不可接受的锁配置 and/or 资源状态永远不会发生)、活性、有界性、死锁和其他此类有用信息严格地。此外,他们有漂亮干净的视觉表现。
但是使用 Petri 网必须处理位置和转换等低级概念,并且没有抽象建模的方法。因此,即使对于中等规模的问题,它们的视觉描绘通常也会变得很大。彩色、优先级、定时和其他增强型 Petri 网有时会派上用场,但对于更复杂的抽象系统 UML statecharts 更合适。
这里有一些关于使用 Petri 网进行锁定序列分析的示例(更多详细信息请参阅出版物):
- 两阶段锁定策略的Petri网建模来自”Petri网
数据库系统并发控制的基于模型》,作者:HOD Jie,
李凤英、王慧娇
- 用于晶圆流模式共享策略的 Petri 网模型来自
"Scheduling Single-Armed Cluster Tools With Reentrant Wafer Flows"
作者 Hwan-Yong Lee 和 Tae-Eog Lee(这个包含一个
详细的死锁分析)
我目前正在解决的问题需要使用两个或多个锁(本例中为文件锁)来避免并发问题。
但是我在表示我将用于解决方案的(锁定)模型时遇到了问题。
即我想通过某种类型的图表来解释我正在编码的问题和解决方案,这些图表让我可以显示锁定顺序、并发影响(例如,如果我们在此之前释放此锁,我们将遇到此问题,等等)和其他类似的有用的信息。
什么是表示锁模型的好方法?
一方面,我一直在尝试用流程图来做到这一点,这样我就可以展示导致我是否必须获得锁的代码流(例如,我使用独占非阻塞锁来确定一个进程是否已经在监视一个文件,如果没有我就启动监视器),另一方面我一直认为序列图可以,但我对结果不满意。
是否有任何其他可视化工具可以让我展示这个问题?
工程师如何解决分布式系统等真正复杂的问题?
是否有任何一个图表或它更像是一组用于描述此的图表?
对于真正复杂的无锁算法验证,没有这样的可视化可以帮助证明其正确性。相反,有一些工具可用于对多线程软件应用程序进行形式验证。
例如请看一下 Spin ,它旨在验证并发执行线程的每个组合。 Spin 的此类模型的一个示例如下:
// 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)。
以前的实时系统都是用很多时序图来设计的。但是我不习惯。
大多数时候,我对我的代码有一个很好的思维导图,我会问自己每条指令,如果此时任何线程是 运行 会发生什么,禁止状态是什么。它与 Design by contract 非常相似(可以通过 "markers" 在序列图中显示的合约。
每次我使用并发代码时,如果设计良好,您只需关注关键片段(仅限于几行代码)。
描述此锁定微体系结构可能需要对该机制有两个或三个视图。一个可能是状态图(这是一个示例,优雅地说明了 Java 6 个线程状态和生命周期)Thread States。
序列图可能会说明您的监视器的轮询行为——假设您的监视器正在序列化资源访问并为读取请求授予多个读取锁,但为写入请求授予单一访问权限。在这种情况下,您可能会说明,如果有未完成的读取请求,写入请求将被阻塞,直到所有读取完成——同时仍然显示写入请求按优先级顺序排队,以免无限期地等待。 (抱歉,我对您的算法做了很多假设,但许多悲观算法都以这种方式运行)。
最后,UML 泳道图可以很好地显示各种代理的并发活动——读取和写入请求、监视器等。
我找到的关于软件架构的最好的书之一是 "Documenting Software Architectures, Views and Beyond" 。你会发现它非常值得你花时间(恕我直言)。
干杯!奇妙的问题!
Petri nets 历史上用于建模并发(和并发分布式系统)。作为一个正式的数学概念,它们允许您推理操作序列、状态可达性(例如可以很方便地证明不可接受的锁配置 and/or 资源状态永远不会发生)、活性、有界性、死锁和其他此类有用信息严格地。此外,他们有漂亮干净的视觉表现。 但是使用 Petri 网必须处理位置和转换等低级概念,并且没有抽象建模的方法。因此,即使对于中等规模的问题,它们的视觉描绘通常也会变得很大。彩色、优先级、定时和其他增强型 Petri 网有时会派上用场,但对于更复杂的抽象系统 UML statecharts 更合适。
这里有一些关于使用 Petri 网进行锁定序列分析的示例(更多详细信息请参阅出版物):
- 两阶段锁定策略的Petri网建模来自”Petri网 数据库系统并发控制的基于模型》,作者:HOD Jie, 李凤英、王慧娇
- 用于晶圆流模式共享策略的 Petri 网模型来自 "Scheduling Single-Armed Cluster Tools With Reentrant Wafer Flows" 作者 Hwan-Yong Lee 和 Tae-Eog Lee(这个包含一个 详细的死锁分析)