大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
什么是进程间通信
广义上讲,进程间通信(Inter-Process Communication, IPC)是指运行在不同进程(不论是否在同一台机器)中的若干线程间的数据交换。
从上面的定义可以得出两点:
- 参与通信的进程即可以运行在同一台机器上,也可以运行在各自的设备环境中(Remote Procedure Call Protocol, RPC)。如果进程是跨机器运行的,则通常是由网络连接在一起。
- 实现方式可以有多种多样。原则上,任何跨进程的数据交换都可以称为进程间通信。
常见的几种进程间通信方式
共享内存(Shared Memory)
共享内存是一种常见的进程间通信机制。由于两个进程可以直接访问同一块儿内存区域,减少了数据的复制操作,因而在速度上的优势比较明显。
一般情况下,实现内存共享的步骤如下:
-
创建内存共享区
内存共享区存在于内核中
-
映射内存共享区
需要将内存共享区映射到进程的空间中才可以进一步操作
-
访问内存共享区
-
进程间通信
由于内存共享本身并没有提供同步机制,所遇参与通信的各个进程需要自己协商处理。
-
撤销内存映射区
- 删除内存共享区
管道(Pipe)
管道这个词很形象地描述了通信双方的行为:
- 分别处于管道的两方,进行数据传输通信。
- 管道是单向的,如果一个进程既要读又要写,需要建立两根管道。类似于水管的特性。
- 管道的两端分别为”读取端”(read end)和”写入端”(write end)。
管道的局限性
- 生命周期是随进程结束而完结
- 只能用于具有亲缘关系的进程通信
- 管道是匿名的,没有名字
为了克服管道上述的局限性,可以使用命名管道(Named Pipe)。它具有管道所有的功能,并且没有管道的上述局限。
套接字(Socket)
其实网络通信中所使用的API与跨进程使用的是完全一样的。
两种角色:服务器与客户端。
每种角色的大致流程如下:
服务器:
- Create socket – socket()
- Bind sockaddr – bind()
- Listen – listen()
- Wait & Accept
- 一般在一个循环里边监听是否有新的连接 – accept();然后可以读写了
- 读 – recv()
- 写 – send()
- 关闭连接与客户端的连接 – close()
- 释放socket close()
客户端:
- Create socket – socket()
- Bind sockaddr – bind()
- 连接服务器 – accept();然后可以读写了
- 读 recv()
- 写 send()
- 关闭连接 close()
注意,如果服务器与客户端在同一台主机上,则是跨进程通信。如果在不同的主机上,则变成了网络通信。
消息队列(Message Queue)
信号(Signal)
信号量(Semophore)
参考
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/184029.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...