进程间通信基础知识
进程间通信就是在不同进程之间传播或交换信息,而进程间通信的环境可以是本地也可以是远程(网络),位于网络上的两个进程之间通信的数据需要经过网络传输,例如经过Socket通信
而进程是独立的空间 原则上不允许外界访问,在.NET托管环境中 是强制的实行了这样的安全措施,不能直接访问其它程序的内存空间防止对进程的非法访问
显然要实现进程间通信必须通过一个中介 这个中介可以是文件 内存共享区 或者是数据库等,一个进程往中介区写数据 另一个读数据,而为了避免出现差错 又需要对进程进行同步
下面是进程间通信的3种方式:
1.共享内存系统
相互通信的进程共享某些数据结构或者存储区.进程访问共享内存进行读写实现信息的交换,这需要操作系统提供支持
2.消息通信(主流方式) Message
进程间数据交换以消息为单位,计算机网络中称之为报文,进程利用操作系统的通信命令完成通信
消息有以下要素
msgsender 消息发送者
msgreceiver 接收者
msgnext 下一个消息的指针
msgsize 整个消息的位元组数
msgtext 消息正文
直接通信:
操作系统提供接口:Send(Receiver,message) Recevie(Sender,message)
利用Send将消息发送给目标进程 并将此消息挂在接收进程的消息缓冲队列中,接收进程则调用Recevie从队列中读取消息
例如socket通信 通过指定IP地址和端口号后 使用send 方法将数据准确发送到远程的进程 远程进程则调用Recevie接收数据进行反序列化获得对象 实现的两个进程之间的数据交换
不管是在单机环境还是网络环境中,高级进程通信普遍采用消息传递系统,但这种通信机制都涉及链路和消息格式问题,为了完成通信,必须在两者间建立一条通信链路,例如在网络通信中 可以显示地建立和拆除连接 例如先建立一个TCP连接 然后发送数据 然后拆除连接,在单机环境中无须明确建立连接 可由操作系统自动搭建链路。被传递的消息必须具有一定的格式,在单机环境中 由于发送和接收进程位于同一台计算机 所以格式非常简单,在网络环境中 发送和接收进程环境不同,传输距离远,可能跨若干个完全不同的网络导致消息格式变得复杂
3.管道通信(UNIX首创)
"管道"就是实现进程间通信的一个共享文件 进程通过访问这个共享文件实现通信。
为了协调读写进程的通信 管道机制必须提供3个方面的协调能力:
互斥:当一个进程对管道读写的时候 其它进程必须等待
同步:写进程把一定数量的数据写入管道后就去睡眠等待,直到读进程取走数据后再把写进程唤醒,唤醒后读进程去睡眠等待,当写进程又写入数据后才可将读进程唤醒
确定存在:要确定对方存在才能进程通信
例如在我们可以把一个对象经过序列化后存储在磁盘上的某个文件中 另外一个进程读这个文件的数据反序列化就可以得到对象的副本 我们就可以获得这个对象的数据了
在windows系统中 进程间通信大部分是从UNIX移植过来 例如windows的剪贴板 文件映射等都可以找到UNIX共享内存的影子,因为WINDOWS运行的实体是线程, 狭义上的进程间通信其实是指分属于不同进程的线程之间的通讯.而单个进程之间的线程同步问题可归并为一种特殊的进程通信.它要用到内核支持的系统调用来保持线程之间同步. 通常用到的一些线程同步方法包括:Event, Mutex, 信号量Semaphore, 临界区资源等.