共享内存和消息传递

转载 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============

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

unity进程间通信

在windows系统上,进程间通信是一种很古老,很成熟的技术了,但是遇到unity这种技术就有点不好使了。最近项目需要进程间通信,我试了很多方法就是不好使,最后只能用socket。我用到的通信方式有以...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Linux进程间通信——使用共享内存

下面将讲解进程间通信的另一种方式,使用共享内存。 一、什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的...
  • ljianhui
  • ljianhui
  • 2013年08月24日 10:26
  • 154234

CUDA学习--内存处理之共享内存(3)

1.共享内存共享内存实际上是可受用户控制的一级缓存。每个SM中的一级缓存与共享内存共享一个64KB的内存段。在实际中,共享内存的速度几乎在所有的GPU中都一致(大约为1.5TB/s的带宽),因为共享内...

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

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

多进程、共享内存的网络聊天室

好久没写网络聊天室了,去年暑假可以说写了一暑假,最近复习这些,又因为我一直偏向于多线程,就用多进程复习一下。下面给出昨天写的基于多进程、共享内存的网络聊天室代码。每个进程负责一个连接,多个进程之间仅共...

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

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

[转]进程间通过共享内存方式传输大数据

转自:blog.chinaunix.net/uid-20682890-id-3567309.html 通过共享内存和信号量的乒乓机制实现大数据块在不同程序之间的数据传输。 zips:htt...
  • hailmy
  • hailmy
  • 2016年09月22日 09:37
  • 847

JMS两种消息模型

前段时间学习EJB,接触到了JMS(Java消息服务),JMS支持两种消息模型:Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub),即点对点和发布订阅模型。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:共享内存和消息传递
举报原因:
原因补充:

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