共享内存和消息传递

转载 2017年01月03日 12:04:07

线程通信机制:共享内存 VS 消息传递

在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间如何交换信息。

目前有两种方式:

1、共享内存

2、消息传递(actor 模型)

 

共享内存

共享内存这种方式比较常见,我们经常会设置一个共享变量。然后多个线程去操作同一个共享变量。从而达到线程通讯的目的。例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量count来记录任务完成的数量。每当一个线程完成抓取任务,会在原来的count上执行加1操作。这样每个线程都可以通过获取这个count变量来获得当前任务的完成情况。当然必须要考虑的是共享变量的同步问题,这也共享内存容易出错的原因所在。

这种通讯模型中,不同的线程之间是没有直接联系的。都是通过共享变量这个“中间人”来进行交互。而这个“中间人”必要情况下还需被保护在临界区内(加锁或同步)。由此可见,一旦共享变量变得多起来,并且涉及到多种不同线程对象的交互,这种管理会变得非常复杂,极容易出现死锁等问题。

 

消息传递

消息传递方式采取的是线程之间的直接通信,不同的线程之间通过显式的发送消息来达到交互目的。消息传递最有名的方式应该是actor模型了。在这种模型下,一切都是actor,所有的actor之间的通信都必须通过传递消息才能达到。每个actor都有一个收件箱(消息队列)用来保存收到其他actor传递来的消息。actor自己也可以给自己发送消息。这才是面向对象的精髓啊!

这种模型看起来比共享内存模型要复杂。但是一旦碰到复杂业务的话,actor模型的优势就体现出来了。我们还是以刚才多线程抓取网站为例子看一下在这种模型下如何去解决。

 

首先我们定义一个统计actor用来统计任务完成量。然后把多个网址(消息方式)发给多个抓取actor,抓取actor处理完任务后发送消息通知统计actor任务完成,统计actor对自己保存的变量count(这个只有统计actor才能看到)加一。

 

最后让我们来总结一下这两种通讯模式:

并发模型 通信机制 同步机制
共享内存

线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。

同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。

消息传递(actor)

线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。

由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。

============END============

       在信息传递模型中,不同的通信核心层不会共享同一个内存空间。由于大部分现流行的处理器的指令集架构缺乏本机扩展程序,用以提供在指令层中传递信息的基元,所以一般情况下,信息传递通常需要需要大量的系统开销。正因为这些系统开销,通常信息的传递无法频繁的进行,还是需要通过共享内存的方式来实现处理器之间的批量数据传送。

相关文章推荐

管道、消息队列、共享内存之间的区别与联系

 管道和消息队列的区别 管道(PIPE)      管道通信方式的中间介质是文件,通常称这种文件为管道文件。两个进程利用管道文件进行通信时,一个进程为写进程,另一个进...

Linux进程间通信 共享内存+信号量+简单例子

每一个进程都有着自己独立的地址空间,比如程序之前申请了一块内存,当调用fork函数之后,父进程和子进程所使用的是不同的内存。因此进程间的通信,不像线程间通信那么简单。但是共享内存编程接口可以让一个进程...

Actor并发模型&基于共享内存线程模型

先从著名的c10k问题谈起。有一个叫Dan Kegel的人在网上(http://www.kegel.com/c10k.html)提出:现在的硬件应该能够让一台机器支持10000个并发的client。然...

linux 管道、消息队列、共享内存的对比

------管道 管道的优点是不需要加锁,缺点是默认缓冲区太小,只有4K,同时只适合父子进程间通信,而且一个管道只适合单向通信,如果要双向通信需要建立两个。而且不适合多个子进程,因为消息会乱,它的发送...

线程通信机制---共享内存:消息传递

在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间如何交换信息。 目前有两种方式: 1、共享内存 2、消息传递(actor 模型)   共享内存 ...

Linux程序设计——信号量、共享内存和消息队列

1、信号量 多线程程序中总有一部分临界代码,编程人员必须确保只有一个进程可以进入临界代码并拥有对资源的独占式访问权。使用信号量机制可以确保进程之间的并发执行。信号量是一个特殊的变量,只允许对它进行等...
  • furney
  • furney
  • 2012-05-15 15:38
  • 1494

vxworks中任务间的通信支持信号量、消息队列、管道、信号、事件、共享内存等

2010/11/14 21:47vxworks中任务间的通信支持信号量、消息队列、管道、信号、事件、共享内存等。一:信号量信号量分二进制信号量、互斥信号量、计数信号量。1:二进制信号量(1)semBC...

现在最常用的进程间通信的方式有:管道,信号,信号量,消息队列,共享内存。

所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂。机制不同,复杂度也不一样。通信是一个广义上的意义,不仅仅指传递一些massege。    他们的使用方法是基本相同的,所以只要...

【转】linux的消息队列与共享内存编程

/*********************程序相关信息********************* 程序编号:012 程序编写起始日期:2008.11.1 程序编写完成日期:2008.11.1 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)