进程间通信方式的理解

首先来讲解一下有关此的概念理解

进程间通信的原因:因为进程间具有独立性,每个进程都有自己的独立虚拟地址,访问的都是虚拟地址,因此无法直接访问,所以需要操作系统给进程间提供通信方式

进程间通信的目的
1.数据传输:一个进程需要将它的数据发送给另一个进程
2.资源共享:多个进程之间共享同样的资源。
3.通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(如进程终止时要通知父进程)。
4.进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

原理:就是操作系统提供一块所有进程都能访问的空间,通过这个空间进行通信

有了概念的理解,来看一下通信的方式有哪几种:管道、消息队列、共享内存、信号量

一、管道(是最古老的进程间通信方式)
概念:用于实现进程间数据传输,其实就是内核中的一块缓冲区。
管道分为匿名管道和命名管道。

1、匿名管道
概念:内核中的缓冲区没有标识符,只能用于具有亲缘关系的进程通信
接口:

#include <unistd.h>
功能:创建一无名管道
原型
int pipe(int fd[2]);//创建一个匿名管道,通过参数fd向进程返回两个文件的描述符作为操作句柄
参数
fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端
返回值:成功返回0,失败返回错误代码
注意:创建管道一定要在子进程之前,这样子进程才能复制到管道的操作句柄

管道的读写规则
1.管道中若没有数据,则继续read就会阻塞
2.若管道中数据满了,则继续write就会阻塞
3.若管道中所有读端被关闭,则继续write就会触发异常退出进程
4.若管道中所有写端被关闭,则继续read读完数据后就不再阻塞,返回0
5.当要写入的数据不大于PIPE_BUF时,Linux保证写入的原子性,若大于,则不再保证写入的原子性

管道的特性
1.管道是半双工通信,数据只能一个方向流动
2.管道的生命周期随进程,进程退出,管道释放
3.管道提供字节流传输服务(以字节为传输单元进行传输,并且先进先出,读取之后退出缓冲区)
4.管道自带同步与互斥(实现管道安全操作,保证不会出现数据的二义性)
5.管道所有读端被关闭,则继续write会触发异常退出;管道所有写端被关闭,继续read会退出,不再阻塞

2、命名管道
概念:是内核中一块具有标识的缓冲区,能够被其他进程通过同一个标识符找到相同的管道,因此可以实现同一主机上任意进程间通信
创建:

第一种-----命令行:$mkfifo filename;

第二种-----函数接口int mkfifo(const char *filename,mode_t mode);
参数:filename是管道文件路径名,mode是管道文件的操作权限,对管道文件的访问权限也受影响;
返回值:成功返回0,失败返回-1

匿名管道与命名管道的区别
1.匿名管道由pipe函数创建并打开。
2.命名管道由mkfifo函数创建,打开用open
3.FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。

二、共享内存(最快的进程通信方式)
概念理解:共享内存本质上是一块物理内存,多个进程通过同一块物理内存都映射到自己的虚拟地址空间,通过自己的虚拟地址访问,数据共享
图解:
在这里插入图片描述

操作流程
1.创建共享内存,(开辟一块物理内存,并在内核中进行描述)
2.进程将共享内存映射到自己的虚拟地址空间,并且获取映射后的地址
3.对这块内存进行各种内存操作
4.解除映射关系,这时并不代表删除了共享内存
5.删除共享内存,(共享内存有映射计数,只有为0时才会真正的删除)

共享内存的特性
1.共享内存的生命周期随内核
2.共享内存是最快的进程间通信方式
注意:共享内存自身不带同步与互斥,它的操作需要程序员额外保护

三、消息队列
概念理解:实际是内核中一个优先级队列,多个进程访问同一个队列,通过添加节点和获取节点实现通信
消息队列特性
1.生命周期随内核
2.自带同步与互斥

四、信号量(主要是用于同步与互斥)
概念理解:本质是内核中的一个计数器,对资源进行计数,通过计数判断进程是否满足访问资源的条件,如不满足则阻塞,满足后再唤醒
实现同步的原理:通过自身的计数器对资源进行计数,在进程访问资源前先访问信号量,通过计数判断是否符合访问条件,保证访问的合理性
实现互斥的原理:保证自身的计数器为1,表示资源只有一份,只有一个进程能够获取,其他进程等待
信号量特性
生命周期随内核

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值