进程通信的方式
管道、命名管道、信号、消息队列、共享内存、内存映射、信号量、Socket
- 管道:
- 也叫无名(匿名)管道,它是是 UNIX 系统 IPC(进程间通信)的最古老形式,所有的 UNIX 系统都支持这种通信机制。
- 管道本质其实是内核中维护的一块内存缓冲区,Linux 系统中通过 pipe() 函数创建管道,会生成两个文件描述符,分别对应管道的读端和写端。
- 无名管道只能用于具有亲缘关系的进程间的通信。
- 命名管道:
- 为了克服无名管道只能用于具有亲缘关系的进程间的通信这个缺点,提出了有名管道(FIFO),也叫命名管道、FIFO文件。
- 有名管道(FIFO)不同于匿名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,并且其打开方式与打开一个普通文件是一样的。
- 即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据。
- 信号:
- 信号是 Linux 进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。
- 信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。
- 消息队列:
- 消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级。
- 对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程则可以从消息队列中读走消息。
- 消息队列是随内核持续的。
- 共享内存:
- 共享内存允许两个或者多个进程共享物理内存的同一块区域(通常被称为段)。
- 由于一个共享内存段会称为一个进程用户空间的一部分,因此这种 IPC 机制无需内核介入。
- 一个进程将数据复制进共享内存中,这部分数据会对其他所有共享同一个段的进程可用。
- 与管道等要求发送进程将数据从用户空间的缓冲区复制进内核内存和接收进程将数据从内核内存复制进用户空间的缓冲区的做法相比,这种 IPC 技术的速度更快。
- 内存映射:
- 内存映射(Memory-mapped I/O)是将磁盘文件的数据映射到内存。
- 用户通过修改内存就能修改磁盘文件。
- 信号量:
- 信号量主要用来解决进程和线程间并发执行时的同步问题。
- 进程同步是并发进程为了完成共同任务采用某个条件来协调它们的活动。
- 对信号量的操作分为 P 操作和 V 操作,P 操作是将信号量的值减 1,V 操作是将信号量的值加 1。当信号量的值小于等于 0 之后,再进行 P 操作时,当前进程或线程会被阻塞,直到另一个进程或线程执行了 V 操作将信号量的值增加到大于 0 之时。
- Socket:
- 对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
- 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。
- 一般用于网络中不同主机上的进程之间的通信。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了