是否有一个Python模块可以让我将非平凡用户类的实例放入共享内存?
我的意思是直接在共享内存中分配,而不是酸洗进出.
multiprocessing.Value并且multiprocessing.Array不适用于我的用例,因为它们似乎只支持原始类型和数组.
到目前为止我唯一发现的是POSH,但它在八年内没有改变.这表明它要么是超稳定的,要么是过时的.在我花时间试图让它发挥作用之前,我想知道是否有其他我尚未发现的替代品.
我只需要在Linux上工作.
我需要我的父进程和子进程能够读取和写入相同的变量(类型为int),因此它在两个进程之间是"全局的".
我假设这会使用某种跨进程通信,并且在一个进程上有一个变量正在更新.
我做了一个快速谷歌和IPC和各种技术出现,但我不知道哪个是最适合我的情况.
那么什么技术是最好的,你可以提供一个链接到它的noobs教程.
谢谢.
使用共享内存时,我们为什么要关心创建密钥
key_t ftok(const char *path, int id);
Run Code Online (Sandbox Code Playgroud)
在下面的代码中?
key_t key;
int shmid;
key = ftok("/home/beej/somefile3", 'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);
Run Code Online (Sandbox Code Playgroud)
根据我的理解,访问给定共享内存所需的是shmid,而不是密钥.还是我错了?如果我们需要的是shmid,每次不仅仅创建一个随机密钥有什么意义呢?
@ Beej的Unix IPC指南可以阅读:
那
key废话怎么样?我们如何创建一个?好吧,因为类型key_t实际上只是一个long,你可以使用你想要的任何数字.但是如果你硬编码数字和其他一些不相关的程序硬编码相同的数字但想要另一个队列呢?解决方案是使用ftok()从两个参数生成密钥的函数.
读到这一点,它给我的印象是,需要附加到共享内存块的关键是什么.但事实并非如此,是吗?
我想在几个进程之间使用共享内存,并希望能够继续使用原始指针(和stl容器).
为此,我使用映射在固定地址的共享内存:
segment = new boost::interprocess::managed_shared_memory(
boost::interprocess::open_or_create,
"MySegmentName",
1048576, // alloc size
(void *)0x400000000LL // fixed address
);
Run Code Online (Sandbox Code Playgroud)
选择这个固定地址的好策略是什么?例如,我应该使用一个相当高的数字来减少我用完堆空间的可能性吗?
Java中的"共享对象内存"和"堆内存"有什么区别.它是否像'共享对象内存'是'堆内存'的超集?
这个问题的来源是jmap的文档.它为打印'共享对象内存'和'堆内存'提供了不同的选项.
我试图在两个进程之间进行通信.我试图在一个进程中将数据(如姓名,电话号码,地址)保存到共享内存,并尝试通过其他进程打印该数据.
process1.c
#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main ()
{
int segment_id;
char* shared_memory[3];
int segment_size;
key_t shm_key;
int i=0;
const int shared_segment_size = 0x6400;
/* Allocate a shared memory segment. */
segment_id = shmget (shm_key, shared_segment_size,
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
/* Attach the shared memory segment. */
shared_memory[3] = (char*) shmat (segment_id, 0, 0);
printf ("shared memory attached at address %p\n", shared_memory);
/* Write a string to the shared memory segment. */
sprintf(shared_memory[i], "maddy …Run Code Online (Sandbox Code Playgroud) http://www.php.net/manual/en/intro.shmop.php
Shmop是一组易于使用的函数,允许PHP读取,写入,创建和删除Unix共享内存段.
我不明白,这个扩展目的究竟是什么?它是干什么用的?
我在php中的客户端和服务器通过共享内存进行通信,现在我想使用Boost.Interprocess访问这个shred内存对象我该如何访问它?server.php:
function create_image($str){
// Create a blank image and add some text
$im = imagecreatetruecolor(300, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
$stringBanner=exec("date").$str;
imagestring($im, 1, 5, 5, $stringBanner , $text_color);
ob_start();
imagejpeg($im);
$i = ob_get_contents();
ob_get_clean();
imagedestroy($im);
return $i;
}
echo "\n".__FILE__."\n";
$shm_key = ftok(__FILE__, 't');
echo $shm_key."\n";
$shm_id = shmop_open($shm_key, "a", 0, 0);
if ($shm_id) {
//it is already created
shmop_delete($shm_id);
shmop_close($shm_id);
}
//you need to create it with shmop_open using "c" only
echo "try to create\n";
if(!$shm_id = …Run Code Online (Sandbox Code Playgroud) 可以jemalloc被修改以从共享存储器分配?FreeBSD函数dallocx()意味着你可以提供一个用于分配的指针,但是我没有看到明显的方法jemalloc来限制来自该内存的所有分配(也没有设置大小等).
该
dallocx()函数使引用的内存ptr可用于将来的分配.
如果没有,这种功能的努力程度是多少?我很难找到一个可以从我提供的共享内存部分分配的现成分配方案.
同样,可以jemalloc配置为从锁定的内存区域分配以防止交换?
请随意向我指出需要修改的相关代码部分,并提供任何想法或建议.
我正在探索的想法是 - 因为你可以创建用于在线程环境中分配的竞技场/堆,就像jemalloc最小化争用一样,这个概念似乎可以扩展到在多处理环境中分配共享内存的区域,即我创建共享内存的N个区域使用mmap(),并且我想利用jemalloc(或任何分配方案)的功能,尽可能有效地分配那些共享区域中的最小线程争用,即如果线程/进程没有访问相同的共享区域和竞技场,争用的机会很小,malloc操作速度也提高了.
这与使用malloc()API 的全局池alloc不同,因为通常这些需要全局锁有效地序列化用户空间.我想避免这种情况.
编辑2:
理想情况下这是一个api:
// init the alloc context to two shmem pools
ctx1 = alloc_init(shm_region1_ptr);
ctx2 = alloc_init(shm_region2_ptr);
(... bunch of code determines pool 2 should be used, based on some method
of pool selection which can minimize possibility of lock contention
with other processes allocating shmem …Run Code Online (Sandbox Code Playgroud) 我有一个简单的C++服务(API端点),每次调用API时都会增加一个计数器.当调用者将数据发布到http://10.0.0.1/add时,计数器必须递增1并将计数器的值返回给调用者.
当服务进入dockerized时,事情变得更加复杂.当同一服务的两个实例运行时,必须以原子方式完成添加,即计数器值存储在数据库中,并且每个docker实例必须获取一个锁获取旧值,添加一个,返回调用者并解锁.
当实例是同一Linux机器中的进程时,我们使用共享内存来有效地锁定,读取,写入和解锁共享数据,并且接受了性能.但是,当我们使用泊坞窗和数据库时,性能很低.结果还可以,但性能很低.
dockerized属性实例之间的规范方式是什么,以执行上述操作?集装箱流程是否有"共享内存"功能?
shared-memory ×10
c ×4
ipc ×3
performance ×2
php ×2
allocation ×1
boost ×1
c++ ×1
docker ×1
fork ×1
ftok ×1
interprocess ×1
java ×1
jmap ×1
linux ×1
memory ×1
pmap ×1
process ×1
python ×1
unix ×1