进程间通信
1.进程间通信(IPC)
进程的地址空间是相互独立的,不能相互访问,进程间通信(IPC)技术实现进程之间交换信息
2.IPC分类
1)低级通信主要用于进程之间的同步、互斥等控制信息的传递
2)高级通信主要用于进程间数据信息的传递,常见的高级通信有管道、消息队列、共享内存等
3)查看系统IPC状态的指令:
ipcs -a //显示所有IPC,包括共享内存、信号量、消息队列 ipcs -m //共享内存 ipcs -s //信号量 ipcs -q //消息队列
4)清理IPC机制的指令:
ipcrm-m shmid //在最后一个共享内存从进程中分离完成后,删除共享内存标识符shmid
3.无名管道
3.1概念
1)管道是具有公共祖先的两个进程间进行单向通信的机制,又称半双工管道
2)一般情况下(某些系统存在全双工管道),如果需要要进行全双工通信,需要建立两个管道
3)管道对于管道两端的进程而言,就相当于一个FIFO类型的文件(但是这个文件只存在于内存,不属于文件系统),一个进程向管道中写入内容,管道另一端的进程读取内容,写入内容每次都写到缓冲区的末尾,读取内容每次都从缓冲区的开头读取
3.2无名管道的创建
int fd[2]; int pipe(int fd[2]);
1)使用pipe()函数创建,返回两个文件描述符:f[0]用于读,f[1]用于写
2)一般进程先调用pipe,再调用fork,从而实现父子进程的管道通信,通过close函数关闭特定的fd来决定管道的传输方向
3.3无名管道的优缺点
1)简单
2)局限于单向通信
3)局限于具有公共祖先的进程之间
4)缓冲区大小有限
5)管道所传送的是无格式字节流,要求管道的读出方和写入方必须事先约定好数据的格式
4.命名管道(FIFO)
4.1概念
1)命名管道可以在不具血缘关系的两个进程间通信
2)命名管道创建的管道以FIFO的文件形式存在于文件系统中,只要可以访问该管道文件,就能够彼此通过它相互通信
3)命名管道也是半双工
4.2命名管道的应用
shell命令“|”就是管道,将一个命令的输出定向到另一个命令的输入
4.3有名名管道的优缺点
1)可在不具血缘关系的进程间通信
2)无名管道是一种非永久性的管道,当进程终止时,它将随之被撤消;而有名管道提供文件路径名,可以长期存在于系统中,使用不当容易导致出错
三种XSI IPC(消息队列、共享内存、信号量)
5.消息队列
5.1概念
1)进程之间可以通过消息缓冲区来相互通信,通信双方的发送和接收均以消息(数据块)为单位
2)每一个消息(数据块)都有一个类型,而接收进程可以接收不同类型的消息(数据块)
3)存储器中,消息缓冲区被组织成队列,所以称之为消息队列
4)消息队列创建后即可由多进程共享,发送消息的进程可以在任意时刻发送任意个消息到指定的消息队列上,并检查是否有接收进程在等待它所发送的消息,若有则唤醒它;而接收消息的进程可以在需要消息的时候到指定的消息队列上获取消息,如果消息还没有到来,则转入睡眠状态等待
5.2消息队列的优缺点
1)允许任意关系得进程实现进程间通信
2)可传递任意类型的消息
3)由操作系统调用函数来实现消息发送和接收之间的同步,从而不需要考虑同步问题
4)消息的复制需要额外消耗CPU,不适宜于消息量大或操作频繁的场合
6.共享内存
6.1概念
1)针对消息复制需要额外消耗CPU的缺点,共享内存可以在进程间直接进行数据交换,减少一次复制
2)共享内存将同一段物理内存与各进程自己的虚拟地址空间建立映射,所有进程都可以访问这块物理内存
6.2共享内存的优缺点
1)共享内存是最快的IPC方式
2)信息无须复制,信息量大
3)由于给通信的各进程提供了一块共享的物理内存,这样进程之间读写操作的同步问题操作系统是无法实现的,需要通过其他同步工具(如信号量)解决
4)使用共享内存的各进程必须同处一个计算机系统,所以不方便网络通信
四次拷贝减少成两次拷贝
7.信号量
8.信号
9.套接字
概念
1)套接字是通信端点的抽象,用于网络进程间通信(可以是计算机间,也可以是计算机内)
2)套接字在linux系统中相当于一种特殊的文件,用套接字描述符来描述套接字,套接字描述符被当成一种文件描述符
10.UNIX域套接字
虽然网络套接字也可以用于单机进程间的通信,但是使用Unix域套接字效率会更高,因为Unix域套接字仅仅进行数据复制,不会执行在网络协议栈中需要处理的添加、删除报文头、计算校验和、计算报文顺序等复杂操作,因而在单机的进程间通信中,更加推荐使用Unix域套接字。
posted on 2018-12-11 15:26 JoeChenzzz 阅读(214) 评论(0) 编辑 收藏 举报