Algorithm 最小代价死锁解决的一种变体

Algorithm 最小代价死锁解决的一种变体,algorithm,optimization,graph,deadlock,producer-consumer,Algorithm,Optimization,Graph,Deadlock,Producer Consumer,我有需要执行的任务列表。每个任务都是一个生产者,它更新多个实体以响应使用多个实体。因此,任务的执行是相互依赖的。然而,一些生产商可以消费部分或全部过时的实体。这将有效地确保没有死锁 在这种情况下,如何设计执行图,其中: 1) 并行运行的最大任务数(和) 2) 使用实时/非陈旧数据的最大任务数 非常感谢您的帮助 评论后编辑: 生产者能够容忍陈旧的数据。这意味着可以删除任何边。因此,总有一个解决方案(可以形成DAG)。去除这一边缘要付出代价。因此,问题实际上是: 给定一个循环图G(具有根节点和汇节点

我有需要执行的任务列表。每个任务都是一个生产者,它更新多个实体以响应使用多个实体。因此,任务的执行是相互依赖的。然而,一些生产商可以消费部分或全部过时的实体。这将有效地确保没有死锁

在这种情况下,如何设计执行图,其中: 1) 并行运行的最大任务数(和) 2) 使用实时/非陈旧数据的最大任务数

非常感谢您的帮助

评论后编辑: 生产者能够容忍陈旧的数据。这意味着可以删除任何边。因此,总有一个解决方案(可以形成DAG)。去除这一边缘要付出代价。因此,问题实际上是:

给定一个循环图G(具有根节点和汇节点),使用操作-以成本C移除两个节点之间的边。如何在任何节点级别创建节点数最大且成本最小的DAG。这里的级别是从根节点开始的深度。如果需要两条边才能从根到达节点,则节点的级别为2。根节点位于级别“0”


为什么不通过将任务与1元素同步缓冲区上的select操作连接起来,让图形自行设计,这样,只有当任务所需的输入都存在时,任务才会在同步缓冲区上运行?随着系统的变化,这种方法更容易维护。死锁。死锁是无法避免的,因为它们是对上下文的继承。所以,我需要解决死锁。你说“这应该有效地确保没有死锁。”假设有一个循环:P1->P2->P1。如果P1可以容忍陈旧数据,则P2->P1边缘可以有效删除,这样就不会有更多的循环。我的意思是,当边缘可以被移除时,总有一种情况,即没有循环,实际上意味着没有死锁。我现在没有时间研究这个问题,但我认为你可以做的是研究死锁恢复算法。这些设计用于打破已经发生的死锁图中的循环。你只想通过接受陈旧的结果而不是终止任务来打破它们。