标签: shared-memory

共享内存中的条件变量 - 此代码是否符合POSIX标准?

POSIX标准是否允许命名共享内存块包含互斥锁和条件变量?

我们一直在尝试使用互斥和条件变量来同步对LynuxWorks LynxOS-SE系统(POSIX-conformant)上的两个进程对命名共享内存的访问.

调用一个共享内存块"/sync"并包含互斥锁和条件变量,另一个是"/data"并包含我们同步访问的实际数据.

pthread_cond_signal()如果两个进程都没有mmap()完全相同的顺序执行调用,或者如果一个进程在映射内存之前在某个其他共享内存中进行mmaps,我们就会看到失败"/sync".

这个示例代码与我可以做的一样短:

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/file.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <iostream>
#include <string>
using namespace std;

static const string shm_name_sync("/sync");
static const string shm_name_data("/data");

struct shared_memory_sync
{
    pthread_mutex_t mutex;
    pthread_cond_t condition;
};

struct shared_memory_data
{
    int a;
    int b;
};


//Create 2 shared memory objects
// - sync contains 2 shared synchronisation …
Run Code Online (Sandbox Code Playgroud)

unix posix ipc shared-memory lynxos

5
推荐指数
2
解决办法
9268
查看次数

为什么IPC :: SysV-> shmget用EINVAL响应?

我目前在服务器上运行perl 5.8.8,我正在尝试安装5.14.

我将其配置为usethreads和use64bitint,否则为其建议的默认值.

make run没有问题,但是让测试失败了

../cpan/IPC-SysV/t/ipcsysv.t
../cpan/IPC-SysV/t/shm.t
Run Code Online (Sandbox Code Playgroud)

从而:

# ./perl harness ../cpan/IPC-SysV/t/shm.t ../cpan/IPC-SysV/t/ipcsysv.t 
../cpan/IPC-SysV/t/shm.t ...... IPC::SharedMem->new failed: Invalid argument at t/shm.t line 54.
../cpan/IPC-SysV/t/shm.t ...... Dubious, test returned 22 (wstat 5632, 0x1600)
No subtests run
../cpan/IPC-SysV/t/ipcsysv.t .. 1/38 shmget failed: Invalid argument at t/ipcsysv.t line 100.
# Looks like you planned 38 tests but ran 17.
# Looks like your test exited with 22 just after 17.
../cpan/IPC-SysV/t/ipcsysv.t .. Dubious, test returned 22 (wstat 5632, 0x1600)
Failed 21/38 subtests

Test …
Run Code Online (Sandbox Code Playgroud)

perl ipc shared-memory sysv

5
推荐指数
1
解决办法
1377
查看次数

ELF64/x86_64和内存映射段的起始地址(用于共享对象)

我编写了几个程序,发现当在64位编译时,内存映射段(例如共享对象和共享内存保存)总是位于7f9aca84a000-7fff88400000左右但从未完全相同.

我想知道x86_64架构(ELF64)上的内存段是否有固定的起始地址,或者该段的最大和最小范围是多少?

这就是为什么我问这个问题.我们正在将系统从Tru64 UNIX迁移到Linux.该系统使用IPC Sys V共享内存的复杂固定内存映射,并使用链表在该段内从结构转到另一个.由于这段代码的大小和复杂性,以及我们手头有限的时间,我们正在尝试找到一种可靠的方法来修复共享内存的开始(有效地使用带有指定地址的shmat来附加段).对于64位,虚拟地址空间是如此巨大(48位有效可能的地址),选择"安全"固定地址比32位更容易,风险更小.

c linux shared-memory memory-layout memory-mapping

5
推荐指数
1
解决办法
2274
查看次数

Linux:从shell命令创建共享内存段

我想从Unix启动脚本创建一个共享内存段.创建的段将由几个PHP脚本访问.

是否有shell命令来创建指定密钥,模式,权限和大小的共享内存网段?

ipc shared-memory

5
推荐指数
2
解决办法
6821
查看次数

CUDA共享内存占用的空间是所需空间的两倍

我只是注意到我的CUDA内核使用的空间是"理论"计算的空间的两倍.例如

__global__ void foo( )
{
    __shared__ double t;
    t = 1;
}
Run Code Online (Sandbox Code Playgroud)

PTX信息显示:
ptxas info :_Z3foov的函数属性,0字节堆栈帧,0字节溢出存储,0字节溢出加载
ptxas info:使用4个寄存器,16字节smem,32字节cmem [0]

但双人的大小只有8.

更多例子:

__global__ void foo( )
{
    __shared__ int t[1024];
    t[0] = 1;
}
Run Code Online (Sandbox Code Playgroud)

ptxas info:使用3个寄存器,8192个字节的smem,32个字节的cmem [0]

有人能解释为什么吗?

cuda shared-memory

5
推荐指数
1
解决办法
304
查看次数

在多个分叉进程之间共享指针

如果我想char **keysfork()'d进程之间共享类似数组的东西shm_open,mmap我可以将指针指向keys共享内存段,还是必须将所有数据复制keys到共享内存段?

share pointers fork process shared-memory

5
推荐指数
1
解决办法
505
查看次数

是否有一个C#等效于boost :: interprocess :: basic_string?

在C++中,使用boost :: interprocess可以定义一个boost :: interprocess :: basic_string,它基本上是一个存储在内存映射文件中的字符串的抽象.您可以像应用程序中的任何其他字符串一样无缝地使用它(当然假设您负责线程安全).

C#是否有任何等效的库/ nuget包/代码片段?

c# c++ shared-memory memory-mapped-files boost-interprocess

5
推荐指数
1
解决办法
442
查看次数

CUDA:不同经线之间的银行冲突?

我刚学会了(为什么只有一个warp由cuda中的SM执行?)Kepler GPU实际上可以同时执行几个(显然是4个)warp的指令.

共享内存库是否也可以同时提供四个请求?如果不是这样,那就意味着银行冲突可能发生在碰巧同时执行的不同warp的线程之间,即使在任何单个warp中没有银行冲突,对吧?有没有关于此的信息?

cuda shared-memory bank-conflict

5
推荐指数
1
解决办法
559
查看次数

如何实现动态共享内存大小调整?

当前,我想使用shm_open来获取文件描述符,然后在想向共享内存中添加新缓冲区时使用ftruncate和mmap。每个缓冲区分别用于其自身目的。

现在,我需要做的是任意调整缓冲区大小。munmap缓冲区也将在以后再次使用可用空间。

对于第一个问题,我只能提出的唯一解决方案是:ftuncate(file_size + old_buffer_size + extra_size),mmap,将整个数据复制到新缓冲区中,然后对原始数据进行映射。这对我来说看起来非常昂贵,并且可能有更好的方法。它还需要每次删除原始缓冲区。

对于第二个问题,我什至没有一个不好的解决方案,每次清除缓冲区时,我显然都无法移动内存。而且,如果我跟踪空闲内存并在任何可能的地方使用它,将会减慢分配过程的速度,并留给我剩余的零碎内存。

我希望这不要太令人困惑。谢谢

c memory-management resize mmap shared-memory

5
推荐指数
1
解决办法
1941
查看次数

如何在PHP中的HTTP请求之间共享内存?

我正在尝试实现一个非常非常大的字典搜索来匹配PHP中句子中的单词.我最初的想法是使用Aho-corasick算法,因为Aho-corasick解决了我的确切问题.我首先用PHP实现了一个Trie.Trie在缓存时会生成一个足够快的字典; 但是,它占用大约3mb的内存.这在PHP中无法很好地扩展.

显然,无论我们使用何种数据结构,大型字典都会占用大量内存.我只需要单个字典实例,因为它是静态的,不需要重建.

如果这个对象可以在所有线程之间共享,那么3mb的内存可以忽略不计,但是,我不确定在PHP中的线程之间共享内存的正确方法.

如何在HTTP请求之间共享此对象?当每个线程需要由Trie创建的3mb开销时,我看不到项目缩放.

php shared-memory

5
推荐指数
1
解决办法
1102
查看次数