当前位置:网站首页>进程间六种通信方式
进程间六种通信方式
2022-07-29 19:58:00 【小锋coding】
进程用户地址空间是相互隔离的,所以要通信要经过内核
1、管道
匿名管道
没有名称,本质是内核的一段缓存,只能单向通信,数据是无格式的字节流且大小受限,符合先进先出,生命周期跟进程一样
通过调用pipe得到读写描述符进行,由于存在同一个进程中,所以匿名管道只用于父子进程通信,子进程会复制父进程的文件描述符。
命名管道
可进行不同进程的通信,提前建立了类型为管道的设备文件,访问这个设备文件就可以通信
2、消息队列
保存在内核的消息链表,使用用户自定义数据类型的消息体为单位传递数据,发送消息后就可以返回,读完就删除消息
消息队列通信不及时,消息大小有限制,内核态到用户态的消息拷贝开销
需要主动释放消息队列,如果没有释放消息队列进程终止也还会继续存在
3、共享内存
解决了数据拷贝的开销,通过虚拟地址,映射到一块公共的物理内存空间,即共享内存
一个进程读写,另外进程就能够快速看到,通信速度快
4、信号量
由于共享内存操作同块内存,所以会有互相覆盖的危险,所以需要信号量来进行同步。
一个整形计数器表示资源的数量,实现互斥操作,通过PV原子操作控制信号量
- P操作需要减少信号量,如果<0表明资源已被占用,需要阻塞等待。相减后>=0,表明还有资源,进程可继续运行
- V操作增加信号量,相加后<=0表明有进程处于阻塞,需要唤醒操作。相加后>0表明当前没有阻塞的进程
5、信号
信号是进程间通信的唯一异步通信机制,可以在任何时候发送信号给某一进程,用户进程收到信号有如下几种处理方式:
忽略信号。SIGKILL和SIGSTOP无法捕捉和忽略,用于任何时候中断或结束某一进程。
执行默认操作。每种信号都规定了默认操作
捕捉信号。我们可以为信号定义一个信号处理函数。当信号发生时,我们就执行相应的信号处理函数。
kill -9就是SIGKILL信号
Ctrl+C产生SIGTINT信号,终止进程
Ctrl+Z产生SIGISTP信号,停止进程
6、Socket
要想跨网络与不同主机通信,就需要Socket通信。
前面提到的管道、消息队列、共享内存、信号量和信号都是在同一台主机上进行进程间通信,那要想跨网络与不同主机上的进程之间通信,就需要 Socket 通信了。
实际上,Socket 通信不仅可以跨网络与不同主机的进程间通信,还可以在同主机上进程间通信。
我们来看看创建 socket 的系统调用:
int socket(int domain, int type, int protocal)
三个参数分别代表:
- domain 参数用来指定协议族,比如 AF_INET 用于 IPV4、AF_INET6 用于 IPV6、AF_LOCAL/AF_UNIX 用于本机;
- type 参数用来指定通信特性,比如 SOCK_STREAM 表示的是字节流,对应 TCP、SOCK_DGRAM 表示的是数据报,对应 UDP、SOCK_RAW 表示的是原始套接字;
- protocal 参数原本是用来指定通信协议的,但现在基本废弃。因为协议已经通过前面两个参数指定完成,protocol 目前一般写成 0 即可;
根据创建 socket 类型的不同,通信的方式也就不同:
- 实现 TCP 字节流通信: socket 类型是 AF_INET 和 SOCK_STREAM;
- 实现 UDP 数据报通信:socket 类型是 AF_INET 和 SOCK_DGRAM;
- 实现本地进程间通信: 「本地字节流 socket 」类型是 AF_LOCAL 和 SOCK_STREAM,「本地数据报 socket 」类型是 AF_LOCAL 和 SOCK_DGRAM。另外,AF_UNIX 和 AF_LOCAL 是等价的,所以 AF_UNIX 也属于本地 socket;
接下来,简单说一下这三种通信的编程模式。
针对 TCP 协议通信的 socket 编程模型
- 服务端和客户端初始化 socket,得到文件描述符;
- 服务端调用 bind,将绑定在 IP 地址和端口;
- 服务端调用 listen,进行监听;
- 服务端调用 accept,等待客户端连接;
- 客户端调用 connect,向服务器端的地址和端口发起连接请求;
- 服务端 accept 返回用于传输的 socket 的文件描述符;
- 客户端调用 write 写入数据;服务端调用 read 读取数据;
- 客户端断开连接时,会调用 close,那么服务端 read 读取数据的时候,就会读取到了 EOF,待处理完数据后,服务端调用 close,表示连接关闭。
这里需要注意的是,服务端调用 accept 时,连接成功了会返回一个已完成连接的 socket,后续用来传输数据。
所以,监听的 socket 和真正用来传送数据的 socket,是「两个」 socket,一个叫作监听 socket,一个叫作已完成连接 socket。
成功连接建立之后,双方开始通过 read 和 write 函数来读写数据,就像往一个文件流里面写东西一样。
针对 UDP 协议通信的 socket 编程模型
UDP 是没有连接的,所以不需要三次握手,也就不需要像 TCP 调用 listen 和 connect,但是 UDP 的交互仍然需要 IP 地址和端口号,因此也需要 bind。
对于 UDP 来说,不需要要维护连接,那么也就没有所谓的发送方和接收方,甚至都不存在客户端和服务端的概念,只要有一个 socket 多台机器就可以任意通信,因此每一个 UDP 的 socket 都需要 bind。
另外,每次通信时,调用 sendto 和 recvfrom,都要传入目标主机的 IP 地址和端口。
针对本地进程间通信的 socket 编程模型
本地 socket 被用于在同一台主机上进程间通信的场景:
- 本地 socket 的编程接口和 IPv4 、IPv6 套接字编程接口是一致的,可以支持「字节流」和「数据报」两种协议;
- 本地 socket 的实现效率大大高于 IPv4 和 IPv6 的字节流、数据报 socket 实现;
对于本地字节流 socket,其 socket 类型是 AF_LOCAL 和 SOCK_STREAM。
对于本地数据报 socket,其 socket 类型是 AF_LOCAL 和 SOCK_DGRAM。
本地字节流 socket 和 本地数据报 socket 在 bind 的时候,不像 TCP 和 UDP 要绑定 IP 地址和端口,而是绑定一个本地文件,这也就是它们之间的最大区别。
参考 小林coding
边栏推荐
- What are the software development modes (software engineering development mode)
- ds1302——斌哥51
- 使用MD5加密后的字符串存密码安全吗?你不得不了解的Hash算法
- 【无标题】
- 专家建议|经济低迷周期下如何制订求存的增长战略
- JSP Servlet JDBC MySQL CRUD Sample Tutorial
- 荧光量子点修饰siRNA-QDs|纳米金修饰siRNA-Au(RNA修饰方式方法)
- Data visualization ---- web page displays temperature and humidity
- 手写dialog弹框
- 第二增长曲线 | 企业创新突破停滞困境的驱动指南
猜你喜欢

如何把thinkphp5的项目迁移到阿里云函数计算来应对流量洪峰?

Thesis writing strategy | how to write an academic research paper

私域增长 | 私域会员:9大连锁行业15个案例集锦

小学弟问:程序员的工作是不是每天都是敲一天的代码呢?

EasyExce template filling generation of Excel of actual operation, many processing sheet page

叶酸&适配体修饰DNA纳米载体|CdS纳米颗粒修饰DNA|科研试剂
![[数学基础]高等数学相关概念学习](/img/59/3e1608de63c60201b3e7aaaf032d42.png)
[数学基础]高等数学相关概念学习

虚假新闻检测论文阅读(六):A Deep Learning Model for Early Detection of Fake News on Social Media

ds1302——Bin brother 51

双功能RGD-TAT修饰DNA纳米胶束|聚苯胺纳米线修饰DNA(PAINW/DNA)
随机推荐
荧光量子点修饰siRNA-QDs|纳米金修饰siRNA-Au(RNA修饰方式方法)
C language learning books (improvement)
使用IDEA连接mysql
Kotlin - Coroutine Scope CoroutineScope, Coroutine Builder CoroutineBuilder, Coroutine Scope Function CoroutineScope Functiom
scratch 编程 + 小学数学
LOG4J 学习
【无标题】
Experience Sharing | Tips for Writing Easy-to-Use Online Product Manuals
HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界
C language learning books zero-based introductory articles
JMeter使用教程(二)
手写dialog弹框
聚丙烯微孔膜的等离子体改性及DNA|有机自由基改性DNA-阳离子脂质复合体的应用
C#笔记 之 Oracle.ManagedDataAccess包的安装及配置
Chrome - Plugin Recommendations
Where is Naive Bayes "naive"?
In the past six months, I have done those things about the automatic return of the transaction link...
ESP8266-Arduino编程实例-EEPROM读写
ES6用法,面试大全
easyExce模板填充生成Excel的实际操作,多sheet页处理