进程间通信(IPC)
概念:操作系统为用户提供的用于实现进程之间进行数据通信的多种方式
为什么:进程之间是具有独立性的,无法直接通信
本质:有一块公共的区域供多个进程同时访问
分类:管道,共享内存,消息队列,信号量
管道
作用:用于进程间的数据传输
本质:内存中的一块缓冲区(内核空间中的一块内存)
分类:命名管道,匿名管道
匿名管道:内核中的缓冲区没有标识-仅能用于有亲缘关系 的进程间通信,通过子进程复制父进程的方式获取到管道的操作句柄。
命名管道:内核中的缓冲区有标识-可见于文件系统的一个管道文件 管道文件作为标识让多个进程能够找到同一个缓冲区。
特性:半双工通信;生命周期随进程;
字节流传输方式:以字节为单位的持续传输,先进先出(类似于队列)
所有读端关闭,write会触发异常,所有写段关闭,read返回0;
自带同步与互斥;
互斥:通过同一时间只有一个进程能够访问保证操作安全,管道中数据的操作大小不超过PIPE_FILE大小保证原子操作
同步:通过一些条件限制保证进程对资源访问的秩序
管道没有数据则read堵塞,管道数据满了则write堵塞;
原子操作;要么完成要么不做,中间不会被打断的一种操作
共享内存
特性:所有进程间通信方式中最快的一种
本质原理:开辟一块物理内存,需要进行通信的进程将这块物理内存映射到自己的虚拟内存空间中,直接使用自己的内存空间地址进行访问
共享内存速度快是因为通过虚拟地址直接访问,相对于其他的方式少了两次用户空间与内核空间之间的数据拷贝 共享内存是一种覆盖式操作
操作流程:
1.创建或打开共享内存
2.将共享内存映射到虚拟地址空间
3.内存操作(memcpy,printf)…
4.解除映射关系
5.删除共享内存(实际上就算进行了内存删除操作,共享内存也不会立即被删除,等到共享内存映射连接数为0的时候才会被删除)
1.创建或打开
int shmget(key_t key,size_t size,int shmflag);
key:共享内存标识符(为了让多个进程找到一个)
size:需要创建的共享内存大小(仅创建时有效 )
shmflag:IPC_CREAT| IPC_EXCL|0664
IPC_CREAT:不存在则创建,存在则打开。
IPC_EXCL与IPC_CREAM搭配使用,表示存在则报错,不存在则创建打开
mode 0664 设置共享内存访问权限
返回值:成功则返回一个非负整数—操作句柄:失败返回-1;
2.建立映射关系
voidshmat(int shm_id,voidshmaddr,int shmflag)
shm_id:shmget返回的操作句柄
shmaddr:通常置NULL,让系统自动分配建立映射
shmflag:SHM_RDONLY-只读;0-默认是可读可写
返回值:成功返回映射的首地址;失败返回(void*)-1
shm_start:映射首地址-shmat的返回值
返回值:成功返回0;失败返回-1
4.删除共享内存
int shmctl(int shm_id,int cmd,struct shmid_ds*buf)
shmid:操作句柄;
cmd:IPC_RMID-标记删除(不在接受新的映射)
buf:用于获取共享内存信息(用不上就置空)
返回值:成功返回0;针对IPC_RMID失败返回-1
**特性2:**共享内存生命周期随内核,在人为不删除的情况下,所有映射退出也不会释放共享内存;
消息队列:
**本质:**在内核中创建一个优先级队列:具有标识符能被其他进程找到;多个进程通过访问一个队列,通过添加或者获取节点实现通信
消息队列传输的都是数据节点,节点中包含两种信息:
1.类型
2.数据
类型作用:用于身份区分;优先级
特性:1.双工通信;2.自带同步与互斥;3.生命周期随内核
信号量:
本质:信号量本质上就是内核中的一个计数器
作用:实现进程间的同步与互斥(保护进程间对临界资源的访问操作)
临界资源:大家都能访问的资源。