最近,我发现自己必须写下一些我对正在开发的应用程序(不是由我开发)中的竞争条件的担忧。这可能会引起非技术人员且我与他们没有直接沟通渠道的利益相关者的注意,因此我的解释需要以书面形式进行。

我已经尝试过写这篇文章了。我尽可能地掩盖了技术细节,给出了应用程序中如何发生竞争条件的示例,并描述了其影响。我觉得我做得还不错,但还远远不够完美。

问题是,尽管我试图让读者远离计算机科学,但我仍然发现很难在不失去正确性和实质内容的情况下消除诸如“执行线程”和“互斥”之类的短语。风险在于,如果过度挥手,这些担忧可能会被视为虚构的妖怪而被忽视。

无论如何,我向你提出的问题是: 怎么会 向非技术受众解释竞争条件? 你敢解释一下CPU调度吗?你会调用 哲学家就餐?

你不必在我的情况的限制下工作(但如果你这样做的话将会非常有帮助)。

有帮助吗?

解决方案

X公司在银行有1000美元。 X支付2000美元的租金并收到10,000美元的服务,用于向Y公司提供的服务。但是,由于竞争条件,X的赤字为1,000美元,现在申请破产。 =(

您可能想要解释银行如何以这种方式处理公司X的账户:银行职员A获得1,000美元的当前价值并为其增加10,000美元。银行职员B的现值为1,000美元,并从中减去2,000美元。银行职员A将价值更新为11,000美元。银行职员B将价值更新为 - $ 1,000。

其他提示

我认为银行交易可能是一个很好的例子,因为很容易看出不正确的结果是,因为在这样的环境中很容易创造竞争条件。

我的帐户上有500美元。 有人在我提取50美元的同时向我汇款200美元。

现在,如果银行没有正确处理竞争条件,他们将执行以下操作(假设交易是手动处理的,当然) 职员A会看到我的余额增加200美元的请求,请注意我的余额目前是500美元。 职员B会看到从我的余额中减去50美元的请求,请注意我的余额目前是500美元(职员A尚未转账)。

职员A完成文书工作并将我的账户余额设置为700美元(500 +他应该添加的200)。 然后,一分钟后(因为店员B只需要拿一杯咖啡),店员B完成了另一笔交易,并将我的余额设定为450美元(我检查时的500,减去他要减去的50) )。

由于竞争条件,我的余额现在是450美元,应该是650美元。结果取决于两次交易的不同部分的执行顺序。

这是对竞争条件如何糟糕的一般描述。现在说代替职员,我们让我们的应用程序同时处理两个单独的任务(这就是你的'执行线程'),就像上面一样,他们都读取一个值,修改他们的值读取,然后将其写回。如果按照上面显示的顺序发生,则可能会丢失其中一个修改。 这应该与您的应用中的特定问题相关联。

我会采用餐饮哲学家的方式,但根据我的观众,我会尝试将其类比为我的观众的背景。你在跟企业高管说话吗?然后将其类比为分配会议室或公司车或预订酒店房间等等。你在跟一般人说话吗?那餐饮哲学家的榜样很好,或者你可以想出一个类似的情况,包括照顾农场动物或坐在椅子上等等。

无论你是劫持餐饮哲学家的榜样,还是自己制作,都要用一个比喻。

如果您要写信给非技术人员,您需要简化解释并将其与他们能够理解的内容联系起来。从类似于向缺乏经验的程序员教授并行计算的论文中得到的一个解释( http:// portal .acm.org / citation.cfm?doid = 1189136.1189172 )用笔游戏解释:

  

我们<!>#8217;打算玩一款名为的游戏   钢笔游戏。规则很简单:我<!>#8217; m   我手里拿着一支笔,然后   然后我<!>#8217;我会说<!>#8220;一,二,三,去。<!>#8221;   当我说<!>#8220;去,<!>#8221;拿笔来自我的   手。获得笔的人获胜。   准备?一,二,三,去。

然后询问是否可以提前预测此游戏的结果。如果无法预测,我们能保证正确的结果吗?这应该导致意识到同时写入同一块内存可能会得到错误的结果。

我打算推荐餐饮哲学家,但我看到你已经找到了那个。那么,作为替代方案,如何使用gridlock作为类比呢?

想象一下,在一个街区(北大街,南大街,东大街和西街)旁边的四条街道上正常行驶。当路上只有一两辆车时,一切都会顺利进行。当交通稳定时,一些汽车将不得不停下来等待其他车辆驶过,但这是一个可控制的问题。一辆车停下来等待另一辆车经过,然后继续它的快乐方式。

现在,在同一位置拍摄高峰时段的交通。假设一辆在西街上行驶的汽车无法穿过我们城区西北角的十字路口。那辆车现在阻挡了北大街的所有Westbound交叉路口。不久之后,一辆Westbound汽车试图穿过东北角的交叉路口并被卡住,阻挡东街的所有北行交通。当这种情况一直绕着四个十字路口时,没有车可以移动!每个人都在等待前方的车辆向前移动,但是没有办法在不将车辆向后拉出的情况下解除阻塞。

与计算的比较应该是直截了当的。汽车是线程或流程,街道和渠道是处理器,缓冲区或核心。阻塞的概念可以使用红绿灯或停止标志来描述,整个事情开始变得直观,即使对非程序员也是如此。

写一个程序:

  1. 等发工资。
  2. 去商店。
  3. 买食物。
  4. 打开盘子。
  5. 将食物放在盘子上。
  6. 将板放置 20 分钟。
  7. 吃。
  8. 睡觉。

现在尝试让两个线程(你,妻子)在不同步的情况下执行它。

  • 你:等发工资。
  • 妻子:去商店没钱,崩溃

  • 你:打开盘子。

  • 你:将板放置 20 分钟。
  • 你:睡觉。

  • 妻子:去别人家吃饭。

  • 妻子:睡觉。
彼得想要退出他的车道。他确定没有任何东西妨碍他的车,然后进去。他的儿子弗兰克然后躲在车后面。彼得看不见他,把他拉过来。

重要的是,对于计算机,<!> quot; inspect <!> quot;和<!> quot; modify <!> quot;往往是两个单独的动作,所以你修改它时无法检查的例子很好。

明显的显而易见的是什么?

竞争条件实际上是两个人之间的竞赛。

一家公司正在竞标一个项目。两名独立于投标工作的员工将其提交给客户,但其中一名员工的信息已过时。员工都不知道对方正在提交出价,因此根据谁更快,第一次出价可能会被较慢的员工所取代。这会引起混淆,因为出价可能会随着时间的推移而发生变化。

两个员工之间需要进行沟通,要么共同合作,要么停止其中一个。

解释一般概念的一个困难是竞争条件在各种各样的情况下表现出来。如果您的目标是让非技术受众感觉这是一般问题类型,那么您应该尝试提供多个示例。

一张图片胜过1000字。这是真的。如果您绘制一个时间轴并在其上放置一些实体,并随着时间的推移显示其状态变化,您可以在一个图表中非常容易地展示竞争条件。可能需要一些重做才能使图片恰到好处,但我总是发现将它绘制出来得到我的观点必须比描述它更快。

我认为很难以一种简单的方式解释这一点,因为考虑并发本质上很难。金融交易的基本理念可能是一个很好的起点,因为人们会从现实生活中熟悉它们。

在任何类型的交易中,您需要在两个地方同时输入 - 借记和贷记。如果交易在中间被其他人试图执行另一笔交易而中断,他们会在一个或另一个账户中看到错误的余额。

使用操作系统应用程序进行结构化并行编程中有一个很好的示例(我记得)

在贫穷的贝塞克斯坦国家,两条线路合并在隧道中的一条轨道上。发生过冲突,执政的军政府需要一个解决方案。

问题在于它是山区,工程师是盲人。两列火车即将在隧道内发生碰撞的预警很少。

这是计划。

  1. 在接合处放一个大碗。

  2. 给每个工程师一只小黄铜猴。

  3. 当你即将进入隧道时,你会停下火车。你在碗里拍拍,看看碗里是否有一只黄铜猴子。

    如果有一只猴子,其他人正在使用隧道,所以你必须等到他们的火车完全在隧道中,此时导体从守车中走出来并从碗中抓住猴子。

    如果没有猴子,没有其他人在使用隧道。因此,您可以从发动机舱抓住您的猴子,将其放入碗中并开车穿过隧道,因为您知道您已获得对轨道的独占访问权限。当然,你暂时停下来让导体取回黄铜猴子。

    猜猜是什么?

    他们仍然发生了碰撞!

    为什么呢?导致此失败的情况或行动顺序是什么?


    这是竞争条件。

    在书面文件中,您可以解释竞争条件如何导致事故。

    在演示文稿中,您可以通过关于并发和锁定的推理来指导观众。

我会使用数据竞争条件的共享内存银行帐户示例。

解释说计算机的功能如下:负载均衡;加1;商店余额;考虑两个线程正在修改您的银行账户余额(您和您的妻子同时存入一美元)。

如果两个线程在:load balance之后被中断;然后恢复,你可能会损失一美元。

参见: http://wasp.cs.washington.edu/atomeclipse/handouts .PDF

正如您所提到的,您经常需要引入其他概念(互斥,执行线索)来准确描述竞争条件,即使是在比喻中。因此,首先尝试使用隐喻来定义这些术语(或者至少要理解这些术语)。

举一个简单的例子,让我们使用一个四向交叉路口(设置在你右边开车的国家)。将交叉路口划分为4个象限:西北,东北,东南和西南。现在将每个象限称为一个资源,并将每个汽车称为执行线程。这些车只尊重交通系统,而且由于这个交叉路口没有停车标志或红绿灯,所以车辆直接通过而不会减速或考虑交通。

您可以轻松地显示,多辆车同时使用其中一个象限是不好的,并导致车祸。一个明显的解决方案是安装交通系统。该系统确保不会有多辆汽车同时通过象限。它可以复杂地做到这一点,而不会占用所有资源。例如,让来自南方的汽车左转向西(使用东南和西北象限),同时让来自西方的汽车右转向南(使用西南象限) 。交通系统提供互斥,或阻止同时使用(通过多辆汽车)公共资源(交叉路口的象限)。

这至少提供了这些定义背后的想法,同时访问共享资源 可能的想法是错误的,并且互斥可以解决这个问题。在此建立之后,您需要将这些映射到更合适的比喻,以显示竞争条件是什么以及它是如何由于缺乏对公共资源的互斥而导致的不良事件之一。

需要更长的时间,但在深入了解更为复杂的比喻之前,它会对术语和大局有所了解。

向利益相关者谈论资金可能会让他们陷入恐慌模式,特别是如果他们认为他们因此而失去了实际资金,如果这个问题并没有特别导致净利润的损失,那么这不是完全理想的,所以这里是一个关于如何向任何人解释竞争条件的财务导向故事。

这个故事并没有解决僵局的概念,而是更传统的种族情况和后果。

故事在这里开始:

设置:铁路网有3个城市连接。列车上没有任何迹象表明他们来自哪个城市以及他们要前往哪个城市,因为他们在所有3个城市之间使用,而且铁路网不想处理所有改变标志的麻烦时间。由于网络很小,火车到达和离开时没有具体的时间表。当火车离开时,监督员只是接到其他城市站监督员的电话,监督员记录离开的时间,因为所有列车都是相同型号,他们以相同的速度行驶,所以当监督员收到时来自其他城市的电话,他们向车站的人们宣布:<!>“下一列火车将驶向C市!”。因此,希望前往C市的人们等待火车,继续前行并愉快地乘车前往C市。

问题:但是有一天,当一列火车正在计划从A到B到C的路线时,它在A和B之间中途发生故障。幸运的是,技术人员非常熟练并且愿意能够在短时间内修理火车。然而同一天,另一列火车也计划从C到B到A的不同路线.B站的监督员接到A的电话,火车即将到来,不久之后接到C的另一个电话,另一列火车也来了。然后车站监督员向在车站等候的乘客宣布:<!>“抵达的第一列火车将驶向C站,此后不久火车将驶向A站。<!>当乘客收集行李并前往各自的平台时。监督员看到一列火车驶来,并将铁轨重定向到人们计划前往C市的平台。他们很少知道火车实际上是去了A市。另一列火车在解决了“机械问题”之后也到达了车站,监督人员愉快地将它引导到包含希望前往城市A的乘客的平台上。不用说,没有一个乘客到达他们计划的地方,所有这些都是因为监督员认为他们会像往常一样按顺序到达。

竞争条件和许多计算机科学结构的问题是人们不是计算机。每当我向学生解释一个算法时,他们会说<!>“;但是这样做是没有意义的<!>”,我回复<!>“;计算机没有常识,他们所有的都是指示<!>“;除此之外,你应该将种族条件解释为种族,如果可以的话,让人们真正尝试种族是最有意义的。这样他们就能看出问题出在哪里。但是......他们不允许使用常识。

所以让我们假设我们有一个游戏,其中2人填满了红色,橙色,黄色的彩色块。它们有许多红色,橙色和黄色块。所有堆栈需要正好高三个块。

在第一个游戏中,两者都尽可能快地尝试这样做,但它们只能在自己的堆栈上工作。

在第二个游戏中,他们尝试通过允许自己在彼此的堆栈上堆叠块来协同工作。但是,他们不允许更改他们手中的块,并且他们必须放置一个计划的块。

你可以想象在堆栈1中发生这样的情况:

player 1 grabs a red block
player 1 places red block         - player 2 grabs an orange block
player 1 grabs an orange block    - player 2 places an orange block
player 1 places an orange block

所以现在我们有一个带有两个橙色块的堆栈。很明显,通过人类游戏,这种情况永远不会发生,因为人们有常识:他们看到已经放置了橙色块,并且还决定放置橙色块。

此外,您还可以向他们展示此视频: https://www.youtube.com/watch? v = TcGwNdbsAbc

让我们使用白板来完成一项简单的会计任务。我们手头有100美元 - 把它写在白板上。

爱丽丝有几十张发票,总计100美元,所以她要注意100美元,然后加上她的名单,然后在5分钟内回来并在董事会写200美元。

鲍勃一直在购物。他将从白板上取下这个数字然后减去价值50美元的购买量,然后他将在董事会上写下50美元。

如果Bob先回来,我会在Alice写完她的结果后看到$ 200。如果Alice先回来,我们会看到50美元,也是错的。我们想要看到的是150美元,我们需要在某处添加一些预防措施来实现这一目标。

这应足以支持以合理的直觉讨论技术解决方案。

例如,互斥锁意味着您将门锁在房间内,并将白板放入其中,然后让它们在那里进行工作。一个乐观的解决方案意味着如果数字在他们离开时更改,他们会让他们检查并重新开始。如果你想谈论死锁,你可以笑一下鲍勃在锁着的房间里打电话给爱丽丝,让她快点。

将它们发送到维基百科上的竞争条件

第一部分会有所帮助,其余部分(下面未显示)会让你看起来很聪明,因为他们会认为你理解它。

<!>“竞争条件或种族危险是系统或过程中的缺陷,其中过程的输出和/或结果出乎意料地且严重地取决于其他事件的顺序或时间。该术语起源于两个信号相互竞争以首先影响输出的想法。<!>

我认为要解决的关键点是它最常见的时间问题是不可预测的,因为时间的变化会不时发生。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top