共享内存是一种使计算机程序能够同时共享内存资源以实现更高性能和更少冗余数据副本的技术。共享系统内存可以在单处理器系统、并行多处理器或集群微处理器上运行。对于分布式系统会有一些差异,但共享内存也可以其上运行。

  共享内存的可扩展性不高,数据一致性也是一个问题。但是在适当的环境中并且运行缓存一致性协议,相对于这些问题,共享内存带来了更多的优势。

  共享内存是一类进程间通信(IPC)技术,它改善了计算机组件之间的通信。

Pexels 上的 Valentine Tanasovich 拍摄的照片

  什么是共享内存进程?

  在最简单的形式中,共享内存是单个服务器上的低级编程过程,使客户端和服务器能够使用主内存交换数据和指令。其性能比使用操作系统数据缓冲区等系统服务要快得多。

  例如,客户端需要与服务器交换数据以进行修改和返回。没有共享内存,客户端和服务器都使用操作系统缓冲区来完成修改和交换。

  客户端写入缓冲区中的输出文件,服务器将文件写入其工作区。完成修改后,该过程会反转。每发生一次,系统在客户端和服务器之间生成2次读取和2次写入。

  使用共享内存,客户端将其进程直接写入RAM并发出信号量值以标记服务器注意。服务器直接在主内存中完成修改,并通过更改信号量值来警告客户端。每次通信只有1次读取和1次写入,读取/写入比使用系统服务快得多。

  共享内存和单个微处理器通用流程

  ·服务器使用系统调用来请求共享内存密钥,并记住返回的ID。

  ·服务器启动。

  ·服务器发出另一个系统调用,将共享内存附加到服务器的地址空间。

  ·服务器初始化共享内存。

  ·客户端启动。

  ·客户端请求共享内存。

  ·服务器向客户端发出唯一的内存ID。

  ·客户端将共享内存ID附加到地址空间并使用内存。

  ·完成后,客户端将分离所有共享内存段并退出。

  ·使用两个以上的系统调用,服务器分离并删除共享内存。

  多处理器共享内存

  这种简化方案适用于单个微处理器,而多个微处理器之间的内存共享更加复杂,尤其是当每个微处理器都有自己的内存缓存时。目前比较流行的方法有统一内存访问(UMA)和非统一内存访问(NUMA)。分布式内存共享也是可能的,尽管使用的是不同的共享技术。

  UMA:并行计算环境中的共享内存

  在并行计算中,多处理器使用相同的物理内存并且并行地进行访问,尽管处理器也可以具有私有内存缓存。共享内存可加速处理那些时间至关重要的大型应用程序的并行执行。

  NUMA:对称多处理器系统(SMU)中的共享内存

  NUMA将SMU配置为使用共享内存。SMU是一种集群架构,它将多个处理器紧密地耦合在一个单独的服务器环境中,只需一个操作系统。由于每个处理器使用相同的总线,因此密集型操作会降低性能并增加延迟。

  NUMA通过将CPU和内存资源分组为称为NUMA节点的配置来替换单个系统总线。多个高性能节点在集群内高效运行,允许CPU将其分配的节点视为本地共享内存资源。这减轻了总线上的负载,并将其分配给灵活的、高性能内存节点。

  分布式系统中的共享内存

  分布式共享内存使用不同的技术,但结果相同:独立的计算机共享内存以获得更好的性能和可伸缩性。分布式共享内存使单独的计算机系统能够通过将其从服务器级别抽象为逻辑共享的地址空间来访问彼此的内存。

  该体系结构可以分离存储器并在节点和主存储器之间分配部件,或者可以在节点之间分配所有存储器。分布式内存共享使用硬件(网络接口和高速缓存一致性电路)或软件。与单处理器或多处理器共享内存不同,分布式内存共享可以高效扩展,并支持密集处理任务,如大型复杂数据库。

  共享内存的挑战

  共享内存编程在单CPU或集群CPU中非常简单。所有处理器共享相同的数据视图,并且它们之间的通信非常快,共享内存编程是一个相对简单的事情。

  但是,除了主存储器之外,大多数多处理器系统还为其处理器分配单独的高速缓冲存储器。高速缓存存储器处理比使用RAM快得多,但如果同一系统也使用共享存储器,则可能导致冲突和数据降级。在高速缓存存储器体系结构中共享存储器有三个主要问题:访问时间缩短,数据不连贯和错误共享。

  访问时间缩短

  多个处理器通过同时访问相同的内存位置而导致争用和性能下降。因此,非分布式共享内存系统不能在十个处理器上非常有效地扩展。

  数据不连贯

  具有内存共享的多个处理器通常具有单独的内存缓存以加速性能。在该系统中,两个或更多个处理器可以具有相同存储器位置的高速缓存副本。两个处理器都在不知道另一个缓存修改的情况下修改数据,这意味着应该相同的数据——即互相耦合——现在是不连贯的,并且当数据被写回主存储器时可能导致损坏。

  缓存一致性

  高速缓存一致性协议通过同步多个高速缓存中的数据值来管理这些冲突。每当缓存传播修改回共享内存位置时,数据保持一致。高速缓存一致性可保护高性能高速缓存,同时支持内存共享。

  错误共享

  此内存使用模式会降低性能,并在具有共享内存和单个处理器高速缓存的多处理器系统中发生。缓存通过从指定的内存位置和附近位置读取数据来工作。(高速缓存行的最小大小为64字节。)当处理器访问包含可修改数据或变量的共享块时,会出现问题。一个处理器是否实际修改了该数据并不重要; 读取更改后,其他缓存将重新加载整个块。缓存一致性协议不会启动重新加载,也不会向其授予任何资源,因此传入的进程必须承担开销。这会强制主总线重新连接每次写入共享内存位置,从而降低性能且浪费带宽。

  编程是解决方案

  “缓存填充”可以在精确的内存位置与其邻居之间插入无意义的字节,因此单个64字节缓存行仅写入确切的数据。高速缓存一致性执行同步,因此不会强制其他高速缓存重新加载其块。

  共享内存优势

  多个应用程序共享内存以提高处理效率

  ·在程序之间有效地传递数据,以提高通信和效率。

  ·适用于单微处理器系统,多处理器并行或对称系统以及分布式服务器。

  ·通过管理缓存中主内存中的共享数据来避免冗余数据副本。

  ·通过使程序能够访问已在内存中的单个数据副本,最大限度地减少输入/输出(I / O)进程。

  ·对于程序员来说,共享内存的主要优点是不需要为处理器交互和通信编写显式代码。

  高速缓存一致性协议可以保护共享内存免受数据不连贯和性能下降的影响。

  原文作者:Christine Taylor

showdialog 尝试读取或写入受保护的内存_共享内存在不同系统的应用与优劣详解...相关推荐

  1. showdialog 尝试读取或写入受保护的内存_TreadMarks: 基于工作站网络的共享内存计算...

    TreadMarks: 基于工作站网络的共享内存计算 以前学MIT6.824时看过TreadMarks相关论文,这篇论文当时只翻译了一半.最近无意中看到这篇未完成的翻译,google了下发现仍然没有人 ...

  2. showdialog 尝试读取或写入受保护的内存_超频内存比超频CPU收益更大!影驰HOF OC Lab皑钻DDR4-4400评测...

    一.前言:名人堂超频实验室打造HOF OC Lab皑钻 最高可达5000MHz 超频对于DIY而言意味着什么呢?或许你可以说,DIY究极的追究就是极限的超频!早在2013年,影驰就创立了全球首家专业的 ...

  3. showdialog 尝试读取或写入受保护的内存_?电脑组装内存要怎么选,安钛克KATANA RGB 内存超频实测...

    内存,又称主存,是CPU用来直接寻址和存储的空间,它相当于一座桥梁,用以负责诸如硬盘.主板.显卡等硬件上的数据与处理器之间数据交换处理,我们可以把内存看作数据缓存区,一个高速的缓存区.通俗来讲,这座桥 ...

  4. showdialog 尝试读取或写入受保护的内存_修改电压和时序,超频上3733,十铨火神3200 16G套装内存评测...

    十铨科技成立于1997,在存储当中算得上是老选手,但显然其名气不如金士顿.海盗船等,不过在内存老玩家心中,或许十铨的人气值更高,毕竟老玩家还是十分注重C/P值.同时十铨内存的终身质保服务给所有消费者提 ...

  5. showdialog 尝试读取或写入受保护的内存_轻松一键上4000MHz,XPG龙耀D50 重装RGB内存值不值得高端用户选购?...

    随着今年intel.AMD.nvidia分别推出旗下的高端硬件产品迭代提升,处理器和显卡性能也迎来了新的飞跃,对不少游戏玩家等高端用户来说,有了强劲的硬件,还需要高频内存才能补齐短板,让整机性能再上一 ...

  6. C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

    用VS2012调试时发现在调用数据集时提示"尝试读取或写入受保护的内存.这通常指示其他内存已损坏." 用管理员身份运行CMD,输入netsh winsock reset并回车 转载 ...

  7. C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。错误类型为:System.AccessViolationException。...

    C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏.解决方案 报错 dll文件应该是C++写的.封装了之后供我的C#程序调用,结果就提示了错误:尝试读取或写入受保护的内存.这通常指示其他内存已 ...

  8. asp.net报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决办法...

    "System.AccessViolationException"类型的未经处理的异常在 System.Data.dll 中发生 其他信息: 尝试读取或写入受保护的内存.这通常指示 ...

  9. halcon图片上传到mysql_C# 10个线程并发执行Halcon图像算法 报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”...

    如题,这个问题本人已经纠结了快三个工作日了.本人不同WinFrom程序一起动就会开启10个线程,并发对10张图片进行算法处理,问题是只要程序一起动就会报"尝试读取或写入受保护的内存.这通常指 ...

最新文章

  1. python中mode_python中的model模板中的数据类型
  2. 快速排序 (Quick Sort)(Java实现)
  3. CentOS6.5安装ElasticSearch6.2.3
  4. gtj2018如何生成工程量报表_土建软件GTJ2018中的十个问题及解决方法
  5. 使用devops的团队_DevOps团队的3种指标仪表板
  6. 电动汽车冬季悲歌:我不是在充电,就是在充电的路上
  7. 【android开发】:android真机测试
  8. USB及手机平板设备插拔响应解决方案
  9. 转载:制造业信息化:计划模拟APS软件驱动敏捷制造
  10. R语言混合线性模型包代码演示
  11. C++使用Socks5协议进行代理上网(一)
  12. 关于修复Office图标白色的问题
  13. 后端面试(一)计算机网络相关
  14. ForkJoinPool的使用及基本原理
  15. body 没有被撑开_div层为什么没有被自动撑开
  16. 如何导出微信公众号文章数据!
  17. Mean-shift算法的直观理解
  18. debian修改源的方法
  19. Handle Protocol
  20. ubuntu 终端显示英文,桌面环境显示中文方法

热门文章

  1. 其实你做的大部分工作都是浪费
  2. 大厂面试必问的 4 大开源框架,你真会吗?
  3. 5月,我面试了60多号人,写了些总结
  4. 拜托,别再问我贪心算法了!
  5. 如何拿到高薪数据分析师offer?从精准解读一篇招聘信息开始!
  6. 为什么说 Java 程序员到了必须掌握 Spring Boot 的时候?
  7. 国内外最好用的9大工作任务管理软件
  8. duilib 预开篇
  9. 关系的三类完整性约束的描述
  10. java一个点向着另一个点移动_java – 在线性路径中从一个点移动一个对象