linux多线(进)程编程——(8)多进程的冲突问题

前言

随着时间的推移,共享内存已经在修真界已经沦为禁术。因为使用这种方式沟通的两人往往会陷入到走火入魔的状态,思维扭曲。进程君父子见到这种情况,连忙开始专研起来,终于它们发现了共享内存存在的问题:

进程间冲突

我们现在假设这样一种情况,有三个进程,它们使用共享内存完成通信。进程1向共享内存中写入一些数据,想让进程2读取这些数据。很不巧,由于缺乏管理,现在进程3也同时在向共享内存中写入数据。进程1与进程3的数据发生了相互冲突与相互覆盖,对于进程2来说,读取到了一些无意义的数据。如下图所示,这种相互冲突的问题是也是共享内存最大的局限性。如何解决不是我们这一节的重点,我们下一节再讨论,请大家继续向后看。
在这里插入图片描述
上面这种情况属于比较容易理解的范畴,下面这个就比较抽象了。
现在假设一种情况,我们在共享内存中定义了一个变量x,初始值为0,现在有两个进程,同时对这个变量进行加一操作,最后这个变量的值应该是多少?
既然我都这么问了,当然答案不可能是2,实际上,我们无法判断这个变量最终的值,它可能是1,也可能是2,可能每次运行结果都不同。这种反直觉的现象是什么原因造成的呢?接下来我带大家分析一下。
在c或者c++中,我们对一个变量x进行加一操作,无非一下两种手段,这里假设x已经被定义并且初始化为0

// 方案1
x = x + 1;// 方案2
x++;

大家在上面看到的是两条语句,因此可能想当然的认为这两条语句每条都是一次直接执行完毕。但是实际上,对于这两条语句中的任意一条语句,他的执行大概分为三步。我们先编写一段C语言代码。在这里为了模拟共享内存,我们在全局区定义x并初始化为0,模拟x在共享内存中的情况。

#include <stdio.h>int x = 0;int main() {x = x + 1;return 0;
}

我们将这段代码进行汇编,观察它的汇编代码,如下所示,根据#注释的内容我们可以看到,main.c文件的第六行的x=x+1;对应着三条汇编语句,它们分别是:(1)把变量x从内存中转移到CPU寄存器eax中,(2)在寄存器eax中对变量x加一,(3)把处理后的变量x从寄存器中放回到内存中。

main:
.LFB0:# 进入main函数后需要压栈
# main.c:6:     x = x + 1;movl	x(%rip), %eax	# x, x.0_1addl	$1, %eax	#, _2
# main.c:6:     x = x + 1;movl	%eax, x(%rip)	# _2, x
# main.c:7:     return 0;movl	$0, %eax	#, _5
# main.c:8: }# 即将离开main函数,需要出栈ret	.cfi_endproc

每一条汇编指令都是原子的,也就是不会被进程切换打断的。但是对于单核CPU在每两条汇编指令之间,都有可能会发生进程的切换。对于多核CPU,也可能会出现同时处理的情况,这会造成什么影响呢?我们用下面的图来表示:

小结

今天我们详细分析了共享内存可能存在的问题。虽然它的传输速度快,节约资源,但是如果不加以约束,一定会出现问题。
那么如何在共享内存中加入约束,让两个进程间互不干扰呢?这就是我们下一节要研究的问题:信号量。

结束语

进程君父子找到了共享内存存在的局限性,它们打算提供一个补救方案,方案定制中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络层IP协议知识大梳理

全是通俗易懂的讲解&#xff0c;如果你本节之前的知识都掌握清楚&#xff0c;那就速速来看我的IP协议笔记吧~ 自己写自己的八股&#xff01;让未来的自己看懂&#xff01; &#xff08;全文手敲&#xff0c;受益良多&#xff09; 网路基础3 网路层 TCP并没有把数据发到网路…

数据结构与算法学习导航

目录 指导思想资料总结代码随想录hello-algoOI-WIKI 一名麻瓜的刷leetcode的简单概述。 在这里对过去的自己说: 如果你相信算法有用你就刷刷leetcode&#xff0c;如果不相信面试会让你相信。 当然&#xff0c;现在我确实认为算法和数据结构有用&#xff0c;leetcode也有用。 …

【网络安全】谁入侵了我的调制解调器?(二)

文章目录 针对 TR-069 协议 REST API 的攻击思路攻击百万台调制解调器意外发现 Cox 后端 API 的授权绕过漏洞确认我们能够进入任何人的设备访问和更新任何Cox商业客户账户通过泄露的加密密钥覆盖任何人的设备设置执行对任何调制解调器的命令影响最后想说阅读本文前,请先行浏览…

大模型在急性单纯性阑尾炎预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究方法与创新点 二、急性单纯性阑尾炎概述 2.1 定义与发病机制 2.2 临床表现 2.3 传统诊断方法 三、大模型在急性单纯性阑尾炎预测中的应用 3.1 大模型简介 3.2 数据收集与处理 3.3 模型训练与优化 3.4 预测…

Linux 上安装和配置 VNC 远程桌面

在 Linux 上安装和配置 VNC&#xff08;Virtual Network Computing&#xff09;可以让你远程访问图形化桌面环境。以下是详细的安装和配置步骤&#xff0c;适用于主流 Linux 发行版&#xff08;如 Ubuntu、CentOS、Debian 等&#xff09;。 1. 安装 VNC 服务器 Ubuntu/Debian …

《AI大模型应知应会100篇》第22篇:系统提示词(System Prompt)设计与优化

第22篇&#xff1a;系统提示词(System Prompt)设计与优化 摘要 在大语言模型&#xff08;LLM&#xff09;应用中&#xff0c;系统提示词&#xff08;System Prompt&#xff09;是控制模型行为的核心工具之一。它不仅定义了模型的身份、角色和行为规范&#xff0c;还直接影响输…

其他网页正常进入,但是CSDN进入之后排版混乱

显示不正常&#xff0c;排版混乱 解决方法&#xff1a; ①打开网络设置 ②更改适配器 ③所连接的网络 --右键 属性 然后就可以正常访问了。

Qwen2.5-VL视觉大语言模型复现过程,没碰到什么坑

视频讲解&#xff1a;Qwen2.5-VL视觉大语言模型复现过程&#xff0c;没碰到什么坑_哔哩哔哩_bilibili Qwen2.5-VL视觉大语言模型复现过程&#xff0c;没碰到什么坑 今天复现下Qwen2.5-VL玩玩 https://github.com/QwenLM/Qwen2.5-VL 创建conda环境&#xff0c;实测22.04&#x…

宫庭海:跨界融合与家国情怀的影视开拓者

从音乐经纪人到影视多面手的创业之路 近日&#xff0c;国内娱乐产业领军人物、著名音乐经纪人、制片人、影视投资人宫庭海先生再次受到广泛关注。凭借其卓越的成就和贡献&#xff0c;宫庭海先生在业界树立了良好的口碑和广泛的影响力。 宫庭海&#xff0c; 辽宁省大连市人&…

LeetCode算法题(Go语言实现)_51

题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;两者长度都是 n &#xff0c;再给你一个正整数 k 。你必须从 nums1 中选一个长度为 k 的 子序列 对应的下标。 对于选择的下标 i0 &#xff0c;i1 &#xff0c;…&#xff0c; ik - 1 &#xff0c;你的 分数 …

并查集(力扣2316)

这种涉及不同连通分量的&#xff0c;看上去就可以用并查集。并查集的模板请参见上一篇内容。并查集&#xff08;力扣1971&#xff09;-CSDN博客 现在我们要求的是无法互相到达的点对。根据观察易得&#xff0c;我们只需要求出每个并查集的元素数量&#xff0c;然后遍历每个点&…

Python在生成艺术中的创新应用

Python在生成艺术中的创新应用 在数字艺术的浪潮中,Python以其强大的库支持和简洁的语法,成为了生成艺术领域的一颗璀璨明珠。今天,就让我们一起踏上这段充满创意与惊喜的旅程,探索Python如何在生成艺术中大放异彩。 一、引言 生成艺术,是一种通过算法自动生成艺术作品的…

ROS ROS2 机器人深度相机激光雷达多传感器标定工具箱入门教程(一)

系列文章目录 目录 系列文章目录 前言 一、安装 1.1 ROS 2 官方软件包 二、教程 2.1 标定配置器 2.1.1 机器人选项 2.1.2.1 外参相机-激光雷达标定 2.1.2.2 外参激光雷达-激光雷达标定 2.1.2.3 外参相机参照标定 2.1.2.4 外参激光雷达-参考标定 2.2 外参照相机-激…

Ubuntu利用docker搭建Java相关环境问题记录

Docker拉取镜像超时 报错 Unable to find image dpanel/dpanel:latest locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/ ": context deadline exceeded (Client.Timeout exceeded while awaiting headers)解决方式 在etc/do…

list的模拟实现和反向迭代器的底层

1&#xff1a;list的模拟实现 1&#xff1a;链表的节点 对于list的模拟实现&#xff0c;我们需要先定义一个节点的类可以使用&#xff08;class也可以使用struct&#xff09; // List的节点类 template<class T> struct ListNode {ListNode(const T& val T()){_p…

数据加载与保存

通用方式‌ SparkSQL提供了通用的数据加载方式&#xff0c;使用spark.read.loa方法&#xff0c;并可通过format指定数据类型&#xff08;如csv、jdbc、json、orc、parquet、textFile&#xff09;。 load方法后需传入数据路径&#xff08;针对csv、jdbc、json、orc、parquet、…

7 编译型语言、解释型语言与混合型语言的深度解析:以 C、Java、Python 为例

在编程领域&#xff0c;语言的执行方式是其设计哲学的核心体现&#xff0c;直接影响着性能、可移植性和开发效率。本文将深入剖析编译型语言&#xff08;以 C 语言为例&#xff09;、解释型语言&#xff08;以 Python 为例&#xff09;和混合型语言&#xff08;以 Java 为例&am…

Edge浏览器安卓版流畅度与广告拦截功能评测【不卡还净】

安卓设备上使用浏览器的体验&#xff0c;很大程度取决于两个方面。一个是滑动和页面切换时的反应速度&#xff0c;另一个是广告干扰的多少。Edge浏览器的安卓版本在这两方面的表现比较稳定&#xff0c;适合日常使用和内容浏览。 先看流畅度。Edge在中端和高端机型上启动速度快&…

智能云图库-12-DDD重构

本节重点​ 之前我们已经完成了本项目的功能开发。由于本项目功能丰富、代码量大&#xff0c;如果是在企业中维护开发的项目&#xff0c;传统的 MVC 架构可能会让后续的开发协作越来越困难。所以本节鱼皮要从 0 带大家学习一种新的架构设计模式 —— DDD 领域驱动设计。 大纲…

量子安全邮件系统 —— 邮件回溯密钥销毁机制

这里写目录标题 量子安全邮件系统 —— 邮件回溯密钥销毁机制一、项目背景与简介二、理论基础2.1 密钥销毁的重要性2.2 时间衰减与回溯销毁2.3 安全日志与报警机制三、系统架构设计3.1 模块划分3.2 系统架构图(Mermaid示意图)四、关键算法与实现流程4.1 密钥生成与存储4.2 邮…