【IT168 技术】共享内存是一种使计算机程序能够同时共享内存资源以实现更高性能和更少冗余数据副本的技术。共享系统内存可以在单处理器系统、并行多处理器或集群微处理器上运行。对于分布式系统会有一些差异,但共享内存也可以其上运行。
共享内存的可扩展性不高,数据一致性也是一个问题。但是在适当的环境中并且运行缓存一致性协议,相对于这些问题,共享内存带来了更多的优势。
共享内存是一类进程间通信(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