标签: shared-memory

在共享内存C++中实例化对象

我们需要多个程序来调用公共库中的函数.库函数访问和更新公共全局内存.每个程序的函数调用都需要查看这个常见的全局内存.即使从另一个程序调用,这是一个函数调用需要查看任何先前函数调用的更新.出于兼容性原因,我们对共享库公开的函数必须如何操作有几个设计约束:

  • 无论代码运行的线程如何,所有调用者都必须可以看到全局声明的任何数据项(包括标准数据类型和对象).
  • 在函数中本地声明的任何数据项仅在该函数内可见.
  • 任何标准数据类型或任何类的实例都可以在本地或全局或两者中出现.

一种解决方案是将库的公共全局内存放在命名共享内存中.第一个库调用将创建命名共享内存并初始化它.后续程序调用将获取共享内存的地址,并将其用作指向全局数据结构的指针.全局声明的对象实例需要在共享内存中动态分配,而本地声明的对象实例可以放在堆栈或调用程序线程的本地堆中.出现问题是因为全局内存中的初始化对象可以创建并指向分配(新)附加内存的子对象.这些新分配还需要位于共享内存中,并且所有库调用者都可以看到.另一个复杂因素是这些对象,它们包含字符串,文件等,也可以在调用程序中使用.在调用程序中声明时,对象的内存对于调用程序是本地的,而不是共享的.所以对象的代码需要处理任何一种情况.在我们看来,解决方案将要求我们覆盖全局布局新的常规new和delete运算符.我们发现了一个内存管理系统的设计,它看起来会起作用,但我们还没有找到任何实际的实现.如果有人知道Nathan Myers的内存管理设计的实现(http://www.cantrip.org/wave12.html?seenIEPage=1),我将非常感谢它的链接.或者,如果有人知道另一个可以动态分配对象的共享内存管理器,我也很想知道它.我已经检查过Boost库以及我能找到的所有其他来源,但似乎没有任何东西可以做我们需要的东西.我们不想自己写一个.由于性能和稳健性很重要,因此使用经过验证的代码会很不错.提前感谢任何想法/帮助.

感谢有关ATL和OSSP库的建议.我现在正在检查它们虽然我害怕ATL太过Wincentric如果目标变成了Unix.

另外一件事我们现在似乎很清楚.由于可以在执行期间动态创建对象,因此内存管理方案必须能够分配额外的共享内存页面.现在开始看起来像一个完整的堆替换内存管理器.

c++ memory-management shared-memory

8
推荐指数
1
解决办法
2995
查看次数

完全托管的共享内存.NET实现?

我正在寻找.NET的免费,完全托管的共享内存实现(P/Invoke是可以接受的,混合C++/CLI不是).

.net c# ipc shared-memory

8
推荐指数
2
解决办法
1万
查看次数

C静态变量和linux fork

嗨,我创建了一个服务器程序,在接受套接字连接后分叉新进程.程序中定义了几个静态分配的全局变量.我的问题是这些静态缓冲区在fork之后分配了两次吗?或者fork只复制堆和调用堆栈上的地址空间?

c linux memory fork shared-memory

8
推荐指数
2
解决办法
8680
查看次数

如何使用合并内存访问

我有'N'个线程同时在设备上执行,它们需要从全局内存中浮动M*N. 访问全局内存合并的正确方法是什么?在这件事情上,共享内存如何帮助?

gpu coalesce shared-memory

8
推荐指数
1
解决办法
4185
查看次数

用fork()共享堆内存

我正在使用C实现一个数据库服务器,它将处理来自多个客户端的请求.为此,我使用fork()来处理各个客户端的连接.

服务器将数据存储在堆中,该数据包含一个指向动态分配记录的哈希表的根指针.记录是具有指向各种数据类型的指针的结构.我希望这些进程能够共享这些数据,以便当客户端对堆进行更改时,其他客户端将看到更改.

我已经知道fork()使用COW(Copy On Write),我的理解是,当子进程尝试修改内存中的数据时,它将复制父进程的堆(和堆栈)内存.

我发现我可以使用shm库来共享内存.

- 是否足以共享数据库的根指针或是否必须将所有已分配的内存分享?

- 如果孩子分配内存,父/其他孩子能够访问它吗?

- 如果一个孩子分配内存并且后来被杀死,分配的内存是否仍然留在堆上?

那么例如下面的代码是否是共享堆内存的有效方式(在shared_string中)?如果一个孩子使用类似的代码(即从//开始),其他孩子是否能够在孩子跑步和死亡之后读/写?

key_t key;
int shmid;

key = ftok("/tmp",'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);

//start
char * string;
string = malloc(sizeof(char) * 10);

strcpy(string, "a string");

char * shared_string;

shared_string = shmat(shmid, string, 0);

strcpy(shared_string, string);
Run Code Online (Sandbox Code Playgroud)

c c++ heap fork shared-memory

8
推荐指数
1
解决办法
3685
查看次数

使用Boost :: interprocess在共享内存中的<int,void*>映射

我正在尝试在以下类型的共享内存中构建映射

我像这样创建共享内存区域:

 managed_shared_memory segment(create_only ,"MyMap"  ,size);       

ShMemAllocator_t alloc_inst (segment.get_segment_manager());

 map =   segment.construct<MyMap_t>("MyMap")      
                             (std::less<int>() 
                             ,alloc_inst); 
Run Code Online (Sandbox Code Playgroud)

地图中的值如下:

       typedef pair<MutexType, boost::interprocess::offset_ptr<void> > ValueType ; 
Run Code Online (Sandbox Code Playgroud)

MutexType本身是一个包含read和write mutex的结构(使用read_lock和write_lock); 定义如下:

typedef struct  mutex_struct{ 
   sharable_lock<interprocess_mutex> read_lock(interprocess_mutex, defer_lock); 
  scoped_lock<interprocess_mutex> write_lock(interprocess_mutex, defer_lock); 
} MutexType;
Run Code Online (Sandbox Code Playgroud)

"size"是映射的总大小(就对象而言,所有void指针指向的数据大小的总和).

如何确保此void*数据也位于我创建的此内存段中,如何在现有共享内存区域中实例化它.之所以这样做,这是我想只有只是反复一次分配这个大的缓冲区删除/添加对象到它(地图模型高速缓存),我还没有在其中找到多个对象可以在相同的内存段内被分配办法在地图内.此外,寻求分配MutexType对返回编译错误,指出没有提供"call"操作符.

c++ boost ipc shared-memory

8
推荐指数
1
解决办法
3383
查看次数

C11/C++ 11弱内存基准测试

任何人都可以点比较轻松使用原子操作(尤其是C11/C++ 11码的性能基准测试结果memory_order_releasememory_order_acquire,也memory_order_consumememory_order_relaxed)与默认memory_order_seq_cst?所有架构都很有趣.提前致谢.

concurrency shared-memory c++11 c11 relaxed-atomics

8
推荐指数
1
解决办法
452
查看次数

共享部分列表以避免复制

我正在寻找一种实现的数据结构List,允许我重用多个列表中出现的部分列表.

为了说明这一点,请考虑以下三个列表:

在此输入图像描述

如您所见,红色序列(42, 88, 76, 60)和蓝色序列(21, 9, 47)多次使用,每个序列表示作为其他列表的一部分共享的独立列表.实际上,列表可能会更长.

该列表只需要是只读的,因为它将用作返回值.创建列表集合的过程将是唯一一个(允许)修改列表(使用add(..)操作等).共享部分列表将使得使用addAll(..)(内部使用System.arraycopy(..))扩展复制列表元素变得多余.

有没有轻量级的List实现来满足我的需求?或者有一个相对简单的方法来自己实现一个?

java list shared-memory

8
推荐指数
1
解决办法
89
查看次数

Python多处理的进程通信

我已经了解了Python多进程的管道/队列/共享ctypes对象/管理器,我想将它们与Linux的匿名管道,命名管道,共享内存,套接字等进行比较.我现在有以下问题

  • Python多处理的管道和队列模块基于匿名管道.它是否提供命名管道?

  • Python multiprocessing.sharedctypes是否支持独立的进程通信?我认为它只支持父子进程或兄弟进程通信.

  • 其中哪些只用于父子关系或兄弟情谊,可以在独立进程或不同主机之间进行通信?

  • 它们各自的特点是什么,我应该如何选择它们?

提前致谢.

python ipc pipe shared-memory multiprocessing

8
推荐指数
1
解决办法
821
查看次数

编译错误的文件?

我有3个文件 - SwimMill.c,Fish.cPellets.c- 每个文件都被编译成可执行文件.当SwimMill运行时,它使用fork()exec()运行FishPellets.但是,出于某种原因,当我使用终端时,首先使用make,然后运行SwimMill文件来编译程序Fish.有谁能够帮我?

Makefile文件

all: SwimMill Fish Pellets

SwimMill: SwimMill.c
    gcc -o SwimMill SwimMill.c

Fish: Fish.c
    gcc -o Fish Fish.c -lm

Pellets: Pellets.c
    gcc -o Pellets Pellets.c
Run Code Online (Sandbox Code Playgroud)

SwimMill.c

// Uses both fish and pellets, 30 seconds, then print it out
// Create pellets at random intervals, from 0x80
// Eating --> Get rid of most significant bit
// …
Run Code Online (Sandbox Code Playgroud)

c fork makefile shared-memory

8
推荐指数
1
解决办法
89
查看次数