进程间协同:从进程启动、同步与互斥到进程间通信
进程间协同的目的
在操作系统中,进程是计算机进行任务分配和调度的基本单位。在计算机系统中,有很多任务是无法由单个进程独立完成的,需要多个进程共同参与并协作完成。这就像在现实生活中,有些工作需要一个团队来完成,而不是一个人。
具体来说,进程间协同的主要目的有以下几个:
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…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...