进程间通信
进程间通信
-
每个进程的用户空间都是独立的,一般不能相互访问,但是又有许多情况需要进程间进行相互通信来完成系统的某项功能。进程间通信依靠内核空间来完成
-
进程间通信的方法主要有:
- 管道
- 信号量
- 消息队列
- 信号
- 共享内存
- 套接字
管道
-
半双工、只能用于相关进程间通信,比如父进程与子进程的通信
-
pipe为无名管道,通过pipe()函数调用创建并打开,当最后一个使用它的线程关闭对它的引用时,pipe自动撤销
-
fifo叫做命名管道,可以通过mkfifio创建,创建后,任何线程都可以通过文件名将其打开和进行读写
-
管道的实质是一块内存缓冲区,进程以先进先出的方式从缓冲区存取数据:管道一段的进程顺序的将进程数据写入缓冲区,另一端进程则顺序的读取数据,可以看成一个循环队列,且数据只能被读取一次,当空的缓存区有新数据写入时,会唤醒读取的线程
信号量
信号量(semaphore)是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
1、特点
信号量用于进程间同步,若要在进程间传递数据,需要结合共享内存。
信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
消息队列
消息队列,就是一个消息的链表,是一系列保存在内核中消息的列表。用户进程可以向消息队列添加消息,也可以向消息队列读取消息。
消息队列与管道通信相比,其优势是对每个消息指定特定的消息类型,接收的时候不需要按照队列次序,而是可以根据自定义条件接收特定类型的消息。
可以把消息看做一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程可以从消息队列中读取消息。
共享内存
共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取错做读出,从而实现了进程间的通信。
采用共享内存进行通信的一个主要好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝,对于像管道和消息队里等通信方式,则需要再内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次:一次从输入文件到共享内存区,另一次从共享内存到输出文件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了