进程间通信

进程间通信是操作系统提供的一种方式,使得多个进程能进行数据交互。它包括管道(匿名和命名)、数据共享(如共享内存)、消息队列和信号量等方法。管道是内核中的缓冲区,提供半双工通信;共享内存则是通过映射同一块物理内存实现高速数据共享;消息队列支持数据包传输;信号量用于进程同步和互斥控制。这些机制确保了进程在访问资源时的协调和安全。
摘要由CSDN通过智能技术生成

进程间通信:是操作系统为用户提供的几种的几种进程间的通信方式。                                         概念:进程间通信其实就是多个进程之间进行数据交互。

进程间为什么不能直接进行数据交互,需要使用系统提供的方式?
进程之间是具有独立性的,每个进程都有自己的虚拟空间,访问数据的时候都是通过自己的虚拟地址进行访问的。一个进程将自己的某个变量的空间地址(虚拟地址)交给另一个进程,另一个进程无法访问。
操作系统提供进程间通信方式,其实就是给多个进程之间提供一个空间的交叉点,让多个进程可以访问到,才能形成通信。
操作系统提供进程间通信的时候是根据不同的场景,提供了不同的进程间通信方式:
管道:适用于数据传输
数据共享:数据共享
消息队列:数据传输
信号量:进程的协调控制(进程间的同步与互斥)

管道

管道是 Unix 中最古老的进程间通信的形式。 我们把从一个进程连接到另一个进程的一个数据流称为一个“ 管道
特性:半双工通信(可以选择方向的单向通信);
管道本质: 内核中的一块缓冲区(一块内存)。多个进程通过访问同一块缓冲区来实现数据传输。
管道的分类:
匿名管道:无名(标识符)管道,无法被其他标识符找到。只能用于具有亲缘关系的进程间通信
命名管道:有 名管道,可以用于同一主机的任意进程间通信
管道的本质是内核中的一块缓冲区,但在操作系统中,一切皆文件,把管道当文件处理。

操作:

int pipe(int pipefd[2])

功能:创建一个管道,并通过参数返回管道的两个操作句柄

参数:pipefd -具有2个整形元素的数组,内部创建管道会将描述符存储在数组中
pipefd[0] --用于管道读取数据
pipefd[1] --用于管道写入数据
注意:创建匿名管道,一定要在创建子进程之前。
管道特性:
1:管道中如果没有数据,则read从管道中读取数据会阻塞,直到有数据,读到数据后才能返回
2:如果管道中的数据满了,则write继续向管道中写入数据会阻塞,知道管道中有剩余空间才行
3:管道的所有读端被关闭,则继续向管道写入数据会导致进程崩溃退出
4:管道的所有写端被关闭,则read从管道读取完所有数据后,将不再阻塞,而是返回0;因此可以通过read的返回值,来决定什么时候停止从管道读取数据

 实现:

接口:

int mkfifo(const char *filename,mode_t mode);
filename:管道文件的名称,mode:管道文件的访问权限 成功返回0;失败返回-1;

特性:1、半双工通信

      2、管道生命周期随进程

    3、提高字节流传输服务

   4、自带同步与互斥  互斥:通过同一时间的唯一访问,来保证访问的安全性

 共享内存:

作用:用于多个进程之间的数据共享

特性:最快的进程间通信方式

原理:开辟一块物理内存,然后,多个进程将这块内存都映射到自己的虚拟空间中,通过虚拟地址直接访问物理内存中的数据

 一般实现流程:1、创建/打开指定的共享内存  2、将内存映射到自己的虚拟地址空间  3、内存操作  4、解除映射关系 5、删除共享内存

功能:用来创建共享内存
原型
 int shmget(key_t key, size_t size, int shmflg);
参数
 key:这个共享内存段名字
 size:共享内存大小 PAGE_SIZE整数倍
 shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1
功能:将共享内存段连接到进程地址空间
原型
 void *shmat(int shmid, const void *shmaddr, int shmflg);
参数
 shmid: 共享内存标识
 shmaddr:指定连接的地址,通常设置为NULL,让操作系统分配
 shmflg:它的两个可能取值是SHM_RND和(SHM_RDONLY只读)(0可读可写)
返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1
功能:将共享内存段与当前进程脱离
原型
 int shmdt(const void *shmaddr);
参数
 shmaddr: 由shmat所返回的指针
返回值:成功返回0;失败返回-1
注意:将共享内存段与当前进程脱离不等于删除共享内存段
功能:用于控制共享内存
原型
 int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数
 shmid:由shmget返回的共享内存标识码
 cmd:将要采取的动作(有三个可取值)
 buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0;失败返回-1

消息队列:

 特性:生命周期随内核、自带同步与互斥、传输是一种数据快的传输

信号量:
主要用于同步和互斥的
由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种 关系为进程的互斥
系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。
本质:是一个计数器+pcb等待队列
在进程中涉及到互斥资源的程序段叫临界区
特性方面
IPC 资源必须删除,否则不会自动清除,除非重启,所以 system V IPC 资源的生命周期随内核

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值