可以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) 无法追踪 SIGEV_THREAD 使用的答案...
当将 SIGEV_THREAD 设置为 sigevent 结构中的通知方法时,假设仍然必须在 notify_function 中使用异步信号安全函数作为处理程序调用是否正确?
另外 - 假设线程以“分离”方式运行是否正确?
例如
通知线程
void my_thread(union sigval my_data)
{
// is this ok or not (two non async-signal-safe functions)?
printf("in the notify function\n");
mq_send();
}
Run Code Online (Sandbox Code Playgroud)
主功能
(...)
se.sigev_notify = SIGEV_THREAD;
se.sigev_value.sival_ptr = &my_data;
se.sigev_notify_function = my_thread;
se.sigev_notify_attributes = NULL;
(...)
Run Code Online (Sandbox Code Playgroud)
如果可能,请提供参考。
我正在使用一个实现了两个 posix 函数的系统
mq_timedreceive() and pthread_cond_timedwait()
Run Code Online (Sandbox Code Playgroud)
这两个函数都使用基于 CLOCK_REALTIME 的绝对超时。该时钟在系统启动过程中的不同时间会发生变化,并且可以向后或向前移动 10 秒到几小时。
开放组说道:
如果支持Timers选项,则超时应基于CLOCK_REALTIME时钟;如果不支持 Timers 选项,则超时应基于 time() 函数返回的系统时钟。(mq_timedreceive)
对于操作员不连续地提前系统时钟的情况,预计实现会处理在中间时间到期的任何定时等待,就好像该时间实际上已经发生一样。(pthread_cond_timedwait())。
然而,这对于时钟向后设置的情况并没有提供任何指导。
QNX 通过提供解决了这个问题
mq_timedreceive_monotonic().
Run Code Online (Sandbox Code Playgroud)
mq_timedreceive_monotonic() 函数是 QNX Neutrino 扩展;它与 mq_timedreceive() 类似,但它使用 CLOCK_MONOTONIC,因此超时不受系统时间更改的影响。
有没有好的方法在linux中实现QNX功能?
对于 mq_timedreceive(),我可以使用 mq_receive() 和 poll()。但对于条件变量我还没有想出一个干净的方法。我可以使用计时器和信号,但这似乎太复杂了。
当然,另一个解决方案是不调整时钟或使用从 CLOCK_MONOTONIC 派生的不同时钟,但我没有自由更改设计。