进程通信
1.进程通信的概念
进程是一个独立的资源分配单元,不同进程(主要是指不同的用户进程)之间的资源是独立的,没有关联的,不能在一个进程中直接访问另一个进程的资源。但是,进程不是孤立的,如我和你用qq聊天、或迅雷下载资源都需要不同的资源进行通信。这就需要不同进程之间进行信息的交互和状态的传递等,因此这就需要进程间的通信。
进程通信主要有以下几种目的:
- 数据传输:一个进程需要将它的数据发送给另一个进程
- 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了牟总事件(如子进程需要终止时要通知父进程)
- 资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供互斥和同步机制。
- 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程所有陷入和异常,并能够及时直到它的状态改变。
2.进程间通信方式
同一主机进程间通信方式主要有:匿名管道、有名管道、信号、消息队列、共享内存、内存映射、信号量。
不同主机之间进程通信方式主要有:Socket。
2.1管道通信(匿名管道pipe、有名管道fifo)
管道的特点:
- 管道其实是一个在内核内存中维护的缓存,这个缓冲器的存储能力是有限的。
- 管道可以看作是一个文件:读操作、写操作,匿名管道没有文件实体,有名管道有文件实体,但不存储数据。可以按照操作文件的方式对管道进行操作。
- 一个管道是一个字节流,使用管道时不存在消息或者消息边界的概念,从管道读取数据的进程可以读取任意大小的数据块,而不管写入进程写入管道的数据块的大小是多少。
- 管道是半双工的(比如进程A和B之间通信,只能A向B传输数据或者B向A传输数据,而不能同时传输)。
- 匿名管道只能在具有公共祖先的进程(父子进程或兄弟进程)之前使用。而有名管道(FIFO)可以在任意两个进程之间使用。
- 管道中的读数据操作是一次性的,一旦被读走,就从管道中抛弃。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RYd0qIUE-1659346554493)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659338210747.png)]](https://img-blog.csdnimg.cn/89894e4bb4b74f1c967453f2e07d24ae.png)
①匿名管道通信示意图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gdAIsz8N-1659346554494)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659340120452.png)]](https://img-blog.csdnimg.cn/bd60bfc85e7641feae01aacafbf9faee.png)
②有名管道通信示意图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0DYPlCVo-1659346554494)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659341359340.png)]](https://img-blog.csdnimg.cn/128138fbfb754412bb2fc15d4f01035e.png)
2.2内存映射(mmap操作)
内存映射是将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。
①内存映射示意图
![在这里插入图片描述](https://img-blog.csdnimg.cn/cbe33c74645c4881a52ce30cc13bb1db.png)
②用内存映射来实现通信示意图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ekBg7mqr-1659346554495)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659342217048.png)]](https://img-blog.csdnimg.cn/9c91d6c066e3483f8ccda0703938c00d.png)
2.3共享内存(类似于shared_ptr)
共享内存允许两个或多个共享物理内存的同一块区域(通常被称为段)。由于一个共享内存段会被称为一个进程用户空间中的一部分,因此这种IPC机制无需内核接入。所有需要做的就是让一个进程将数据复制进共享内存中,并且这部分数据会对其他所有共享同一个段的进程可用。
与管道等要求发送进程将数据从用户空间的缓冲区复制进内核内存和接收进程将数据从内核内存复制进用用户空间的缓冲区相比,这种IPC技术的速度更快。无需内核介入,通信速度最快。
共享内存和内存映射的区别
1.共享内存可以直接创建,内存映射需要磁盘文件(匿名映射除外)
2.共享内存效率更高
3.内存
所有的进程操作的是同一个共享内存。(类似于类中的static成员变量)。
内存映射,每个进程在自己的虚拟地址中有一块独立的内存
4.数据安全问题
-进程突然退出
共享内存还存在
内存映射去小时
-运行进程的电脑死机
数据存在共享内存中,没有了
内存映射区的数据,由于磁盘文件中的数据还在,所以内存映射区的数据还存在
5.生命周期
-内存映射区:进程退出,内存映射区销毁
-共享内存:进程退出,共享内存还在,标记删除(所有的关联进程数为0),或者关机如果一个进程退出,会自动和共享内存取消关联(类似于shared_ptr)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHirb8Tl-1659346554495)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659345084665.png)]](https://img-blog.csdnimg.cn/90b014e405c845ca871c45bddf7b3a33.png)
2.4信号
信号是Linux进程间通信最古老的方式之一,是在事件发生时对进程的通知机制,有时也称为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中中断,转而处理某一个突发事件。
①信号的两个主要目的:
- 让进程知道已经发生了一个特定的事
- 强迫进程执行它自己代码中的信号处理程序
②信号的特点:
- 简单
- 不能携带大量信息
- 满足某个特定条件才发送
- 优先级比较高
③重要的信号:
![- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fv7ox4R5-1659346554495)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659345967190.png)]](https://img-blog.csdnimg.cn/402e9e7b887c4edb925d350b4e82abdb.png)
Qt中的信号与槽就是根据信号来实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)