进程间协同:从进程启动、同步与互斥到进程间通信
进程间协同的目的
在操作系统中,进程是计算机进行任务分配和调度的基本单位。在计算机系统中,有很多任务是无法由单个进程独立完成的,需要多个进程共同参与并协作完成。这就像在现实生活中,有些工作需要一个团队来完成,而不是一个人。
具体来说,进程间协同的主要目的有以下几个:
1、提高资源的使用效率。
多个进程共享系统资源,提高资源的利用率。例如,多个进程可以共享内存、磁盘等资源。
多个进程并行处理任务,提高系统的性能。例如,一个进程在等待I/O操作完成时,其他进程可以继续执行计算任务。
2、提高可靠性。
通过进程间的协同,可以实现故障恢复和故障转移,提高系统的可靠性。例如,对于负载均衡软件,当后端的某个计算机进程出现故障时,负载均衡软件可以将请求转发到承担相同任务的其他计算机进程上,保证服务的连续性。
3、实现复杂功能。
通过进程间的协同,可以实现一些复杂的功能。例如,在Nginx中,一个"master"进程负责管理多个"worker"进程,每个"worker"进程可以处理多个并发连接。
启动进程的协同
为了更好的理解进程间协同,我们的探讨需要先从进程的启动开始。
目前有两种启动进程的方法。
一种是创建子进程。创建子进程就像是请自己的孩子帮忙,我们可以直接控制和管理子进程。
另一种是使用命令执行。使用命令执行就像是打电话叫别人来帮忙,我们可以调用系统中的任何可执行程序。
在不同的操作系统中,启动进程有不同的实现方式。
在Unix和Linux系统中,通常会组合使用fork和exec来启动一个新的程序。首先使用fork创建一个新的进程,然后在新的进程中使用exec加载新的程序。这样,新的程序可以在自己的进程中独立运行,不会影响到原来的进程。
在Windows中,如果你需要精细控制新进程的行为,或者需要获取新进程的详细信息(如进程ID、句柄等),你应该使用CreateProcess函数。如果你只是想简单地运行一个应用程序或打开一个文件,而不需要太多的控制选项,你可以使用ShellExecute函数。
在iOS中,我们使用URL Scheme来启动进程,这种方法比较独特。URL Scheme就像一个http链接,不过它是一种特殊的URL。当一个应用请求打开一个URL Scheme时,操作系统会检查这个URL Scheme是否被其他应用注册。如果被注册,那么操作系统会启动对应的应用,并将URL的参数传递给这个应用。之所以这样设计,是因为iOS更注重安全,每个应用都运行在自己的沙箱(sandbox)环境中,它们之间是相互隔离的,这样可以保证应用的安全性,防止恶意应用访问其他应用的数据。
同步与互斥
在多进程环境中,同步与互斥是非常重要的概念。同步是指多个进程在执行过程中,为了保证数据的一致性,需要各个进程按照某种顺序执行。而互斥则是指某一资源在某一时间内只能被一个进程访问。
Mutex
Mutex是一种常用的互斥手段。
Mutex的工作原理是,当一个进程需要访问某个资源时,首先尝试获取Mutex,如果Mutex已经被其他进程获取,则该进程需要等待;如果Mutex没有被其他进程获取,则该进程可以获取Mutex并访问资源。当该进程访问完资源后,需要释放Mutex,以便其他进程可以获取Mutex并访问资源。
这就像是一个房间(共享资源)只能有一个人(进程)在里面,其他人必须等待,当这个人离开后,其他人才能进去。
在Windows系统中,互斥通过Name实现。每个互斥对象都有一个唯一的名称,通过这个名称,不同的进程可以访问到同一个互斥对象。当一个进程需要访问一个共享资源时,它首先需要通过操作系统内核请求获得互斥对象。如果互斥对象当前没有被其他进程拥有,那么这个进程就会获得互斥对象,并可以访问共享资源。如果互斥对象已经被其他进程拥有,那么这个进程就需要等待,直到互斥对象被释放。
在Linux系统中,则是直接通过共享内存实现。不同的进程可以通过映射同一段共享内存来实现通信。互斥对象可以存储在这段共享内存中,通过修改和检查互斥对象的状态,不同的进程可以协调对共享资源的访问。这种方式比较复杂,但是效率较高,因为进程之间不需要通过操作系统来传递消息。
在iOS系统中,通过Path实现。这主要是因为iOS系统对应用的沙盒限制,不同的应用无法直接共享内存,所以需要使用文件系统作为中介。当一个应用需要访问一个共享资源时,它会在文件系统中创建一个锁文件,这个锁文件的路径就代表了互斥对象。其他的应用在访问共享资源之前,需要检查这个锁文件是否存在,如果存在就需要等待,直到锁文件被删除。
Semaphore
Semaphore是另一种实现进程间同步的手段,它主要通过PV操作来实现。
Semaphore的工作原理是,Semaphore内部维护一个计数器,当一个进程需要访问某个资源时,首先执行P操作,如果计数器的值大于0,则计数器的值减1,该进程可以访问资源;如果计数器的值等于0,则该进程需要等待。当该进程访问完资源后,执行V操作,计数器的值加1。
注意同步与互斥的概念并非割裂的,无论是mutex还是semaphore,都可以实现同步与互斥的效果。
通信
在进程间协同中,通信是非常重要的一环。进程间的通信主要通过资源共享、管道和消息等方式实现。
资源共享
资源共享是一种简单有效的进程间通信方式,主要包括文件共享、剪贴板共享等。
例如,两个进程可以通过读写同一个文件来交换数据;或者,一个进程可以把数据放到剪贴板中,另一个进程则可以从剪贴板中取出数据。
管道
管道是一种特殊的文件,主要用于进程间的数据传输。根据是否有名字,管道分为匿名管道和命名管道。
匿名管道
匿名管道主要用于父子进程之间的通信,它基于内核缓存(文件描述符),生命周期随创建进程,是一种阻塞式的通信方式。
命名管道
命名管道可以用于任意进程间的通信,它基于文件(数据在内存),生命周期随操作系统或者引用为0就会自动被关闭,是一种非阻塞的通信方式。
共享内存
共享内存是一种将两个进程的内存页关联到同一个文件句柄的通信方式。它是一种高效的通信方式,因为两个进程可以直接访问同一块内存,无需进行数据复制。
这就像是两个人共享一个笔记本,都可以在上面写东西。这种设计的初衷是提高数据访问的效率,但需要处理好同步和互斥问题,避免数据混乱。
消息
消息是一种常见的进程间通信方式,主要包括网络套接字和UNIX域。这些设计的初衷是提供一种跨网络的进程间通信方式,满足分布式计算的需求。
网络套接字是一种可以跨网络进行通信的方式,它可以让不同的机器上的进程进行通信,开发人员经常谈到的TCP、UDP,以及更上层的Http、FTP等,都是这种方式。
UNIX域则是一种在同一台机器上的进程进行通信的方式。这是一种高效的进程间通信(IPC)方式,因为所有的通信都在同一台主机上进行,没有网络延迟和协议开销。
设计启示
在设计系统时,我们要努力找到系统的稳定点和变化点,这样才能让程序适应各种变化,拥有更强的生命力。
在进程协同领域,进程间的协同机制或实现方式是不稳定的,进程之间的通信设计稳定点在契约。例如,WCF是一个进程间通信的优秀框架,它基于契约,支持多种通信方式。
在实际的编程中,我们应该尽可能地选择稳定、成熟的通信机制,避免因为机制的改变而导致的代码修改。同时,我们也需要清楚地了解每种通信方式的优缺点,以便在不同的场景下选择最适合的通信方式。
总的来说,进程间的协同是计算机系统中一个非常重要的概念,它涉及到进程的启动、同步与互斥、通信等多个方面。通过对这些概念的理解,我们可以更好地理解和掌握计算机系统的运行机制,从而更好地进行编程和系统设计。
关注萤火架构,提升技术不迷路!
相关文章:

进程间协同:从进程启动、同步与互斥到进程间通信
进程间协同的目的 在操作系统中,进程是计算机进行任务分配和调度的基本单位。在计算机系统中,有很多任务是无法由单个进程独立完成的,需要多个进程共同参与并协作完成。这就像在现实生活中,有些工作需要一个团队来完成࿰…...

【驱动】TI AM437x(内核调试-06):网卡(PHY和MAC)、七层OSI
1、网络基础知识 1.1 七层OSI 第一层:物理层。 1)需求: 两个电脑之间如何进行通信? 具体就是一台发比特流,另一台能够收到。于是就有了物理层:主要是定义设备标准,如网线的额接口类型、管线的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流,就是从1/0…...

Java基础面试题 Object
Java基础面试题 Object 文章目录 Java基础面试题 ObjectObjectObject 类的常见方法有哪些? 和 equals() 的区别hashCode() 有什么用?为什么要有 hashCode?为什么重写 equals() 时必须重写 hashCode() 方法? 文章来自Java Guide 用…...

5G_射频测试_接收机测量(五)
7.2 Reference sensitivity level 接收灵敏度是表示接收机能解析出信号的最小功率(和接收机noise figure相关所以RX lineup的大部分工作就是在调整Gain达到最佳NF)The throughput shall be ≥ 95%(BER:bit error rate 并不是L3ca…...

ESP32-HTTP_webServer库(Arduino)
ESP32-HTTP 介绍 ESP32是一款功能强大的微控制器,具有丰富的网络和通信功能。其中之一就是支持HTTP协议,这使得ESP32可以用于创建Web服务器。 HTTP是什么? HTTP(Hyper Text Transfer Protocol),即超文本传…...

无法找到mfc100.dll的解决方法分享,如何快速修复mfc100.dll文件
在日常使用电脑时,我们可能会碰到一些系统错误提示,比如“无法找到mfc100.dll”的信息。这种错误通常会阻碍代码的执行或某些应用程序的启动。为了帮助您解决这一问题,本文将深入探讨其成因,并提供几种不同的mfc100.dll解决方案。…...

[VulnHub靶机渗透]:billu_b0x 快速通关
🍬 博主介绍👨🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步…...

Docker安装开源Blog(Typecho)
前言 首先这个镜像是centos7.9进行安装PHP环境,然后挂载目录去运行的,镜像大概300MB左右,没学过PHP,没办法给Dockerfile文件 参考文章:Docker安装Typecho | D-y Blog感知不强,图一乐https://www.wlul.top…...

【Qt-license】误操作qt下载导致只能安装商业版试用十天,无法安装社区版
背景: 原本是为了学习qml,需要下载一个design studio,而这个需要比较新版的安装程序,但新版的安装程序官方都是online安装。于是从官网找下载链接。毕竟是英文的,又心急,误打误撞中我选择了商业版试用。 其…...

数据操作——缺失值处理
缺失值处理 缺失值的处理思路 如果想探究如何处理无效值, 首先要知道无效值从哪来, 从而分析可能产生的无效值有哪些类型, 在分别去看如何处理无效值 什么是缺失值 一个值本身的含义是这个值不存在则称之为缺失值, 也就是说这个值本身代表着缺失, 或者这个值本身无意义, 比如…...

【刷题笔记4】
动态规划题目汇总 斐波那契数列:1,1,2,3,5,8,13…… 递归一把解决三类问题:1.数据定义是按照递归的(斐波那契数列)。2.问题解法是按递归算法实现的。 3.数据…...

cuda二进制文件中到底有些什么
大家好。今天我们来讨论一下,相比gcc编译器编译的二进制elf文件,包含有 cuda kernel 的源文件编译出来的 elf 文件有什么不同呢? 之前研究过一点 tvm。从 BYOC 的框架中可以得知,前端将模型 partition 成 host 和 accel(accel 表…...

怎么从视频中提取动图?一个方法快速提取gif
视频以连续的方式播放一系列图像帧,通过每秒播放的帧数(帧率)来创做,由于GIF动图则以循环播放一系列静态图像帧的方式展现动画效果。由于视频的优势在于流畅的动画、丰富的细节和长时间播放,因此常用于电影、电视节目、…...

String字符串的比较和hash函数减少哈希冲突
1.为什么比较字符串通过hash值比通过字符串本身效率更高 比较两个字符串的哈希值相对于比较两个字符串本身的效率更高,原因如下: 哈希函数具有快速计算的特性:哈希函数可以将一个字符串转换为一个固定长度的哈希值。这个转换过程通常是非常…...

【数据库原理】(38)数据仓库
数据仓库(Data Warehouse, DW)是为了满足企业决策分析需求而设计的数据环境,它与传统数据库有明显的不同。 一.数据库仓库概述 定义: 数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持企业管理和…...

C++17新特性(四)已有标准库的拓展和修改
这一部分介绍C17对已有标准库组件的拓展和修改。 1. 类型特征拓展 1.1 类型特征后缀_v 自从C17起,对所有返回值的类型特征使用后缀_v,例如: std::is_const_v<T>; // C17 std::is_const<T>::value; // C11这适用于所有返回值的…...

软件是什么?前端,后端,数据库
软件是什么? 由于很多东西没有实际接触,很难理解,对于软件的定义也是各种各样。但是我还是不理解,软件开发中的前端,后端,数据库到底有什么关系呢! 这个问题足足困扰了三年半,练习时…...

Vue3+ElementUI 多选框中复选框和名字点击方法效果分离
现在的需求为 比如我点击了Option A ,触发点击Option A的方法,并且复选框不会取消勾选,分离的方法。 <el-checkbox-group v-model"mapWork.model_checkArray.value"> <div class"naipTypeDom" v-for"item …...

设计模式篇章(4)——十一种行为型模式
这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务,这个与结构型模式有点像,结构型可以理解为静态的组合,例如将不同的组件拼起来成为一个更大的组件;而行为型更是一种动态或者具有某个…...

Spring成长之路—Spring MVC
在分享SpringMVC之前,我们先对MVC有个基本的了解。MVC(Model-View-Controller)指的是一种软件思想,它将软件分为三层:模型层、视图层、控制层 模型层即Model:负责处理具体的业务和封装实体类,我们所知的service层、poj…...

架构篇05-复杂度来源:高可用
文章目录 计算高可用存储高可用高可用状态决策小结 今天,我们聊聊复杂度的第二个来源高可用。 参考维基百科,先来看看高可用的定义。 系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。 这个定义…...

C#调用Newtonsoft.Json将bool序列化为int
使用Newtonsoft.Json将数据对象序列化为Json字符串时,如果有布尔类型的属性值时,一般会将bool类型序列化为字符串,true值序列化为true,false值序列化为false。如下面的类型序列化后的结果如下: public class UserInfo…...

【Linux系统编程】环境变量详解
文章目录 1. 环境变量的基本概念2. 如何理解呢?(测试PATH)2.1 切入点1查看具体的环境变量原因剖析常见环境变量 2.2 切入点2给PATH环境变量添加新路径将我们自己的命令拷贝到PATH已有路径里面 2.3 切入点3 3. 显示所有环境变量4. 测试HOME5. …...

智能合约介绍
莫道儒冠误此生,从来诗书不负人 目录 一、什么是区块链智能合约? 二、智能合约的发展背景 三、智能合约的优势 四、智能合约的劣势 五、一些关于智能合约的应用 总结 一、什么是区块链智能合约? 智能合约,是一段写在区块链上的代码,一…...

Python自动化实战之接口请求的实现
在前文说过,如果想要更好的做接口测试,我们要利用自己的代码基础与代码优势,所以该章节不会再介绍商业化的、通用的接口测试工具,重点介绍如何通过 python 编码来实现我们的接口测试以及通过 Pycharm 的实际应用编写一个简单接口测…...

react和vue的区别
一、核心思想不同 Vue的核心思想是尽可能的降低前端开发的门槛,是一个灵活易用的渐进式双向绑定的MVVM框架。 React的核心思想是声明式渲染和组件化、单向数据流,React既不属于MVC也不属于MVVM架构。 如何理解React的单向数据流? React的单…...

Spring 中有哪些方式可以把 Bean 注入到 IOC 容器?
目录 1、xml方式2、CompontScan Component3、使用 Bean方式4、使用Import 注解5、FactoryBean 工厂 bean6、使用 ImportBeanDefinitionRegistrar 向容器中注入Bean7、实现 ImportSelector 接口 1、xml方式 使用 xml 的方式来声明 Bean 的定义,Spring 容器在启动的…...

客户需求,就是项目管理中最难管的事情
对于需求控制和管理 个人的观点是:首先要向客户传递开发流程,第二必须制作原型,需求确认时确认的是原型,而不是需求文档,第三,开发阶段要快速迭代,与客户互动。管人方面我想对于项目经理来讲&am…...

条款28:避免返回 handles 指向对象的内部成分
创建一个矩形的类(Rectangle),为保持Rectangle对象较小,可以只在其对象中保存一个指针,用于指向辅助的结构体,定义其范围的点数据存放在辅助的结构体中: class Point { // 表示点的类 public:P…...

【人工智能】之深入理解 AI Agent:超越代码的智能助手(2)
人工智能(AI)正在以前所未有的速度迅猛发展,而AI Agent(智能代理)则是这一领域中备受瞩目的一环。AI Agent 不仅仅是程序的执行者,更是能够感知、学习和交互的智能实体。本文将深入探讨什么是 AI Agent&…...