进程间通信方式IPC

进程间通信有五种,分别是管道、共享内存、信号量、消息队列、Socket

应用场景:
管道:用于进程间的数据传输
共享内存:用于进程间的数据共享
消息队列:用于进程间的数据传输
信号量:用于实现进程间的控制

1、管道

管道的本质就是内核中的一块缓冲区,实现原理是多个进程访问到同一块缓冲区,来实现进程间通信。
通信方式:半双工
管道分为匿名管道pipe和命名管道fifo,他们之间的区别是匿名管道的内核中没有标识符,其他进程无法直接访问,只有具有亲缘关系的进程可以访问,命名管道的内核中有标识符,其他进程可以直接访问,所以匿名管道与命名管道的创建方式不同

匿名管道

创建管道时操作系统会提供两个操作句柄(文件描述符),一个用于从管道中读数据,并一个向管道中写入数据。
又有匿名管道只能用于具有亲缘关系的进程进行通信,具体实现是:子进程通过复制父进程的方式,获取管道的操作句柄,进而实现访问同一个管道进行通信。

创建匿名管道

int pipe(int pipefd[2]);//通过参数pipefd向用户返回管道的操作句柄
参数:pipefd[0]:表示从管道中读取数据,pipefd[1]:表示向管道中写入数据,
成功返回0,失败返回-1

匿名管道的特性有:
(1)若管道中没有数据,read则会阻塞;
(2)若管道已写满,write则会阻塞;
(3)自带同步与互斥;(同步保证合理性,互斥保证安全性<原子操作>)
(4)当所有读端被关闭,再向管道写数据,则报出异常,直接退出;
(5)当所有写端都被关闭(没有进程再写数据),读取完管道中的数据,返回0

命名管道

命名管道在内核中的缓冲区具有标识符(标识符是一个可见于文件系统的管道文件),其他进程可以通过标识符,相当于打开同一个管道文件,进而访问同一块缓冲区,这样就可以实现通信

创建命名管道

命令:makefifo filename 
函数:int mkfifo(const char *pathname, mode_t mode);
pathname:管道文件名称
mode:文件权限()
成功返回0,失败返回-1

在创建命名管道的时候不会创建缓冲区,只有进程打开这个文件的时候才会在内核中创建一块缓冲区(因为如果创建管道后一直不用,就会浪费空间,所以不会再创建管道的是时候就开辟缓冲区)

命名管道的打开特性:
(1)若管道以只读的方式打开,则会阻塞,直到这个管道文件被以写的方式打开
(2)若管道以只写的方式打开,则会阻塞,直到这个管道文件被以读的方式打开
(3)若管道以读写方式打开,则不会阻塞

管道的特性有:
(1)自带同步与互斥
(2)生命周期随进程
(3)半双工通信
(4)提供字节流服务(有序的、可靠的、连接的字节流服务)

2、共享内存

实现原理:
(1)在物理内存上开辟一块内存空间;
(2)将这块物理内存映射到进程的虚拟地址空间;
(3)进程可以通过虚拟地址空间直接访问这块物理内存;
(4)多个进程要映射同一块物理内存,就可以通过这块内存实现数据共享

共享内存是最快的进程间通信方式,因为共享内存通过虚拟内存直接映射访问物理内存,在通信时不需要用户态与内核态之间的数据拷贝,从而加快进程间的通信。

共享内存的操作流程
(1)创建共享内存(开辟物理内存空间)
(2)建立映射
(3)解除映射
(4)删除共享内存
当删除共享内存的时候,共享内存不会立即被删除 (因为有可能会造成正在访问的进程崩溃),而是将key修改为0,表示这块共享内存将不再继续接收映射链接,当这块共享内存的映射链接数为0是,则自动释放

共享内存的特性:
(1)生命周期随内核;
(2)是最快的进程间通信方式
共享内存没有同步与互斥,所以共享内存的操作不是安全

3、消息队列

消息队列是内核中的一个优先级队列,多个进程向同一个队列中添加节点和获取节点实现通信,传输一个有类型的数据块。
消息队列的特性:
(1)生命周期随内核;
(2)自带同步与互斥;
(3)传输数据自带优先级

4、信号量

信号量实现进程间的同步与互斥
信号量的本质是内核中的计时器+pcb队列,是对资源计数

同步:通过条件的判断,实现临界资源的合理性
互斥:通过同一时间只有一个进程访问理解资源,从而实现访问资源的安全性

5、Socket

稍后补充

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值