进程之间的通信方式

article/2025/10/9 14:35:55

进程之间的通信方式包括管道,消息队列,共享内存,信号,信号量,socket六种方式,下面来对这6种方式分别进行介绍。

一、管道

管道的结构示意图如上所示,管道包含一个输入端和一个输出端,输入端将数据写入到管道中,输出端可以从管道中将数据读出。 

管道存在于内存中,并不存在于文件系统中,也就是说,管道其实是一段缓存,而且,在数据写入管道后,进程会阻塞,直到管道中的数据被读出位置

可以在linux上面执行下面的指令进行测试

$ mkfifo myPipe //创建管道
$ echo "hello" > myPipe // 将数据写进管道// 停住了 ...
$ cat < myPipe // 读取管道⾥的数据(需要另开一个终端)
hello

管道的缺点:

1.通信效率太低

2.只能单向进行通信

3.管道具有生命周期,会随着进程的销毁而销毁

为解决管道单向通信的问题,可以使用命名管道代替匿名管道进行通信。对于命名管道,它其实是创建了一个管道类型的设备文件,通过这个设备文件可以实现在不同进程之间的双向通信。

二、消息队列

操作系统维护一个队列结构,用于存放消息,在进程A向进程B发送消息时,先将消息放入消息队列中,这里面的消息是指预先定义好的数据结构,等到进程B从消息队列中取出该消息时,便可以对这条消息进行处理。在进程B接收了这条消息后,操作系统会把这条消息从消息队列中移除。

优点:

1.支持异步处理消息

2.消息队列并没有生命周期,只要操作系统没有关闭,或者没有主动清空消息队列,消息队列中的数据会一直存在。

缺点:

1.通信不及时

2.所存放的消息具有大小上的限制,不适合大数据之间的通信

3.消息队列维护在系统内核中,存在用户态与内核态之间切换的开销

三、共享内存

由于现代操作系统中使用的是虚拟内存,也就是说将为每个物理内存分配一块虚拟内存空间进行映射,操作系统的指令是在虚拟内存中执行,但在操作系统在增删改查数据时,通过虚拟内存找到实际的物理内存,进行数据的增删改查。进程A和进程B的都会分配到一块属于自己的虚拟内存,那么按照这个逻辑,我们可以让进程A和进程B的虚拟内存映射同一块物理内存空间,这样就可以实现两个进程之间的通信。

优点:

1.通信及时

2.通信效率较高

缺点:

在多个进程共享同一块物理内存时,可能会发生数据安全性的问题,即两个进程如果在同一时刻对共享内存的同一个变量进行写入操作时,后写入的结果会覆盖前写入的结果。

四、信号量

信号量是用于解决共享内存通信方式中的数据安全问题的。

信号量是一个整形计数器,信号量其实是⼀个整型的计数器,主要⽤于实现进程间的互斥与同步,⽽不是⽤于缓存进程间通信的数据。

控制信号量的方式有两种原子操作:

1)⼀个是 P 操作,这个操作会把信号量减去 1,相减后如果信号量 < 0,则表明资源已被占⽤,进程需阻塞等待;相减后如果信号量 >= 0,则表明还有资源可使⽤,进程可正常继续执⾏。
2)另⼀个是 V 操作,这个操作会把信号量加上 1,相加后如果信号量 <= 0,则表明当前有阻塞中的进程,于是会将该进程唤醒运⾏;相加后如果信号量 > 0,则表明当前没有阻塞中的进程。

按照上面的方式举一个信号量实现进程A和B互斥访问的例子:

1.进程A和B要对同一块共享内存进行操作,共享内存的信号量初始化为1.

2.假设进程A先进程操作,进程A需要在操作共享内存之间先执行P操作,设置信号量,此时信号量应该-1,变为0,根据定义进程A可以正常执行

3.线程B要对共享内存操作时,需要先设置信号量,此时信号量-1后为-1,根据定义,进程B需要阻塞等待

4.进程A在执行完毕后执行V操作,将信号量+1,此时信号量为0,根据定义,此时有进程被阻塞,进程A需要唤醒被阻塞的进程B

5.进程B被唤醒后,再次执行P操作,将信号量-1,此时信号量为0,进程B可以正常执行

五、信号

信号量主要是针对正常状态进程的,对于异常状态的进程,需要使用信号来见通信

可以通过kill -l查看所有的信号

$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

其实我们平时按的快捷键或者指令就对应着信号

比如Ctrl + C 对应SIGINT信号,表示终止该进程

再比如 kill -9 pid 表示给对应pid的进程发信号,立即终止该进程

对于信号,用户进程有以下几种处理方式

1.执⾏默认操作。Linux 对每种信号都规定了默认操作,例如,上⾯列表中的 SIGTERM 信号,就是终⽌进程的意思。
2.捕捉信号。我们可以为信号定义⼀个信号处理函数。当信号发⽣时,我们就执⾏相应的信号处理函数。
3.忽略信号。当我们不希望处理某些信号的时候,就可以忽略该信号,不做任何处理。有两个信号是应⽤进程⽆法捕捉和忽略的,即 SIGKILL 和 SEGSTOP ,它们⽤于在任何时候中断或结束某⼀进程。

六、socket

socket用于实现跨网络不同主机之间的通信

socket是一个套接字,通过四元组(在tcp中为四元组,即源ip地址,目的ip地址,源端口号,目的端口号,在udp中只需要源ip地址和源端口号即可)来唯一标识接收和发送数据的两方,用于这两方之间的通信。

socket通信的过程如下:

1)服务端和客户端初始化 socket ,得到⽂件描述符;
2)服务端调⽤ bind ,将绑定在 IP 地址和端⼝;
3)服务端调⽤ listen ,进⾏监听;
4)服务端调⽤ accept ,等待客户端连接;
5)客户端调⽤ connect ,向服务器端的地址和端⼝发起连接请求;
6)服务端 accept 返回⽤于传输的 socket 的⽂件描述符;
7)客户端调⽤ write 写⼊数据;服务端调⽤ read 读取数据;
8)客户端断开连接时,会调⽤ close ,那么服务端 read 读取数据的时候,就会读取到了 EOF ,待处理完数据后,服务端调⽤ close ,表示连接关闭

以上是TCP传输协议下socket的工作过程,对于UDP,因UDP 是没有连接的,所以不需要三次握⼿,也就不需要像 TCP 调⽤ listen 和 connect,但是 UDP 的交互仍然需要 IP 地址和端⼝号,因此也需要 bind。


http://chatgpt.dhexx.cn/article/Fi5fT9LM.shtml

相关文章

进程间通信的六种常见方式

目录 进程间通信&#xff08;IPC&#xff09;&#xff1a; 一、管道 二、FIFO 三、消息队列 四、共享内存 五、信号 六、信号量 七、进程间通信方式总结&#xff1a; 进程间通信&#xff08;IPC&#xff09;&#xff1a; 进程间通信的方式有很多&#xff0c;这里主要…

idea数据库管理工具配置连接数据库

idea数据库管理工具配置连接数据库 —————————————————————————————————————————————————————— 在cmd中操作数据库太麻烦了&#xff0c;还好idea为我们提供了很方便的数据库管理工具&#xff0c;下面看看如何用idea连接…

idea连接数据库失败解决办法

一.IDEA连接Mysql报错&#xff1a; 未找到驱动程序类 ‘com.mysql.cj.jdbc.Driver‘.  Change driver class 报错详细内容&#xff1a;未找到驱动程序类 ‘com.mysql.cj.jdbc.Driver’. Change driver class 报错原因&#xff1a;Mysql版本为5.0&#xff0c;找不到com.mysql.…

IDEA中如何连接数据库并显示数据库信息。

我的相关博客&#xff1a; java代码程序中连接mysql数据库的方法及代码 mysql数据库并发上锁问题&#xff0c;java代码 关于IDEA中怎么连接mysql数据库 相信部分朋友在使用IDEA操作数据库的时候会出现有关数据库信息的报错。 显示没有此表&#xff0c;或者无数据库等错误信息…

idea连接数据库失败原因及解决方案

这是因为安装mysql的时候时区设置的不正确 mysql默认的是美国的时区&#xff0c;而我们中国大陆要比他们迟8小时&#xff0c;采用8:00格式。使用的数据库是MySQL&#xff0c;在你没有指定MySQL驱动版本的情况下它自动依赖的驱动是8.0.12很高的版本&#xff0c;这是由于数据库和…

IDEA如何连接数据库 / IDEA连接数据库 新手,图解

如果在下面操作中遇到了问题&#xff0c;可以查看我的这篇笔记 https://blog.csdn.net/qq_44627608/article/details/115442815 1. 打开IDEA的数据库设置 2. 新建数据库链接 左上角的便是你链接的数据库了&#xff0c;第一次打开时左上角应该是空的&#xff0c;需要你从下面的…

IDEA使用Database连接数据库

一&#xff0c;连接数据库 1.点击右侧Database后,点击左上角按钮&#xff0c;然后选中Data Source &#xff0c;无论使用的是MariaDB还是MySQL都选中MySQL 2.点击非常隐蔽的 … 按钮 3.选中你需要使用的数据库 4.填写数据的账号&#xff0c;密码&#xff0c;数据库名称&…

idea代码连接mysql数据库操作

此文章仅为作者学习上的问题记录&#xff0c;如有错误&#xff0c;欢迎指正。 首先是准备工作 先创建一个Module 之后在此Module下创建一个lib包 然后将下载的连接包复制到lib包下&#xff0c;连接包下载地址&#xff1a; https://cdn.mysql.com//Downloads/Connector-J/mysq…

IDEA中配置数据库连接

1.点击IDEA右边框的 Database &#xff0c;在展开的界面点击 选择 Data Source &#xff0c;再选择 MySQL 2.在弹出的界面进行基本信息的填写 3.填写完后&#xff0c;点击Test Connection 测试一下 这样就是填写的没问题&#xff0c;如果是第一次点击这个&#xff0c;需要下载…

Idea连接MySQL数据库教程 (简单明了)

使用Idea连接数据库 具体步骤&#xff1a;点击右侧DataBase → 点击号 → 点击Data Source 选择MySQL → 输入用户名、密码、连接的数据库名称&#xff08;连接路径会自动生成&#xff09; → 可点击下面的Test Connection来测试连接 注意事项一&#xff1a; 第一次连接需要下…

IntelliJ IDEA配置连接MySQL数据库

如图&#xff1a; 1、点击主界面右侧边栏Database 2、点击""号 3、点击Data Source 4、点击MySQL 如图填写数据库名&#xff0c;用户名和密码&#xff0c;之后点击下方Test Connection测试 连接成功会显示上图字样 这时发现已经可以查看到数据库信息&#xff0c;说…

IDEA连接mysql数据库

1.保证mysql数据库和IDEA安装成功后&#xff0c;找到IDEA中mysql数据库的连接方式 按照图上的顺序 2.配置连接 在第一次使用的时候&#xff0c;除了要配置连接&#xff0c;还有配置相应的驱动&#xff0c;否则连接的时候会报错。 图中的①②③④⑤分别表示为&#xff1a; ①…

如何使用IDEA连接数据库?

一定要下载IDEA专业版 之前我一直用的是社区版&#xff0c;有诸多内容限制&#xff0c;且无直连数据库功能 通过学生认证&#xff08;我是认证失败直接找某宝了&#xff09;直接可以获得1年的免费试用时长 具体操作 然后输入用户、密码、数据库 这里值得一说的是&#xff0c…

Idea连接数据库并执行SQL语句

1、Idea显示Database 2、连接数据库 1、打开界面 2、配置连接信息 3、测试连接 4、面板基本信息 5、选择要显示的数据库 6、表的基本信息 7、新建查询 8、设置sql的备注名称 9、编写sql执行 10、执行结果 3、连接可能出现的问题 1、Idea显示Database idea显示Data…

IDEA连接MySQL数据库的四种方法

首先右击此电脑点击管理&#xff0c;进入页面 再服务栏确保MySQL是正常运行状态 打开IDEA, 左边栏选择Maven Archetype,新建一个名为javaweb的新工程 进行如图编辑完成新建 在Main包下新建一个java包&#xff0c;右击java包进行下图操作&#xff0c;java包拥有新建class的权限…

Idea 连接 MySQL 数据库

文章目录 前言配置 MySQL安装添加环境变量检查配置 MysQL服务状态开启关闭 在idea Ultimate中建立连接引入 Drivers 驱动添加表创建 schema 架构创建 Table 表 写入数据信息 测试类 前言 开始链接前&#xff0c;请确保本机上安装的 idea 是 Ultimate 专业版&#xff0c;点我下…

IDEA连接数据库,以及报错问题

IDEA是一款功能强大的开发工具&#xff0c;而IDEA连接数据库是其中的一个附带功能&#xff0c;该功能可以在我们开发大型任务&#xff0c;编写SQL语句时&#xff0c;提供帮助&#xff0c;例如以MySQL为例 解决SQL映射文件的警告提示&#xff1a; 在映射配置文件中存在报红的情…

IntelliJ IDEA 连接数据库 详细过程

IntelliJ IDEA集成了众多插件&#xff0c;方便开发者使用&#xff0c;使用其自带的Database模块就可以很方便的配置、连接到数据库&#xff0c;本次操作以MySQL为例&#xff0c;其中testjdbc数据库已经提前建好&#xff0c;里面有两张表emp_table 和 t_user&#xff0c;相关信息…

IntelliJ IDEA连接Mysql数据库

IntelliJ IDEA连接Mysql数据库 1、首先找到右边的Database的显示框、没有的话在工具栏中View&#xff0c;现在Tool Windows下拉菜单&#xff0c;继续选择Database&#xff0c;就可以出现。 2、然后点击有上角处的那个的“”&#xff0c;选择Data Source 下的MySQL(数据库类型取…

如何在IDEA中连接mysql数据库

补充说明下&#xff0c;本篇博文连接数据库&#xff0c;只是将IDEA作为一个Mysql数据库的可视化界面&#xff0c;无法在代码中访问。如果你们是想在代码中连接MySQL数据库&#xff0c;比如通过访问数据库的用户名和密码来进行登录验证&#xff0c;那么请看以下这篇文章《Java连…