手机的两个独立系统,是不是也有两个独立内存和共享内存

颠覆大数据分析之Spark VS分布式共享内存系统

(1991)所提到的传统的分布式共享内存(DSM)系统则略有不同DSM系统允许单独读写内存,而Spark只允许进行粗粒度的RDD转换尽管这限制了能够使鼡Spark的应用种类,但它对于实现高效的容错性却很有帮助DSM系统可能会需要检查点相互协作来完成容错,比如说使用Boukerche等人(2005)所提出的协议相反的,Spark只需要存储世系图来进行容错恢复需要在RDD丢失的分区上进行重构操作——但这个可以并行地高效完成。Spark与DSM系统的另一个根本嘚不同在于由于RDD的只读特性,Spark中可以使用流浪者缓解策略——这使得备份任务可以并行地完成这类似于MR中的推测执行(Dinu和Ng 2012)。而在DSM中則很难缓解流浪者或者备份任务因为这两者都可能会产生内存竞争。Spark的另一个优点是当RDD的大小超出集群的所有内存时可以优雅地进行降級它的缺点就是RDD的转换本质上是粗粒度的,这限制了能够开发的应用的种类比如说,需要细粒度共享状态访问的应用像WEB爬虫或者其咜WEB应用,都很难在Spark上实现Piccolo (Power和 Li 2010)提供了一个以数据为中心的异步编程模型,这或许是这类应用的一个更好的选择

在Spark中,开发人员调用map,filter或reduce操莋时可以传入函数或者闭包一般来说,当Spark在工作节点上运行这些函数的时候函数使用域内的本地变量会被拷贝出来。Spark有一个共享变量嘚概念它使用广播变量和累加器来模拟“全局”变量。开发人员使用广播变量一次性地将只读数据拷贝给所有的工作者(类共轭梯度下降的算法中的静态矩阵可以使用广播变量来表示)累加器是只能由工作者来增加并由驱动程序去读取的变量——这样并行聚合可以实现成支持容错的。值得注意的是全局变量是在Spark中模仿DSM功能的一种特殊方式

原创文章,转载请注明: 转载自本文链接地址:

补充相关内容使词条更完整,還能快速升级赶紧来

中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存就如同 malloc() 函数向不同进程返回了指向同一个

。當一个进程改变了这块

中的内容的时候其它进程都会察觉到这个更改。

因为所有进程共享同一块内存

在各种进程间通信方式中具有最高的效率。访问共享内存区域和访问进程独有的内存区域一样快并不需要通过

的过程来完成。同时它也避免了对数据的各种不必要的复淛

因为系统内核没有对访问共享内存进行同步,您必须提供自己的同步措施例如,在数据被写入之前不允许进程从共享内存中读取信息、不允许两个进程同时向同一个共享内存地址写入数据等解决这些问题的常用方法是通过使用

进行同步。不过我们的程序中只有一個进程访问了共享内存,因此在集中展示了共享内存机制的同时我们避免了让代码被同步逻辑搞得混乱不堪。

进程必须首先分配它。隨后需要访问这个共享内存块的每一个进程都必须将这个共享内存绑定到自己的

中当完成通信之后,所有进程都将脱离共享内存并且甴一个进程释放该共享内存块。

模型可以有助于解释这个绑定的过程在 Linux 系统中,每个进程的

是被分为许多页面的这些内存页面中包含叻实际的数据。每个进程都会维护一个从

到虚拟内存页面之间的映射关系尽管每个进程都有自己的内存地址,不同的进程可以同时将同┅个内存页面映射到自己的地址空间中从而达到共享内存的目的。

分配一个新的共享内存块会创建新的内存页面因为所有进程都希望囲享对同一块内存的访问,只应由一个进程创建一块新的

再次分配一块已经存在的内存块不会创建新的页面,而只是会返回一个标识该內存块的

一个进程如需使用这个共享内存块,则首先需要将它绑定到自己的

中这样会创建一个从进程本身

到共享页面的映射关系。当對共享内存的使用结束之后这个映射关系将被删除。当再也没有进程需要使用这个共享内存块的时候必须有一个(且只能是一个)进程负责释放这个被共享的内存页面。

所有共享内存块的大小都必须是系统页面大小的整数倍系统页面大小指的是系统中单个内存页面包含的字节数。在 Linux 系统中内存页面大小是4KB,不过您仍然应该通过调用

该函数的第一个参数是一个用来标识共享内存块的键值彼此无关的進程可以通过指定同一个键以获取对同一个共享内存块的访问。不幸的是其它程序也可能挑选了同样的特定值作为自己分配共享内存的鍵值,从而产生冲突用特殊

IPC_PRIVATE作为键值可以保证系统建立一个全新的共享内存块。

该函数的第二个参数指定了所申请的内存块的大小因為这些内存块是以页面为单位进行分配的,实际分配的内存块大小将被扩大到页面大小的整数倍

IPC_CREAT:这个标志表示应创建一个新的共享内存块。通过指定这个标志我们可以创建一个具有指定键值的新共享内存块。

IPC_EXCL:这个标志只能与 IPC_CREAT 同时使用当指定这个标志的时候,如果巳有一个具有这个键值的共享内存块存在则shmget会调用失败。也就是说这个标志将使线程获得一个“独有”的共享内存块。如果没有指定這个标志而系统中存在一个具有相同键值的共享内存块shmget会返回这个已经建立的共享内存块,而不是重新创建一个

模式标志:这个值由9個位组成,分别表示属主、属组和其它用户对该内存块的访问权限其中表示执行权限的位将被忽略。指明访问权限的一个简单办法是利鼡<sys/stat.h>中指定并且在手册页第二节stat条目中说明了的常量指定。例如S_IRUSR和S_IWUSR分别指定了该内存块属主的读写权限,而 S_IROTH和S_IWOTH则指定了其它用户的读写權限 下面例子中

函数创建了一个新的共享内存块(当shm_key已被占用时则获取对一个已经存在共享内存块的访问),且只有属主对该内存块具囿读写权限其它用户不可读写。

标识符如果该共享内存块已经存在,系统会检查访问权限同时会检查该内存块是否被标记为等待摧毀状态。

要让一个进程获取对一块

SHMID 传递给这个函数作为第一个参数该函数的第二个参数是一个

,指向您希望用于映射该共享内存块的进程

;如果您指定NULL则Linux会自动选择一个合适的地址用于映射第三个参数是一个标志位,包含了以下选项:

SHM_RND表示第二个参数指定的地址应被向丅靠拢到内存页面大小的整数倍如果您不指定这个标志,您将不得不在调用

的时候手工将共享内存块的大小按页面大小对齐 SHM_RDONLY表示这个內存块将仅允许读取操作而禁止写入。 如果这个

成功则会返回绑定的共享内存块对应的地址通过 fork 函数创建的

同时继承这些共享内存块;洳果需要,它们可以主动脱离这些共享内存块 当一个进程不再使用一个共享内存块的时候应通过调用 shmdt(Shared Memory Detach,脱离共享内存块)函数与该共享内存块脱离将由 shmat 函数返回的地址传递给这个函数。如果当释放这个内存块的进程是最后一个使用该内存块的进程则这个内存块将被刪除。对 exit 或任何exec族函数的调用都会自动使进程脱离共享内存块

)函数会返回一个共享内存块的相关信息。同时 shmctl 允许程序修改这些信息該函数的第一个参数是一个共享内存块标识。

要获取一个共享内存块的相关信息则为该函数传递 IPC_STAT 作为第二个参数,同时传递一个指向一個 struct shmid_ds 对象的

要删除一个共享内存块则应将 IPC_RMID 作为第二个参数,而将 NULL 作为第三个参数当最后一个绑定该共享内存块的进程与其脱离时,该共享内存块将被删除

您应当在结束使用每个共享内存块的时候都使用 shmctl 进行释放,以防止超过系统所允许的共享内存块的总数限制调用 exit 和 exec 會使进程脱离共享内存块,但不会删除这个内存块 要查看其它有关共享内存块的操作的描述,请参考

代码 5.1 中的程序展示了共享内存块的使用

使用ipcs 命令可用于查看系统中包括

机制的信息。指定-m参数以获取有关共享内存的信息例如,以下的示例表示有一个编号为1627649的共享内存块正在使用中:

00000 —— 1627649 user 640 25600 0 如果这个共享内存块在程序结束后没有被删除而是被错误地保留下来您可以用

共享内存块提供了在任意数量的进程之间进行高效双向通信的机制。每个使用者都可以读取写入数据但是所有程序之间必须达成并遵守一定的协议,以防止诸如在读取信息之前覆写内存空间等竞争状态的出现不幸的是,Linux无法严格保证提供对共享内存块的独占访问甚至是在您通过使用IPC_PRIVATE创建新的共享内存塊的时候也不能保证访问的独占性。 同时多个使用共享内存块的进程之间必须协调使用同一个键值。

当前经验712分升级还需728

=========================
就是说WIN7可以自动共享内存,不用设置吗

我已经买完了1G的GTX560TI,折价卖很不划算啊!

我要回帖

更多关于 独立内存和共享内存 的文章

 

随机推荐