标签: shared-memory

如何自动更新Docker实例之间共享的计数器

我有一个简单的C++服务(API端点),每次调用API时都会增加一个计数器.当调用者将数据发布到http://10.0.0.1/add时,计数器必须递增1并将计数器的值返回给调用者.

当服务进入dockerized时,事情变得更加复杂.当同一服务的两个实例运行时,必须以原子方式完成添加,即计数器值存储在数据库中,并且每个docker实例必须获取一个锁获取旧值,添加一个,返回调用者并解锁.

当实例是同一Linux机器中的进程时,我们使用共享内存来有效地锁定,读取,写入和解锁共享数据,并且接受了性能.但是,当我们使用泊坞窗和数据库时,性能很低.结果还可以,但性能很低.

dockerized属性实例之间的规范方式是什么,以执行上述操作?集装箱流程是否有"共享内存"功能?

linux performance shared-memory docker

13
推荐指数
1
解决办法
668
查看次数

进程VS线程:两个进程可以共享同一个共享内存吗?可以两个线程吗?

在考虑了共享内存的整个概念之后,出现了一个问题:

两个进程可以共享同一个共享内存段吗?两个线程可以共享相同的共享内存吗?

在更清楚地考虑之后,我几乎肯定两个进程可以共享相同的共享内存段,其中第一个是父亲,第二个是子,它是用a创建的fork(),但两个线程呢?

谢谢

multithreading operating-system process shared-memory

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

不使用时删除posix共享内存?

是否有任何方式,特定于Linux,shm_open()在没有进程使用它们时删除posix共享内存段(获取).即将它们引用计数并让系统在引用变为0时将其删除

几点说明:

  • 如果程序崩溃,建立一个删除它们的atexit处理程序不起作用.

  • 目前,以linux为特定方式,我将pid嵌入到段名中,并尝试通过在外部程序中遍历/ dev/shm来查找未使用的段.这有一个缺点,就是不得不以相当狡猾的方式定期清理它们.

  • 由于程序可以运行多个副本,因此程序在启动时重用的段使用定义良好的名称是不可行的.

c linux shared-memory

12
推荐指数
2
解决办法
7259
查看次数

共享内存IPC同步(无锁)

请考虑以下情形:

要求:

  • Intel x64 Server(多个CPU插槽=> NUMA)
  • Ubuntu 12,GCC 4.6
  • 两个进程在(命名)共享内存上共享大量数据
  • 古典生产者 - 消费者情景
  • 内存安排在循环缓冲区(带M个元素)

程序序列(伪代码):

流程A(生产者):

int bufferPos = 0;
while( true )
{
    if( isBufferEmpty( bufferPos ) )
    {
        writeData( bufferPos );
        setBufferFull( bufferPos );

        bufferPos = ( bufferPos + 1 ) % M;
    }
}
Run Code Online (Sandbox Code Playgroud)

流程B(消费者):

int bufferPos = 0;
while( true )
{
    if( isBufferFull( bufferPos ) )
    {
        readData( bufferPos );
        setBufferEmpty( bufferPos );

        bufferPos = ( bufferPos + 1 ) % M;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这个古老的问题:如何有效地同步它们!? …

c++ synchronization ipc shared-memory lock-free

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

我可以以某种方式与子进程共享异步队列吗?

我想使用队列将数据从父进程传递到通过其启动的子进程multiprocessing.Process.但是,由于父进程使用Python的新asyncio库,因此队列方法必须是非阻塞的.据我所知,asyncio.Queue是为了进行任务间通信而不能用于进程间通信.此外,我知道multiprocessing.Queueput_nowait()get_nowait()方法,但我实际上需要协程仍然会阻止当前任务(但不是整个过程).有没有办法创建包装put_nowait()/的协同程序get_nowait()?另一方面multiprocessing.Queue,在同一进程中运行的事件循环之后,内部使用的线程是否兼容?

如果没有,我还有其他选择吗?我知道我可以通过使用异步套接字自己实现这样的队列,但我希望我能避免这种情况......

编辑: 我也考虑使用管道而不是套接字,但它似乎asyncio不兼容multiprocessing.Pipe().更确切地说,Pipe()返回一个不是文件Connection对象的对象元组.但是,方法/方法和/都需要类似文件的对象,因此无法异步读取/写入这样的对象.相比之下,包用作管道的通常的文件类对象完全没有问题,并且可以很容易地与之结合使用.asyncio.BaseEventLoopadd_reader()add_writer()connect_read_pipe()connect_write_pipe()Connectionsubprocessasyncio

更新: 我决定进一步探索管道方法:通过检索文件描述符并将其传递给我,将Connection返回的对象转换multiprocessing.Pipe()为类文件对象.最后,我将生成的类文件对象传递给事件循环的/ .(如果有人对确切的代码感兴趣,有一些关于相关问题的邮件列表讨论.)然而,流媒体给了我一个,我没有设法解决这个问题.考虑到缺少对Windows的支持,我不会再继续这样做了.fileno()os.fdopen()connect_read_pipe()connect_write_pipe()read()OSError: [Errno 9] Bad file descriptor

python queue shared-memory multiprocessing python-asyncio

12
推荐指数
2
解决办法
5172
查看次数

在子进程已经开始之后访问共享内存

如果数据仅在子进程生成后可用(使用multiprocessing.Process),如何让子进程访问共享内存中的数据?

我知道multiprocessing.sharedctypeype.RawArray,但我无法弄清楚如何让我的子进程访问RawArray在进程已经启动后创建的进程.

数据由父进程生成,并且数据量事先不知道.

如果不是GIL我将使用线程,这将使这个任务更简单.使用非CPython实现不是一种选择.


muliprocessing.sharedctypes的引擎下,看起来共享ctype对象是使用mmaped内存分配的.

所以这个问题实际上归结为:子进程生成后,如果mmap()父进程调用,子进程是否可以访问匿名映射的内存?

这有点像在这个问题中被问到的内容,除了在我的情况下调用者mmap()是父进程而不是子进程.


(解决了)

我创建了自己的版本RawArray,它使用shm_open()引擎盖下.只要identifier(tag)匹配,生成的共享ctypes数组就可以与任何进程共享.

有关详细信息和示例,请参阅此答案.

python ipc shared-memory multiprocessing

11
推荐指数
2
解决办法
4445
查看次数

python进程之间的共享内存

我试图想出一种在python进程之间共享内存的方法.基本上存在多个python进程需要能够READ(仅读取)和使用(无突变)的对象.现在这是使用redis + strings + cPickle实现的,但cPickle占用宝贵的CPU时间,所以我不想使用它.我在互联网上看到的大多数python共享内存实现似乎都需要文件和泡菜,这基本上就是我已经在做的,而且正是我想要避免的.

我想知道的是,是否有办法编写类似...基本上是内存中的python对象数据库/服务器和相应的C模块来与数据库连接?

基本上C模块会向服务器请求写入对象的地址,服务器将使用地址进行响应,然后模块将写入对象,并通知服务器具有给定密钥的对象被写入磁盘.指定的位置.然后,当任何进程想要使用给定键检索对象时,他们只会向db请求给定键的内存位置,服务器将响应该位置,并且模块将知道如何在内存中加载该空间.将python对象传回python进程.

这完全是不合理的还是真的很难实施?我在追逐那些不可能的东西吗?欢迎大家提出意见.谢谢你上网.

c python shared-memory

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

**用于共享内存的非Boost**STL分配器

由于我工作的政策,我无法使用比1.33.1更新的Boost版本,并且无法使用比4.1.2更新的GCC版本.是的,它是垃圾,但我无能为力.Boost 1.33.1不包含进程间库.

也就是说,我的一个项目需要将一个std::map(或更可能是一个std::unordered_map)放入共享内存中.当进程由单个进程("服务器")加载并由许多其他进程读取时,它仅被写入/修改一次.我之前没有做过共享内存IPC所以这对我来说是一个相当新的领域.我看一下,shmget()但似乎我不能继续使用相同的共享内存密钥进行分配(因为我认为STL容器分配器需要它).

是否还有其他使用共享内存的NON-BOOST STL分配器?

编辑:已经做过的事情.Dobbs博士在2003年有一篇关于如何做到这一点的文章,我开始用它作为参考.但是,代码清单不完整,并且指向它们的链接会重定向到主站点.

编辑编辑:我不仅仅重写Boost.Interprocess的唯一原因是因为涉及的代码量很大.我只是想知道是否有一些比较简短的专门针对POSIX共享内存,我能重新从头开始写,因为网络之间的数据传输也受到了多天的审批流程...

c++ ipc shared-memory

11
推荐指数
1
解决办法
3554
查看次数

我可以用shmctl调整Linux共享内存的大小吗?

我有一个C++应用程序,通过shmget(2)在Linux系统上分配共享内存.我存储在共享内存中的数据会定期增长,我想以类似于realloc()增长常规内存的方式调整共享内存的大小.有没有办法做到这一点?我在IBM的网站上找到了一个提到SHM_SIZE命令的文档,但Linux和BSD联机帮助页没有它,即使在特定于Linux的部分也是如此.

c++ linux shared-memory

11
推荐指数
1
解决办法
2565
查看次数

通过共享内存将数据从c ++流式传输到c#

我试图使用共享内存将数据从c ++应用程序流式传输到C#应用程序.根据我发现的例子,我有:

c ++(发送)

    struct Pair {
    int length; 
    float data[3];
};

#include <windows.h>
#include <stdio.h>

struct Pair* p;
HANDLE handle;

float dataSend[3]{ 22,33,44 };

bool startShare()
{
    try
    {
        handle = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(Pair), L"DataSend");
        p = (struct Pair*) MapViewOfFile(handle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, sizeof(Pair));
        return true;
    }
    catch(...)
    {
        return false;
    }

}


int main()
{

    if (startShare() == true)
    {

            while (true)
            {
                if (p != 0) {

                //dataSend[0] += 1;  // here the …
Run Code Online (Sandbox Code Playgroud)

c# c++ shared-memory

11
推荐指数
1
解决办法
2495
查看次数