共享内存技术调研

共享内存技术调研

1.      研究目的

在调研仿真分布式解决方案时遇到一个问题,在服务器中不同软件之间如何高效的进行通讯,这里涉及到了不同的操作系统(windows和Linux),不同的使用功能(虚实融合,数字仿真),需求不同需要的信息传递效率要求不同,因此需要调研现有的技术,找到适合使用的方案。

2.      通讯方法

2.1.        服务器内部软件之间的通讯方法

[1]    直接内存访问(Direct Memory Access,DMA):这是一种允许特定硬件组件直接从系统内存中读取数据的技术。DMA控制器负责控制数据的传输,而不需要CPU的干预。这种通讯方法通常用于高速数据传输,如磁盘驱动器和网络接口卡。

[2]    共享内存:这是服务器内部软件之间最常用的通讯方法之一。多个进程或线程可以访问和修改共享内存区域,从而实现数据的快速交换。共享内存允许多个软件组件之间进行高效的数据共享和协作。

[3]    消息队列:这是一种允许进程或线程之间发送和接收消息的通信方法。消息队列通常由操作系统提供,并可以用于在不同软件组件之间传递数据和事件。

[4]    套接字(Socket):这是一种用于网络通信的编程接口,但也可以用于服务器内部软件之间的通讯。套接字允许软件组件之间通过TCP或UDP协议进行数据交换。

[5]    远程过程调用(Remote Procedure Call,RPC):这是一种允许一个进程(客户端)通过网络向另一个进程(服务器)发送请求的通信方法。RPC允许不同进程之间进行交互和共享数据,通常用于分布式系统和多线程应用程序。

2.2.        共享内存技术的优缺点介绍

优点:

l   方便高效:使用共享内存进行进程间通信非常方便,而且函数的接口也简单,数据的共享使进程间的数据不用传送,而是直接访问内存,加快了程序的效率。同时,它也不像匿名管道那样要求通信的进程有一定的父子关系。

l   通信速度快:共享内存是所有进程间通信速度最快的。

缺点:

l   同步问题:共享内存没有提供同步的机制,这使得我们在使用共享内存进行进程间通信时,往往要借助其他的手段来进行进程间的同步工作。如果对共享的内存区域进行读写操作,必须确保各个并发进程在关键部分上互斥地访问共享区域,否则可能会引发一些并发问题。

l   死锁问题:如果进程在等待其它进程释放共享内存,而其它进程由于某种原因无法释放,这时就会发生死锁。

l   内存空间问题:多个进程同时访问共享内存,因此需要大量的额外内存空间。

l   实现难度问题:使用共享内存需要对系统进行额外编程,这可能会增加实现的难度和复杂性。

3.      服务器数据库

3.1.        适合服务器使用的内存数据库主要有:

  • Oracle数据库:Oracle是一款功能强大的关系型数据库管理系统,广泛用于企业级应用、Web应用程序和数据仓库等场景。它提供了高性能、可扩展性和安全性,支持大量并发用户访问。
  • MySQL数据库:MySQL是一款流行的开源关系型数据库管理系统,适用于各种规模的应用程序。它具有高性能、可扩展性和易用性,支持大量并发用户访问,并且提供了丰富的应用程序接口(API)。
  • PostgreSQL数据库:PostgreSQL是一款强大的开源关系型数据库管理系统,适用于高端应用场景。它提供了高性能、可扩展性和安全性,支持全文搜索、事务隔离级别和行级锁定等功能。
  • MongoDB数据库:MongoDB是一款流行的开源文档数据库管理系统,适用于Web应用程序和大数据应用场景。它支持非结构化和半结构化数据存储,具有高性能、可扩展性和易用性,并且提供了丰富的查询语言和数据操作API。
  • Redis数据库:Redis是一款开源的内存数据结构存储系统,适用于高速缓存、会话管理、消息队列等场景。它支持键值对存储和高速读写访问,并且提供了丰富的数据类型和操作命令。

3.2.        Redis数据库是基于内存的,转存到MongoDB数据库的方法主要有:

  1. 使用Redis的持久化功能:Redis提供了RDB和AOF两种持久化方式,可以将Redis中的数据定期或实时地保存到磁盘上。然后可以编写脚本将持久化文件中的数据导入到MongoDB中。
  2. 使用Redis的发布-订阅功能:Redis的发布-订阅功能可以让多个客户端订阅同一个频道,并在频道上发布消息。可以将Redis集合中的数据作为消息发布到一个频道上,然后编写订阅该频道的客户端程序,在接收到消息时将数据存储到MongoDB中。

4.      共享内存服务器产品

4.1.        软件产品

  1. Boost.Interprocess库:这是一个C++库,专门用于实现跨进程的内存共享和文件共享。它提供了一系列用于创建、删除、附加和映射共享内存的类和函数,可以方便地实现进程间数据共享,并支持多线程安全访问。
  2. POSIX共享内存:POSIX标准中定义了共享内存的接口,包括创建、删除、附加和映射共享内存等操作。使用POSIX共享内存,可以在不同进程之间实现高效的数据共享。
  3. System V共享内存:这是另一种常见的共享内存实现方式。它通过系统调用接口(如shmget、shmat、shmdt和shmctl)来创建、附加、分离和删除共享内存。System V共享内存也支持多线程安全访问。
  4. 共享内存工具集:该工具集包含了一系列共享内存工具,包括共享内存创建、共享内存删除、共享内存复制等等,适用于Linux系统下的多种场景。
  5. shm_open:这是Linux系统下的一个函数,可以创建或打开一个共享内存段。通过该函数,可以实现不同进程之间的数据共享。

4.2.        硬件产品

  1. HPE Superdome Flex是一款具有共享内存架构的企业级服务器。它采用了NUMA架构,并配备了高性能的互连网络和共享内存模块,用于支持多个处理器节点之间的通信和数据共享。
  2. Oracle Exadata是一种专为数据库处理和分析而设计的服务器解决方案。它结合了共享内存架构和专用存储技术,以提供高性能的数据处理和查询能力。
  3. IBM Power Systems是一系列基于IBM Power架构的企业级服务器。它们支持共享内存架构,并提供高度可扩展的处理能力和大容量的共享内存选项。

5.      系统分析

共享内存的阵营:

Windows系统:

提供的是进程通讯IPC和API共享内存,windows不同版本之间可以共享内存

鸿蒙系统:

提供了类型windows的共享内存机制,但是不能与windows之间共享内存

linux和macOS:

提供了systemV共享内存机制,他们之间可以进行可以实现内存共享

阵营之间不能共享内存,因为操作系统的内存管理机制不同,即使实现了内存映射到物理地址也不行,两大阵营的物理地址方式不同,无法实现直接共享内存通讯

 

6.      结论

利用共享内存进行服务器内部通讯和数据传输是一种快捷的方法,结合Redis数据库,可以更大程度的利用共享内存技术,用于解决计算和渲染过程中通讯的效率问题。

posted @ 2023-12-07 11:30  hanabc12345  阅读(77)  评论(0编辑  收藏  举报