进程间协同:从进程启动、同步与互斥到进程间通信

进程间协同的目的

在操作系统中,进程是计算机进行任务分配和调度的基本单位。在计算机系统中,有很多任务是无法由单个进程独立完成的,需要多个进程共同参与并协作完成。这就像在现实生活中,有些工作需要一个团队来完成,而不是一个人。

具体来说,进程间协同的主要目的有以下几个:

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是一个进程间通信的优秀框架,它基于契约,支持多种通信方式。

在实际的编程中,我们应该尽可能地选择稳定、成熟的通信机制,避免因为机制的改变而导致的代码修改。同时,我们也需要清楚地了解每种通信方式的优缺点,以便在不同的场景下选择最适合的通信方式。


总的来说,进程间的协同是计算机系统中一个非常重要的概念,它涉及到进程的启动、同步与互斥、通信等多个方面。通过对这些概念的理解,我们可以更好地理解和掌握计算机系统的运行机制,从而更好地进行编程和系统设计。

关注萤火架构,提升技术不迷路!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 组件通信方式

✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…

三、MySQL库表操作

3.1 SQL语句基础(SQL命令) 3.1.1 SQL简介 SQL:结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作,数据检索以及数据维护的标准化语言。使用SQL语句,程序员和数据库管理员可以完成…

关于C语言整型提升的讲解

目录 1.什么是整型提升 2.整型提升的意义 3.整型提升是怎么提升的 4.整型提升的实例 1.什么是整型提升 C语言中的整型算术运算总是以缺省(默认)整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前会被转换…

Android学习之路(22) 从模块化到组件化

从模块化到组件化 一、从模块化到组件化 Android 应用项目 , 都存在一个应用模块 ( Application Module ) , 在 build.gradle 构建脚本中 , 第一个插件配置 com.android.application , 表明 该 Module 编译打包后的输出是 APK 安装包 ; 该项目可以直接运行 ; plugins {id co…

回溯法:澳大利亚地图染色问题及伪代码(模版)

问题背景 澳大利亚地图染色问题: 用红绿蓝3色标出各省, 相邻者颜色不同。 对应于澳大利亚地图的约束图, 相互关联的节点用边连接。 − 西澳大利亚 – WA − 北领地 – NT − 南澳大利亚 – SA − 昆士兰 – Q − 新南威尔士 – NSW − …

79、avx2 向量指令集优化卷积运算

上一节 介绍了 avx2 向量指令集中的 load/store 操作,本节介绍如何使用 avx2 的向量指令集来实现乘累加运算。 因为我们实战中用到的 resnet50 神经网络中,卷积运算在整个模型中的比例占据是相当高,而卷积运算的核心计算就是乘累加计算。因此,只要将最核心的乘累加计算效率…

Shiro框架:Shiro用户访问控制鉴权流程-Aop注解方式源码解析

目录 1.Spring Aop嵌入点解析 2.Shiro框架Aop切面逻辑解析 2.1 通过注解实现切点 2.2 通过增强逻辑执行校验过程 2.2.1 增强实现类AopAllianceAnnotationsAuthorizingMethodInterceptor 2.2.1.1 类图解析 2.2.1.2 实现增强方法 2.2.1.3 Shiro校验逻辑实现 2.2.1.3.1 …

JVM篇--垃圾回收器高频面试题

1 你知道哪几种垃圾收集器,各自的优缺点是啥,重点讲下cms和G1,包括原理,流程,优缺点? 1)首先简单介绍下 有以下这些垃圾回收器 Serial收集器: 单线程的收集器,收集垃圾时…

Flink(十四)【Flink SQL(中)查询】

前言 接着上次写剩下的查询继续学习。 Flink SQL 查询 环境准备: # 1. 先启动 hadoop myhadoop start # 2. 不需要启动 flink 只启动yarn-session即可 /opt/module/flink-1.17.0/bin/yarn-session.sh -d # 3. 启动 flink sql 的环境 sql-client ./sql-client.sh …

Tomcat Notes: Web Security

This is a personal study notes of Apache Tomcat. Below are main reference material. - YouTube Apache Tomcat Full Tutorial,owed by Alpha Brains Courses. https://www.youtube.com/watch?vrElJIPRw5iM&t801s 1、Overview2、Two Levels Of Web Securi…

深入Matplotlib:画布分区与高级图形展示【第33篇—python:Matplotlib】

文章目录 Matplotlib画布分区技术详解引言方法一:plt.subplot()方法二:简略写法方法三:plt.subplots()实例展示添加更多元素 进一步探索Matplotlib画布分区自定义子图布局3D子图结语 Matplotlib画布分区技术详解 引言 Matplotlib是一个强大…

1.6万字全面掌握 BERT:自然语言处理(NLP)从初学到高级的全面指南

BERT(双向编码器表示来自Transformer的模型)是由Google开发的一种革命性的自然语言处理(NLP)模型。它改变了语言理解任务的格局,使机器能够理解语言中的上下文和细微差异。 在本博客中,我们将带您从 BERT …

动态路由协议 - OSPF 基本配置 详解 (反掩码,宣告,三张表,Cost默认值修改 )

目录 预备工作 : 基础配置 : 先启动 OSPF 的进程 : 创建区域 : 宣告 : 查看三张表 邻居表 : 数据库表 : 路由表 : 以下示拓扑为 OSPF 示范 : 第一步…

基于python卷积网络对漫画人物好坏识别-含数据集和代码

数据集介绍,下载本资源后,界面如下: 有一个文件夹一个是存放数据集的文件。 数据集介绍: 一共含有:2个类别,包含:evil, good等。 然后本地的train.txt和val.txt里面存放的是数据集的图片路径和对应的标签。 运行trai…

linux驱动(八):block,net

本文主要探讨210的block驱动和net驱动。 block 随机存取设备且读写是按块进行,缓冲区用于暂存数据,达条件后一次性写入设备或读到缓冲区 块设备与字符设备:同一设备支持块和字符访问策略,块设备驱动层支持缓冲区,字符设备驱动层没有缓冲 块设备单位:扇…

基于python深度学习的颜色识别-含数据集和代码

数据集介绍,下载本资源后,界面如下: 有一个文件夹一个是存放数据集的文件。 数据集介绍: 一共含有:10个类别,包含:black, blue, brown, green, grey, orange, red, violet, white, yellow等。 然后本地的train.txt和…

什么是游戏盾?哪家效果好。

游戏盾是什么呢,很多做游戏开发的客户估计都是听说过的,但是也不是所有的游戏开发者会运用到。因为,游戏盾是针对游戏行业APP业务所推出的高度可定制的网络安全管理解决方案,除了能针对大型DDoS攻击(T级别)进行有效防御外&#xf…

腾讯云com域名注册怎么收费?

腾讯云com域名首年价格,企业新用户注册com域名首年1元,个人新用户注册com域名33元首年,非新用户注册com域名首年元85元一年,优惠价75元一年,com域名续费85元一年。腾讯云百科txybk.com分享腾讯云com域名注册优惠价格&a…

3.postman动态参数、文件上传及断言

一、postman内置动态参数以及自定义的动态参数 postman内置动态参数: {{$timestamp}} 生成当前时间的时间戳 {{$randomint}} 生成0-1000之间的随机数 {{$guid}} 生成随机guid字符串 自定义动态参数: 在请求中pre-req页面下 //手动的获得时间戳 var…

关于索引的最常见的十道面试题

面试题一:索引底层如何实现的? MySQL索引的底层实现是取决于存储引擎的,但是是大部分存储引擎底层都是通过B树实现的,以默认的存储InnoDB为例,底层就是通过B树实现的,如下图所示: B树是一种自平…