竞争条件(race condition)

2023-11-13

在一些操作系统中,协作的进程可能共享一些彼此都能读写的公用存储区。这个公用存储区可能在内存中(可能是在内核数据结构中),也可能是一个共享文件。这里共享存储区的位置并不影响通信的本质及其带来的问题。为了理解实际中进程间通信如何工作,我们考虑一个简单但很普遍的例子:一个假脱机打印程序。当一个进程需要打印一个文件时,它将文件名放在一个特殊的假脱机目录 (spooler directory)下。另一个进程(打印机守护进程)则周期性地检查是否有文件需要打印,若有就打印并将该文件名从目录下删掉。

设想假脱机目录中有许多槽位,编号依次为0,1,2,…,每个槽位存放一个文件名。同时假设有两个共享变量:out,指向下一个要打印的文件;in,指向目录中下一个空闲槽位。可以把这两个变量保存在一个所有进程都能访问的文件中,该文件的长度为两个字。在某一时刻,0号至3号槽位空(其中的文件已经打印完毕),4号至6号槽位被占用(其中存有排好队列的要打印的文件名)。几乎在同一时刻,进程A和进程B都决定将一个文件排队打印,这种情况如图2-21所示。

在Murphy法则(任何可能出错的地方终将出错)生效时,可能发生以下的情况。进程A读到in的值为7,将7存在一个局部变量next_free_slot中。此时发生一次时钟中断,CPU认为进程A已运行了足够长的时间,决定切换到进程B。进程B也读取in,同样得到值为7,于是将7存在B的局部变量next_free_slot中。在这一时刻两个进程都认为下一个可用槽位是7。

进程B现在继续运行,它将其文件名存在槽位7中并将in的值更新为8。然后它离开,继续执行其他操作。

最后进程A接着从上次中断的地方再次运行。它检查变量next_free_slot,发现其值为7,于是将打印文件名存入7号槽位,这样就把进程B存在那里的文件名覆盖掉。然后它将next_free_slot加1,得到值为8,就将8存到in中。此时,假脱机目录内部是一致的,所以打印机守护进程发现不了任何错误,但进程B却永远得不到任何打印输出。类似这样的情况,即两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件(race condition)。调试包含有竞争条件的程序是一件很头痛的事。大多数的测试运行结果都很好,但在极少数情况下会发生一些无法解释的奇怪现象。

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

竞争条件(race condition) 的相关文章

  • Java设计模式-原型模式

    原型模式 在有些系统中 存在大量相同或相似对象的创建问题 如果用传统的构造函数来创建对象 会比较复杂且耗时耗资源 用原型模式生成对象就很高效 原型模式的定义与特点 原型 Prototype 模式的定义如下 用一个已经创建的实例作为原型 通过

随机推荐

  • 华为鸿蒙os什么时候发布,华为鸿蒙OS发布,支持上百款机型(附推送名单),你会升级吗?...

    昨天晚上 万众期待的华为鸿蒙OS正式发布 对于国产操作系统具有跨时代的意义 首批支持上百款机型升级 意味着鸿蒙OS诞生之初便形成Android iOS 鸿蒙OS鼎足而立之势 鸿蒙OS并非拷贝Android和iOS系统 尤其Android特性
  • Java并发编程原理与实战课程(叶子猿)

    前4节官网免费看 txt 05线程的状态以及各状态之间的转换详解 mp4 06线程的初始化 中断以及其源码讲解 mp4 07多种创建线程的方式案例演示 一 带返回值的方式 mp4 08多种创建线程的方式案例演示 二 使用线程池 mp4 09
  • Java设计模式——桥接模式

    文章目录 桥接模式 桥接模式 桥接模式就是把事物和其具体实现分开 使他们可以各自独立的变化 桥接的用意是 将抽象化与实现化解耦 使得二者可以独立变化 像我们常用的JDBC桥DriverManager一样 JDBC进行连接数据库的时候 在各个
  • 华为FusionCompute之个人学习环境虚拟化嵌套部署方案

    华为FusionCompute之个人学习环境虚拟化嵌套部署方案 一 环境介绍 1 本次实践背景 2 物理机配置介绍 3 FC虚拟化部署方案介绍 4 虚拟化环境介绍 5 本次实践目的 二 检查本地环境 1 检查虚拟化环境 2 FC部署进度介绍
  • 软考-系统架构师-计算机与网络基础知识-系统性能

    文章目录 1 性能指标 2 性能计算 3 性能设计 4 性能评估 说明 系统性能是一个系统提供给用户的中国性能指标的集合 它包括硬件性能 软件性能 部件性能指标 综合性能指标 1 性能指标 性能指标是软 硬件的性能指标的集成 在硬件中包括计
  • EMC测试的那些项目,你都知道么?

    转载 EMC电磁兼容 2022 03 27 08 30 EMC检测 电磁兼容性检测 的全称是Electro Magnetic Compatibility 其定义为 设备和系统在其电磁环境中能正常工作且不对环境中任何事物构成不能承受的电磁骚扰
  • gethostbyname()函数详解

    基本概念 gethostbyname 函数主要作用 用域名或者主机名获取地址 操作系统提供的库函数 以下的讨论基于linux环境 域名系统 Domain Name System DNS 主要用于主机名字与IP地址之间的映射 每个组织机构往往
  • 【NLP】1、BERT

    文章目录 一 背景 二 方法 论文 BERT Pre training of Deep Bidirectional Transformers for Language Understanding 出处 Google 一 背景 在 BERT
  • flutter图片点击跳转_flutter页面跳转 Route 使用汇总

    一 push方式直接跳转 普通跳转 Navigator push context MaterialPageRoute builder BuildContext context gt Page1 复制代码 带参数跳转和接收参数 Navigat
  • Python习题四

    习题四 1 已知10个学生的成绩为68 75 32 99 78 45 88 72 83 78 请将成绩存放在列表中 请对其进行统计 输出优 100 89 良 89 80 中 79 60 差良 59 0 4个等级的人数 代码 运行 2 利用W
  • 代码质量管理工具:SonarQube常见的问题及正确解决方案

    SonarQube 简介 Sonar 是一个用于代码质量管理的开放平台 通过插件机制 Sonar 可以集成不同的测试工具 代码分析工具 以及持续集成工具 与持续集成工具 例如 Hudson Jenkins 等 不同 Sonar 并不是简单地
  • C#基于串行通讯不同计算机数据库之间数据交换系统(原创作品,送论文查重报告)

    论文编号 C 005 论文题目 基于串行通讯不同计算机数据库之间数据交换系统 开发语言 C 包括内容 论文 可执行程序 源码 答辩ppt 外文翻译 进度表 程序操作演示录像 数 据 库 SQL 论文字数 7000字以上
  • c++ 关于opencv 的基本操作

    读取影像 include
  • 没钱也能创业么?没钱怎样创业?

    一 先说结果不但并不是没钱就不能创业 反而是一切追求完美资本的人 无论有钱没钱 都能够且应当创业 二 界定问题我还在风投领域当上五六年兵线 眼界过上百个各式各样企业和创业者 项目投资总额度过亿人民币 也用掉过他人项目投资帮我的上百万用以创业
  • 组成最大数 华为机试

    题目描述 给定一组非负整数 重新排列它们的顺序使之组成一个最大的整数 示例 输入 10 2 输出 210 输入 3 30 34 5 9 输出 9534330 解题思路 回溯法 代码 package Huawei import java ut
  • Mysql分库分表实战(一)——一文搞懂Mysql数据库分库分表

    由于业务需要 需要对Mysql数据库进行分库分表 故而最近一直在整理分库分表的相关知识 现手上的工作也告一段落了 抽空将自己最近的学习结果转化为博文 分享给大家 本博文打算做成一个系列的 首先是分库分表的理论知识的了解 其次是基于Java编
  • 方差分析中怎么看有无显著性影响_一文带你轻松掌握,重复测量方差分析

    在某些实验研究中 常常需要考虑时间因素对实验的影响 当需要对同一观察单位在不同时间重复进行多次测量 每个样本的测量数据之间存在相关性 因而不能简单的使用方差分析进行研究 而需要使用重复测量方差分析 案例 当前有这样一项关于抑郁症的研究 共有
  • html中%20是什么意思?

    两个空格的话就是两个 20 转载于 https www cnblogs com linsx p 6943985 html
  • shell select用法

    select 是 Bash shell 中的一个命令 用于在终端中创建交互式菜单 select 语法格式如下 select varname in list do command1 command2 done 其中 varname 是一个变量
  • 竞争条件(race condition)

    在一些操作系统中 协作的进程可能共享一些彼此都能读写的公用存储区 这个公用存储区可能在内存中 可能是在内核数据结构中 也可能是一个共享文件 这里共享存储区的位置并不影响通信的本质及其带来的问题 为了理解实际中进程间通信如何工作 我们考虑一个