进程通信方式总结与盘点
进程通信是指进程之间的信息交换。
这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。
从某方面来讲,进程通信可以解决进程同步问题。
首先回顾下我们前面讲的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,
因此信号量机制也可以被归为进程通信的一种方式,也被称为低级进程通信,主要原因为:
-
效率低
一次只可操作少量的共享数据,比如生产者消费者问题,生产者一次只可向缓冲池中投放一个消息; -
通信对用户不透明
OS 只为进程提供了共享存储器,
而关于进程之间通信所需的共享数据结构设计,数据的传递,进程的互斥与同步,都必须要有开发者去实现,
显然,这对开发者来说很不方便,,增加了程序设计的难度和复杂度。
同样,我们来看下高级进程通信的特点:
-
使用方便
这也是针对低级进程通信中的第二点 — 通信对用户不透明,OS对开发者隐藏了进程的具体细节,对于用户来说,只需要使用OS提供的一组原语(实现高级通信的命令),就可以方便的直接使用并实现进程间的通信。
就像我们使用第三方的jar 包一样,直接调用封装好的方法即可。 -
高效的传送大量数据
可以通过OS 提供的原语快速的传输大量数据。
说完了这两种级别的进程通信,下面我们就具体来看一看进程的通信方式都有哪些。
通信机制也是随着OS 的发展而不断进步的,目前通信机制可分为四大类:
共享存储器、管道通信系统、消息传递系统 以及 客户机-服务器 系统。
接下来我们依次讲解下各种通信机制:
一、共享存储器系统
在共享存储器系统中,相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。
因些按照共享内容的不同,可将其分为以下两种类型:
1. 基于共享数据结构的通信方式
也称为我们上面讲到的信号量机制,此方式要求诸进程共用某些数据结构,借以实现进程间的信息交换,
共享数据结构的一个例子就是存放消息的共享缓冲池,对其的操作需要使用信号量来保证诸进程间同步的进行。
2. 基于共享数据区的通信方式
为了传输大量的数据,OS 在内存中划出一块共享存储区域,诸进程通过该共享区域读写或交换信息,实现通信。
数据形式、位置、访问控制都是由进程来控制的。
需要通信的进程在通信之前,先向系统申请共享存储区的一个分区,并将其附加到自已的地址空间中(如果不添加,访问时会产生地址越界中断,后续的内存管理中进行详细讲解),便可对其中的数据进行正常的读、写,操作完成或都在不需要时,再将分区归还给共享存储区。
也因为其一次可以操作一个分区,并可将大量的数据读取或者写入分区,所以这种方式也属于高级通信。
另外,因为数据不需要在进程之间复制,所以这是最快的一种进程通信机制。
二、管道(pipi)通信系统
所谓 “管道” 是指连接一个读进程 和 一个写进程以实现他们之间通信的一个共享文件,又名 pipe 文件。
管道 分为两种: 无名管道 ,命名管道。
1. 无名管道
这是Unix 早期的一种通信方式,是半双工通信,只能用于父子进程或兄弟进程间,并且它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
2. 命名管道(FIFO)
可以用于在无关进程间交换数据,FIFO也就是先进先出,有路径名与命名管道关联,它以一种特殊设备形式存在于文件系统中,并且可以实现半双工或全双工的通信。
FIFO 常用于客户–服务器应用程序中,被作为 汇聚点,在客户进程和服务器进程之间传递数据。
三、消息传递系统
学自,https://blog.csdn.net/qq_34666857/article/details/103162132
待学习