文档章节

进程通信

noteman
 noteman
发布于 2016/08/25 16:23
字数 1844
阅读 22
收藏 0

参考地址:

http://www.cnblogs.com/applebunny/archive/2012/07/11/2586483.html

 程序员必须让拥有依赖关系的进程集协调,这样才能达到进程的共同目标。可以使用两种技术来达到协调。第一种技术在具有通信依赖关系的两个进程间传递信息。这种技术称做进程间通信(interprocess communication)。第二种技术是同步,当进程间相互具有合作依赖时使用。这两种类型的依赖关系可以同时存在。

一般而言,进程有单独的地址空间。我们可以了解下可执行程序被装载到内存后建立的一系列映射等理解这一点。如此以来意味着如果我们有两个进程(进程A和进程B),那么,在进程A中声明的数据对于进程B是不可用的。而且,进程B看不到进程A中发生的事件,反之亦然。如果进程A和B一起工作来完成某个任务,必须有一个在两个进程间通信信息和时间的方法。我们这里可以去看看基本的进程组件。注意进程有一个文本、数据以及堆栈片断。进程可能也有从自由存储空间中分配的其它内存。进程所占有的数据一般位于数据片断、堆栈片断或进程的动态分配内存中。数据对于其它进程来说是受保护的。为了让一个进程访问另外一个进程的数据,必须最终使用操作系统调用。与之类似,为了让一个进程知道另一个进程中文本片断中发生的事件,必须在进程间建立一种通信方式。这也需要来自操作系统API的帮助。当进程将数据发送到另一进程时,称做IPC(interprocess communication,进程间通信)。

下面先列举几种不同类型的进程间通信方式:

进程间通信主要包括管道, 系统IPC(包括消息队列,信号量,共享存储), SOCKET.

  Windows系统进程间通信

Windows提供了多种机制,使得应用程序之间能够快速、方便地共享数据和信息。这些机制包括RPC、COM、OLE、DDE、消息、剪切板、邮件槽、管道、套接字等。但是,如果在同一台机器上的多个进程间进行通信的话,那么上面的机制都与共享内存有关。这在Windows上称作内存映射文件。

  这种数据共享机制是通过让两个或多个进程映射同一文件映射对象的视图来实现,这意味着进程间共享相同的物理存储页面。因此,当一个进程在文件映射对象的视图中写入数据时,其他的进程会在它们的视图中立刻看到变化。但是,对多个进程共享同一个文件映射对象来说,所有进程使用的文件映射对象的名称必须完全相同[1]。

Linux系统进程间通信

  linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。Linux则把两者继承了下来。

  Linux下的进程间通信机制大致包括:管道、信号(在Windows上成为消息)、信号队列(实际是消息链表)、共享内存、信号量、套接字。

共同点

 由上面的分析可以看出两个操作系统共有的且用的较多的进程间通信机制有:管道、消息、共享内存和套接字。简介如下:

  管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

   信号或者消息(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。

   共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

   套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。

总结

消息队列是消息的链接表,消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点;而信号量主要作为进程间以及同一进程不同线程之间的同步手段。

   个人认为:管道、剪贴板、共享内存都是基于共享内存的方式。而消息、消息队列和套接字的都是基于发消息的机制,只是看是在同一个机器上发还是在网络中发消息而已(套接字可以看做在网络中发送消息)。至于RPC、COM、OLE、DDE主要是在客户端和服务器端生成一个统一的接口。也就是说这几个通信手段其实就相当于网络上的协议。在同一层通信的协议不管下一层,好像这两层直接建立了联系。这个基本的思想是在本地建立类似存根代码的代码,而在远程建立类似桩代码的代码来进行连接。

   这上面的通信方式中,剪切板和匿名管道只能实现同一机器上两个进程间的通信,而信号量、消息、消息队列和共享内存也只能在同一台机器上的多个进程间通信;但是命名管道、邮件槽和套接字不仅可以实现同一机器上的两个进程的通信,还可以实现跨网络的进程间通信;另外,油槽和套接字可以实现一对多的通信,而命名管道只能是点对点的单一通信,但油槽的缺点是数据量较小,通常都是在424字节以下,如果数据量较大,则可以采用命名管道和套接字的方式来完成。综上:在跨网络通信中套接字无疑是最优秀的通信方式,这或许是伯克利开发套接字来进行网络通信的初衷吧(传统通信方式不好用)。

本文转载自:http://www.cnblogs.com/applebunny/archive/2012/07/11/2586483.html

noteman
粉丝 14
博文 233
码字总数 44869
作品 0
六安
私信 提问

暂无文章

tomcat 莫名奔溃问题

Apr 24, 2019 6:18:11 PM org.apache.coyote.AbstractProtocol pause INFO: Pausing ProtocolHandler ["http-nio-8080"] Apr 24, 2019 6:18:12 PM org.apache.coyote.AbstractProtocol pause......

mellen
20分钟前
0
0
组件开发规范 class名身份识别

组件需要通过一个组件共有的class来标识这个组件,外部调用的时候,可以通过锁定这个class来方便地改变组件的css样式。 设置方式 .my-checkbox { width: 20px; height: 20px; font-...

Carbenson
28分钟前
1
0
如何在工作中快速成长?致工程师的10个简单技巧

阿里妹导读:阿里有句非常经典的土话,“今天的最好表现,是明天的最低要求。”如何挖掘潜能、发现更好的自己?今天,阿里巴巴高级无线开发专家江建明将认知升级的方法总结出来,帮助你获得快...

阿里云云栖社区
47分钟前
2
0
PHP和Redis实现在高并发下的抢购及秒杀功能

抢购、秒杀是平常很常见的场景,面试的时候面试官也经常会问到,比如问你淘宝中的抢购秒杀是怎么实现的等等。 抢购、秒杀实现很简单,但是有些问题需要解决,主要针对两个问题: 一、高并发对...

xiaogg
49分钟前
1
0
从数据上看:谁才是漫威的绝对C位

复联4上映了!这次比美国还早了两天。当然,我还没看,不会给你们剧透,当然也不想不剧透。 这一部不仅是灭霸这一线剧情的结局,也被认为漫威第三阶段的收官之作。据说此部之后,不少影迷熟知...

crossin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部