标签: shared-memory

在这三种从共享内存中读取链表的方法中,为什么第三快?

我有一个'服务器'程序,它可以更新共享内存中的许多链表以响应外部事件.我希望客户端程序能够尽快注意到任何列表上的更新(最低延迟).服务器标记链接列表的节点,state_就像FILLED填充数据并将其下一个指针设置为有效位置一样.在那之前,它state_NOT_FILLED_YET.我使用内存屏障,以确保客户看不到state_FILLED数据之前,中实际上是准备好(和它似乎工作,我从来没有看到被破坏的数据).此外,state_是易失性的,以确保编译器不会解除客户端的循环检查.

保持服务器代码完全相同,我提出了3种不同的方法让客户端扫描链表以进行更改.问题是:为什么第三种方法最快?

方法1:连续循环遍历所有链接列表(称为"通道"),查看是否有任何节点已更改为"已填充":

void method_one()
{
    std::vector<Data*> channel_cursors;
    for(ChannelList::iterator i = channel_list.begin(); i != channel_list.end(); ++i)
    {
        Data* current_item = static_cast<Data*>(i->get(segment)->tail_.get(segment));
        channel_cursors.push_back(current_item);
    }

    while(true)
    {
        for(std::size_t i = 0; i < channel_list.size(); ++i)
        {   
            Data* current_item = channel_cursors[i];

            ACQUIRE_MEMORY_BARRIER;
            if(current_item->state_ == NOT_FILLED_YET) {
                continue;
            }

            log_latency(current_item->tv_sec_, current_item->tv_usec_);

            channel_cursors[i] = static_cast<Data*>(current_item->next_.get(segment));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当通道数量很小时,方法1给出了非常低的延迟.但是当通道数量增加(250K +)时,由于在所有通道上循环,它变得非常慢.所以我试过......

方法2:为每个链接列表提供ID.保留一个单独的"更新列表".每次更新其中一个链接列表时,请将其ID推送到更新列表.现在我们只需要监控单个更新列表,并检查我们从中获取的ID.

void method_two()
{
    std::vector<Data*> channel_cursors;
    for(ChannelList::iterator i = channel_list.begin(); i …
Run Code Online (Sandbox Code Playgroud)

c++ performance multithreading latency shared-memory

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

Windows系统中的/ dev/shm等价是什么?

我想知道如何通过写入和读取临时文件到主存储器来使IO更快.我曾经习惯在Linux中写入/ dev/shm.

但现在我在Windows 7.任何人都知道答案吗?

谢谢

linux windows shared-memory ramdrive ramdisk

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

如何使用合并内存访问

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

gpu coalesce shared-memory

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

PHP中是否有一种方法可以像Java EE一样使用持久数据?(在PHP线程之间共享对象)没有session或cache/DB

在PHP中是否有一种方法可以使用"会话外"变量,这些变量不会在每个连接处加载/卸载,就像在Java服务器中一样?

请原谅我缺乏准确性,我不知道如何以正确的方式写它.

主要想法是这样的事情:

<?php
    ...
    // $variablesAlreadyLoaded is kind of "static" and shared between all PHP threads
    // No need to initialize/load/instantiate it.
    $myVar = $variablesAlreadyLoaded['aConstantValueForEveryone'];
    ...
?>
Run Code Online (Sandbox Code Playgroud)

我已经做过这样的使用shmop和其他奇怪的事情,但如果有一个"干净"的方式来做"纯PHP"而不使用缓存系统(我想到APC,Redis ......),也没有数据库.

编辑1:

由于人们(感谢他们花时间陪我)以同样的方式回答我的会话,我添加了一个我错过了写的约束:没有会话请.

编辑2:

似乎唯一的PHP本机方法是共享内存(shmop)和命名管道.我将使用托管方式访问共享对象,不介意内存管理(共享内存块大小)或系统问题(管道).

然后,我在网上浏览了一个PHP模块/库,它提供了执行此操作的函数/方法:我什么也没找到.

编辑3:

后在路上的几个研究中指出@KFO,看来该putenv/ setenv不作出处理对象(我会避免序列化).因此,它解决了诸如字符串或数字之类的短"事物"的问题,但不解决更大的/ comples对象的问题.

使用"env way"和另一种处理更大对象的方法将是不相干的,并增加了代码和维护的复杂性.

编辑4:

发现这个:DBus(GREE Lab DBus),但我没有工具在工作中测试它.有人测试了吗?

我对每一个建议持开放态度.

谢谢

编辑5("答案"):

由于DBus不是我正在寻找的(需要安装第三方模块,没有"严重"的应用证据),我现在正在使用已经证明其可靠性的Memcache(关注@PeterM评论,见下文).

php persistence share shared-memory inter-process-communicat

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

共享内存和写入或右值引用上的副本和移动语义?

一般容器的写入实现的共享内存/副本(如在Qt容器中找到的那样)被C++ 11移动语义和右值引用所取代?

哪一个失败而另一个成功?或者它们是互补的而不是替代品?

c++ containers copy-on-write shared-memory rvalue-reference

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

编译错误的文件?

我有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
查看次数

有没有没有文件名的 shm_open() 之类的东西?

POSIXshm_open()函数返回可用于访问共享内存的文件描述符。这非常方便,因为可以使用所有传统的控制文件描述符的机制来控制共享内存。

唯一的缺点是shm_open()总是需要一个文件名。所以我需要这样做:

// Open with a clever temp file name and hope for the best.
fd = shm_open(tempfilename, O_RDWR | O_CREAT | O_EXCL, 0600);

// Immediately delete the temp file to keep the shm namespace clean.
shm_unlink(tempfilename);

// Then keep using fd -- the shm object remains as long as there are open fds.
Run Code Online (Sandbox Code Playgroud)

这种使用tempfilename很难便携和可靠地进行。文件名的解释(命名空间是什么,权限的处理方式)因系统而异。

在许多情况下,使用共享内存对象的进程不需要文件名,因为只需将文件描述符从一个进程传递到另一个进程,就可以更简单、更安全地访问该对象。那么有没有类似shm_open()但可以在不触及共享内存文件名命名空间的情况下使用的东西?

mmap()withMAP_ANON|MAP_SHARED很棒,但它不是文件描述符,而是提供了一个指针。指针不能在 exec 边界上存活,也不能像文件描述符那样通过 Unix 域套接字发送到另一个进程。

shm_open()默认情况下,由 返回的文件描述符也不会在 exec 边界中存活:POSIX 定义表示设置了与新文件描述符关联的 FD_CLOEXEC …

unix posix shared-memory

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

无法导入名称 shared_memory

尝试使用 python 访问共享内存时遇到问题。我使用了 Python 标准库中的多处理库,但是当我尝试导入 shared_memory 模块时它不起作用。

from multiprocessing import shared_memory
Run Code Online (Sandbox Code Playgroud)

结果

ImportError: cannot import name shared_memory
Run Code Online (Sandbox Code Playgroud)

我尝试过 Python 2 和 Python 3,它们都有同样的问题。对这个问题有什么建议吗?

python shared-memory multiprocessing

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

在 docker compose 中更改共享内存大小

我目前在我的一个容器中的共享内存存在一些问题。

我有一个 docker-compose 文件,我希望能够在其中设置大小。我基本上转换了一个旧的 docker run,它有一个--shm-size 16gb. 我想这就像shm_size:16gb在撰写文件中添加到我的服务一样简单。

添加它只会给我信息:Ignoring unsupported options: shm_size

我确实检查了文档,但它并没有真正帮助我。

只是为了澄清,它不在构建中,而是真正用于“运行”状态。

你们中的一个人有没有遇到过这个问题/知道如何解决它?

设置:

  • 具有 7 个节点的 docker swarm
  • 服务应仅在单个节点上运行
  • 仅运行堆栈
  • 64 GB RAM 主机
  • 32 GB shm(主机)
  • Docker 版本 18.09.7,构建 2d0083d
  • 在我的撰写文件中使用 v 3.7

编写文件:

version: "3.7"
services:
  server:
    shm_size: 16GB # <<<<<<< This fails
    image: local_repo/my_app:v1-dev
    command: run
    environment:
      - UPDATES=enabled
    volumes:
      - type: volume
        source: data
        target: /var/lib/my_app/
      - type: volume
        source: db
        target: /var/lib/postgresql/10/main
    networks:
      - …
Run Code Online (Sandbox Code Playgroud)

shared-memory docker docker-compose docker-swarm

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

Python 3.8 shared_memory resource_tracker 在应用程序关闭时产生意外警告

  • 我正在使用 amultiprocessing.Pool在 1 个或多个子进程中调用函数来生成大量数据。
  • 工作进程创建一个multiprocessing.shared_memory.SharedMemory对象并使用由 分配的默认名称shared_memory
  • worker 将SharedMemory对象的字符串名称返回给主进程。
  • 在主进程中,SharedMemory对象被链接、消费,然后取消链接和关闭

在关闭时,我看到来自resource_tracker以下方面的警告:

/usr/local/lib/python3.8/multiprocessing/resource_tracker.py:216: UserWarning: resource_tracker: There appear to be 10 leaked shared_memory objects to clean up at shutdown
  warnings.warn('resource_tracker: There appear to be %d '
/usr/local/lib/python3.8/multiprocessing/resource_tracker.py:229: UserWarning: resource_tracker: '/psm_e27e5f9e': [Errno 2] No such file or directory: '/psm_e27e5f9e'
  warnings.warn('resource_tracker: %r: %s' % (name, e))
/usr/local/lib/python3.8/multiprocessing/resource_tracker.py:229: UserWarning: resource_tracker: '/psm_2cf099ac': [Errno 2] No such file or directory: '/psm_2cf099ac'
<8 more similar …
Run Code Online (Sandbox Code Playgroud)

python shared-memory python-multiprocessing python-3.8

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