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