进程间通信
一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并能够相互传递交换信息
为什么要通信(重点)
数据传输:一个进程需要将它的数据发送到另一个进程
资源共享:多个进程之间需要共享资源
事件通知:一个进程要向另一个或者一组进程发送消息,通知它(们)发生的事件(比如进程终止要通知父进程)
进程控制:有些进程需要完全控制另一个进程(如Debug进程),此时,控制进程希望能够拦截它想控制的进程的所有的陷入和异常,并能够及时知道其状态的改变
怎么通信(主要三种方式),通信本质(重点)
管道(Unix中最古老的进程间通信的方式)
我们把一个进程连接到另一个进程的一个数据流称为管道
匿名管道(通常就叫管道)
创建方法 #include <unistd.h> int pipe(int fd[2]) 参数:文件描述符数组,fd[0]表示读端,fd[1]表示写端 返回值:成功返回0,失败返回错误代码
特点:
1. 单向传输(单工),只能在父子进程间或兄弟进程间使用
2. 管道是临时对象
3. 管道和文件的使用方法类似,都能使用read、write、open等普通IO函数
4. 管道面向字节流,即提供流式服务
5. 一般来讲,管道生命周期随进程,进程退出,管道释放
6. 一般来讲,内核会对管道操作进行同步与互斥
7. 本质上Linux上的管道是通过空文件夹实现的
8. 事实上,管道使用的文件描述符、文件描述符、文件指针最终都会转化成系统内核中SOCKET描述符,都收到了SOCKET描述符的限制
9. 补充:Linux中,用两个file数据结构来实现管道命名管道
创建方法 $ mkfifo filename //命令行创建 int mkfifo(count char* filename, mode_t mode)//函数
特点:
- 命名管道也是单向传输,但它可以在不相关的进程间使用
- 命名管道不是临时对象,它们是文件系统真正的实体
- Linux下,在写进程打开命名管道之前,必须处理读进程对命名管道的打开,在写进程写数据之前,也必须处理处理读进程对管道的读
- 除了以上的特点与管道不同,其他的都是都与管道一样,包括数据结构和操作
匿名管道和命名管道的区别?
答:匿名管道只能在父子进程间或兄弟进程间使用,命名管道可以在不相关的进程间使用;匿名管道是临时对象,命名管道是文件系统真正的实体;匿名管道和命名管道打开和关闭方式不同。
管道的缺陷
- 管道读数据的同时也将数据移除,所以管道不能对多个接收者广播数据
- 管道中的数据被当作字节流,所以无法识别信息的边界
- 如果一个进程中有多个读进程,写进程无法发送到指定的读进程,如果有多个写进程,无法知道数据是哪一个发送的
系统IPC(System V IPC资源生命周期随内核)
消息队列
提供了一个由一个进程向另外一个进程发送一块数据的方法
特点:
1. 消息队列是随内核,只有重启和手动删除才会被真正的删除
2. 每个数据块都被认为是有个类型,接受者进程接受的数据块可以是不同类型值
3. 每个消息是有最大长度的上限的,每个消息队列的字节数也是有上限的,系统上消息队列数也有上限
4. 可用于机器上的任何进程间通信消息队列与管道的区别:
1. 提供有格式的字节流,减少开发人员的工作量
2. 消息具有类型,实际应用中,可以当做优先级使用
3. 消息队列随内核,生命周期比管道长,应用空间更大共享内存
由一个进程创建,其余进程对这块内存进行读写
特点:
- 最快的IPC形式
- 进程间数据传递不再涉及到内存(不执行进入系统的内核调用来传递彼此的数据)
- Linux无法对共享内存进行同步,需要程序自己对共享内存做同步运算,这种运算很多时候就是通过信号量来实现的
信号量
主要用于同步与互斥
进程互斥
- 由于有些进程需要共享资源,而且需要互斥使用,所以个进程竞争使用这些资源,这种关系被称为进程互斥
- 系统中某些进程一次只能被一个进程使用,称这样的资源为临界资源或者互斥资源
- 在进程中涉及互斥资源的的程序段叫做临界区
进程同步
多个进程需要配合完成同一个任务信号量和P、V原语
- 由Dijkstra提出
- 信号量
- 互斥:P、V在同一个进程
- 同步:P、V在不同的进程
- 信号量值的含义
- S>0:表示可用资源个数
- S=0:表示没有可以用的资源,无等待进程
- S<0:表示等待队列中有|S|个进程
- 为什么引入同步与互斥机制?点击进入答案
套接字(socket)
TCP用主机的ip地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字或插口
用(IP地址:端口号)表示
特点:
- 是网络通信过程中端点的抽象表示,是支持TCP/IP的网络通信的基本操作单元
- 包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远地主机的IP地址、远地进程的协议端口
- 在所有提供了TCP/IP协议栈的操作系统都适用,且编程方法几乎一样
- 要通过Internet进行通信,至少需要一对套接字