Peterson 的算法能满足饥饿问题吗?

2023-11-23

我一直在搜索有关的信息彼得森算法但遇到的参考资料表明它不能解决饥饿问题,而只能解决僵局。这是真的?如果是这样,有人可以详细说明为什么不吗?

彼得森算法:

flag[0]   = 0;
flag[1]   = 0;
turn;

P0: flag[0] = 1;                                       
    turn = 1;                                               
    while (flag[1] == 1 && turn == 1)                        
    {                                                       
           // busy wait                                             
    }                                                                                      
    // critical section                                     
       ...                                                     
    // end of critical section                              
    flag[0] = 0;   

P1: flag[1] = 1;                                       
    turn = 0;                                               
    while (flag[0] == 1 && turn == 0)                        
    {                                                       
           // busy wait                                             
    }                                                                                      
    // critical section                                     
       ...                                                     
    // end of critical section                              
    flag[1] = 0;

该算法使用两个变量:flag 和turn。标志值为 1 表示进程想要进入临界区。变量turn保存当前轮到的进程的ID。如果 P1 不想进入其临界区或者 P1 通过将 Turn 设置为 0 赋予 P0 优先权,则允许进程 P0 进入临界区。


正如本·杰克逊(Ben Jackson)怀疑的那样,问题出在通用算法上。标准的 2 进程 Peterson 算法满足无饥饿性质。

显然,彼得森的原始论文实际上有一个算法N处理器。这是我刚刚用类似 C++ 的语言写的一个草图,据说就是这个算法:

// Shared resources
int pos[N], step[N];

// Individual process code
void process(int i) {
    int j;
    for( j = 0; j < N-1; j++ ) {
        pos[i] = j;
        step[j] = i;
        while( step[j] == i and some_pos_is_big(i, j) )
            ; // busy wait
    }
    // insert critical section here!
    pos[i] = 0;
}

bool some_pos_is_big(int i, int j) {
    int k;
    for( k = 0; k < N-1; k++ )
        if( k != i and pos[k] >= j )
            return true;
    }
    return false;
}

这是一个死锁场景N = 3:

  • 进程0首先启动,设置pos[0] = 0 and step[0] = 0然后等待。
  • 接下来开始进程2,设置pos[2] = 0 and step[0] = 2然后等待。
  • 进程 1 最后启动,设置pos[1] = 0 and step[0] = 1然后等待。
  • 进程2是第一个注意到变化的进程step[0]如此设置j = 1, pos[2] = 1, and step[1] = 2.
  • 进程 0 和 1 被阻塞是因为pos[2] is big.
  • 进程2没有被阻塞,所以它设置j = 2。它逃脱了 for 循环并进入临界区。完成后就设置了pos[2] = 0但立即开始再次竞争关键部分,从而设置step[0] = 2并等待。
  • 进程1是第一个注意到变化的进程step[0]并按照之前的过程2进行。
  • ...
  • 进程 1 和 2 轮流竞争进程 0。

参考。所有详细信息均来自论文“关于著名互斥算法的一些误解” 作者:Alagasamy。显然,Block 和 Woo 在“中提出了一种修改后的算法Peterson 互斥算法的更有效推广“这确实满足了不饥饿的要求,阿拉加萨米后来在”中改进了这一点具有最佳有界旁路的互斥算法“(通过获得最佳饥饿界限N-1).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Peterson 的算法能满足饥饿问题吗? 的相关文章

  • 是否可以证明序列是否是随机的?

    考虑以下输入 1 1 2 3 5 8 这不是随机的 2 4 8 16 32 这都不是 4 1 2 11 5 9 这个看起来像随机序列 我想问是否有这样的算法来证明输入是否是随机的 不 没有这样的证明 如果你有完全随机的数字 则每个长度为 n
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 具有 3 路划分的快速排序

    什么是三向分区快速排序 画一个数组 3 5 2 7 6 4 2 8 8 9 0 A 两分区快速排序会选择一个值 比如 4 并将每个大于 4 的元素放在数组的一侧 将每个小于 4 的元素放在另一侧 就像这样 3 2 0 2 4 8 7 8 9
  • 如何找到给定顶点的所有多边形?

    我有一个顶点列表 并且我知道它们之间的连接 我试图找到顶点的所有多边形形状 这些多边形形状不应重叠 我做了一些研究 我认为如果我可以顺时针 或逆时针 没有区别 遍历顶点 我可以检测多边形形状 因此 我寻找顺时针遍历顶点的解决方案 我发现了一
  • 图中使用 K 个反向边的所有最短路径

    假设我有一个有向图 G V E 其边的权重为正整数 我需要做的是使用最多 K 整数 个反向边找到所有顶点之间的最短路径 我的意思是 如果我们在边 u 处 并且只有一条从 v 到 u 的有向边 只要我们没有在这条路径上使用 K 个反向边 我们
  • 证明字符串算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何测试哈希函数?

    有没有办法测试哈希函数的质量 我希望在哈希表中使用时具有良好的分布 如果这可以在单元测试中验证 那就太好了 EDIT 为了澄清 我的问题是我已经使用了longJava 中的值的方式是第一个 32 位编码一个 ID 第二个 32 位编码另一个
  • 在 Perl 中确定范围重叠的最快方法

    我有两组范围 每个范围都是一对整数 开始和结束 表示单个较大范围的某些子范围 两组范围的结构与此类似 当然 将替换为实际数字 a ranges a 1 gt start gt end gt a 2 gt start gt end gt a
  • 算法挑战:从图像生成配色方案

    背景 因此 我正在开发一个网络应用程序的新版本 而且 我们发现我们的用户非常懒惰 实在是太懒了 事实上 我们为他们做的工作越多 他们就越喜欢这项服务 现有应用程序的一部分要求用户选择要使用的配色方案 但是 我们有一张图片 用户网站的截图 为
  • 在哪里可以找到产生无标头输出的无损压缩算法?

    你们中有人知道产生无标头输出的无损压缩算法吗 例如不存储用于压缩的哈夫曼树吗 我不是谈论硬编码的霍夫曼树 但我想知道是否有任何算法可以压缩和解压缩输入而不在其输出中存储一些元数据 或者这在理论上是不可能的吗 当然是可能的 其中 LZ 系列压
  • 给定一个数字 0-9 的数组和一个整数 n,找到可由输入数组组成且小于 n 的所有整数

    问题是这样的 给你一个数字 0 9 的数组和一个整数n 该数组可能包含任何给定数字的重复项 找到所有可以通过连接输入数组中的数字形成的整数并且小于n 输入数组中的数字可以在输出的元素中重复 例如 输入为 2 5 8 且 n 223 则输出应
  • 计算字母表的第 n 个 6 个字符排列

    我已经研究了好几天 试图找到解决这个问题的方法 如果需要的话 我很乐意花钱请人咨询时间来解决这个问题 我目前正在使用Python迭代工具 http docs python org 2 library itertools html生成 32
  • 有向无环图的拓扑排序为阶段

    是否有一种算法 给定一个未加权的有向无环图 将所有节点排序到节点集列表中 使得 拓扑顺序被保留 即 对于所有边u gt v v出现在列表中更靠下的集合中u and 列表的长度是最小的 这个问题有名字吗 Example 下图的一种可能的排序是
  • 根据先前日期进行预测:值数据

    我有一些类似时期的数据集 这是当时人们的介绍 时间大约有一年 数据并不是定期收集的 而是相当随机的 每年 15 30 个条目 来自 5 个不同的年份 The graph drawn from the data for each year l
  • 时间复杂度:连续对一个数字的数字进行求和,直到结果为一位数

    给我一个数字 N 不断对数字求和 直到结果为一位数 例如 35252 gt 17 gt 8 我写了以下代码 int digitSum int n int sum 0 int digit while n digit n 10 n n 10 s
  • 在大文件中查找重复字符串

    一个文件包含大量 例如100亿 字符串 您需要查找重复的字符串 您有 N 个可用系统 您将如何找到重复项 埃里克森的答案可能是提出这个问题的人所期望的 您可以将 N 台机器中的每台机器用作哈希表中的一个存储桶 对于每个字符串 按顺序说出字符
  • 如何解决素数函数的大O表示法?

    我正在尝试理解 Big O 表示法 很抱歉 如果我问的问题太明显了 但我似乎无法理解这一点 我有以下 C 代码函数 我正在尝试为其计算 Big O 表示法 for i 2 i lt 100 i for j 2 j lt i j j if i
  • MongoDB 全文搜索分数“分数是什么意思?”

    我正在为我的学校开发一个 MongoDB 项目 我有一个句子集合 我进行正常的文本搜索以查找集合中最相似的句子 这是基于评分的 我运行这个查询 db sentences find text search any text score met
  • 找出区间内绝对差值最小的两个元素

    我给定了一个数组和一个 L R 类型的查询列表 这意味着找到任何两个数组元素之间的最小绝对差 使得它们的索引在 L 和 R 之间 其中数组的起始索引是 1 而不是 0 例如 采用包含元素 2 1 8 5 11 的数组 a 则查询 1 3 将
  • 将这个 if-then 逻辑转换为布尔表达式?

    我在使这段代码更简洁 最好是单个布尔表达式 方面有点绞尽脑汁 这是我的代码 if d Unemployed if type Unemployed tmp Unemployed true else tmp Unemployed false

随机推荐

  • 使用 xcodebuild 从命令行构建 Cocoa 应用程序后,如何运行它?

    我正在使用 Xcode 项目从命令行构建 Mac OS X Cocoa 应用程序 如下所示 xcodebuild scheme MyApp configuration Debug 构建完成后如何运行它 我写了一个脚本来执行此操作 bin b
  • Apache StringUtils 与 Replace() 的 Java 实现

    Java 1 4 2 的替换实现和 Apache 2 3 的实现之间有什么区别 两者之间是否存在性能提升 Java 1 4 2 替换 Apache 2 3 替代 The String replace 您链接到的方法需要两个char值 因此它
  • 使用 Java Config 时的 Spring Batch 表前缀

    我的 Spring Batch 存储库 部署在 Oracle 数据库上 位于不同的架构中 因此我需要在前面添加架构名称 当使用 XML 配置时 这很容易做到
  • 使用 C# 查询、过滤和更新 MongoDB 中的多级嵌套数组

    我有这个 MongoDB 文档 我正在开发一个 MVC 应用程序并尝试使用 C 更新注释数组 注释描述为 更新后注释 我正在使用新的 mongodb 版本 ProjectID 1 ProjectName Project test Proje
  • 创建缩略图,然后转换为字节数组

    我在创建缩略图然后将它们转换为字节数组方面遇到了很大的麻烦 我尝试了三种方法 3次都出错了 第一个是使用 Bitmap GetThumbnailImage 我过去使用过它 然后直接保存到 Response OutputStream 中 第二
  • 具有自定义逻辑的 Java 8 Stream groupingBy

    我有一个清单Records 其中有两个字段 LocalDateTime instant and a Double data 我想按小时对所有记录进行分组并创建一个Map
  • Java中的协议缓冲区“ParseFromString”用于解析文本格式?

    Is ParseFromStringJava 中的协议缓冲区可用吗 C 版本有 here 留言A 方法TextFormat getParser merge str builder 可以 例如 AOuterClass A Builder bu
  • 如何在phpmyadmin中使用“中心列”?

    PMA 具有用于添加中心列的工具 据我了解 它是在国外的限制下使用的 我有两张桌子 TableA and TableB 结构TableA id of A name of A value 结构TableB id of B foreign id
  • 如何在 PySpark 中展平嵌套列表?

    我有一个 RDD 结构 例如 rdd 1 2 3 4 5 6 7 8 9 10 我希望它变成 rdd 1 2 3 4 5 6 7 8 9 10 如何编写映射或归约函数才能使其正常工作 例如你可以flatMap并使用列表理解 rdd flat
  • 中断异常的原因

    从 J2me 文档我们知道 java lang InterruptedException 当线程正在等待 睡眠或以其他方式暂停很长时间并且另一个线程中断它时抛出 问题是 如果我从一个线程为其他线程调用 Thread Interupt 而其他
  • 图形中的边交叉减少

    是否有任何算法可以最小化图中的边交叉 例如 如果我有图形的转换矩阵 我找到了一些方法 例如尝试将节点放置在另一个节点周围 但我想知道一些其他想法 有一系列为图形绘制应用程序开发的成熟算法 库 您可以获得一些背景知识here 要绘制无向图 一
  • WebDriver 和 C# - NoSuchElement 异常

    我有以下代码用于从给定列表中选择一个选项 它通常可以工作 但有时会失败 并在第二个 if 上出现 NoSuchElement 异常 我的印象是 如果它没有找到该元素 它就会再次返回到循环 我相信解释很简单 有人能启发我吗 public st
  • Git 工作流程以及 rebase 与合并问题

    我和另一位开发人员在一个项目中使用 Git 已有几个月了 我有多年的经验SVN 所以我想我给这段关系带来了很多包袱 我听说 Git 非常适合分支和合并 但到目前为止 我只是没有看到它 当然 分支非常简单 但是当我尝试合并时 一切都变得一团糟
  • clang-format 堆叠所有 if 语句参数(如果它们太长)

    我有一个if声明有几个or编辑的论点 为了便于阅读 我将它们垂直堆叠如下 if health flag a health flag b health flag c health flag d health flag e health fla
  • python-docx 中的运行级别内容是什么?

    我对 python docx 中 运行级别内容 的概念有点困惑 我知道如果我想检查段落是否为粗体 我需要检查 run bold 但到底是什么它 官方的定义是 run是与内联内容关联最密切的对象 在段落内的块项目边界之间流动的文本 图片和其他
  • 如何在发布模式下为 .net 托管项目生成 PDB?

    我知道 PDB 是为managed通过为编译器提供 debug 参数来在 NET 中进行项目 有没有办法在 VS 2005 GUI 中指定这一点 到目前为止 我可以让它在发布模式下生成 PDB 的唯一方法是手动修改 csproj 文件并添加
  • 具有多个“操作”的 HTML 表单

    我正在设置一个表单 其中我需要两个 操作 两个按钮 1 提交此表格以供批准 2 保存此应用程序供以后使用 如何创建支持多个 操作 的 HTML 表单 EG
  • Git克隆:远程端意外挂起,尝试更改postBuffer但仍然失败

    我正在尝试克隆存储库 第一次我到了82 然后半个小时没动 所以我取消了克隆并重新开始 此后 每次我尝试克隆它时 都会得到 6 10 之间的结果 然后失败并出现错误 远程端意外挂起 早期 EOF 我查找了错误并尝试了我能找到的所有解决方案 最
  • Python 扫描 WiFi

    我正在寻找一个可以扫描 WiFi 网络并打印所有 SSID 的程序 我尝试使用 scapy 但失败了 我正在使用 pyCharm 编辑器 我尝试了这段代码 from scapy all import from scapy layers do
  • Peterson 的算法能满足饥饿问题吗?

    我一直在搜索有关的信息彼得森算法但遇到的参考资料表明它不能解决饥饿问题 而只能解决僵局 这是真的 如果是这样 有人可以详细说明为什么不吗 彼得森算法 flag 0 0 flag 1 0 turn P0 flag 0 1 turn 1 whi