什么是进程通信?
简单来说就是在进程间传输数据(交换信息)
进程通信的分类
根据交换信息量的多少和效率的高低,分为:
*初级通信:只能传递状态和整数值
缺点:
1.传送信息量小,效率低,每次通信传递的信息量固定,若传递较多信息则需要进行多次通信。
2.编程复杂:用户直接实现通信的细节,容易出错。
高级通信:提高信号通信的效率,传递大量数据,减轻程序编制的复杂度。
提供三种方式:
1.共享内存模式
2.消息传递模式
3.共享文件模式
根据通信方式不同,分为:
*直接通信:信息直接传递给接收方,如管道。在发送时,指定接收方的地址或标识,也可以指定多个接收方或广播式地址;在接受时,允许接收来自任意发送方的消息,并在读出消息的同时获取发送方的地址。
*间接通信:借助于收发双方进程之外的共享数据结构作为通信中转,如消息队列。通常收方和发方的数目可以是任意的。
共享内存模式(间接通信)
最为快捷有效的方式之一,UNIX系统中常被使用。
原理:
*内存共享区的互斥要通过其他机制实现
*数据的发送方不关心数据由谁接受,数据的接收方也不关心数据是由谁发送的,存在安全隐患。
消息传递模式
消息(message):由发送方形成,通过一定的机制传递给接收方的一组信息,它的长度可以固化,也可以变化。
工作原理:
Send()和Receive()通信原语
消息传递的方式
*直接通信方式:点到点的发送
*间接通信方式:以信箱为媒介进行传递,可以广播
管道(直接通信)
是一种消息流缓冲机构,UNIX系统中管道基于文件系统,在内核中通过文件描述符表示。管道以先进先出(FIFO)方式组织数据传输。
实现方法
管道的特点
*管道是一个单向通信信道,如果进程间要进行双向通信,通常需要定义两个管道
*管道通过系统调用read(),write()函数进行读写操作
管道的分类:
*匿名管道:只适用于父子进程之间通信;管道能够把信息从一个进程的地址空间拷贝到另一个进程的地址空间。
命名管道:命名管道有自己的名字和访问权限的限制。