小编tre*_*ger的帖子

jemalloc,mmap和共享内存?

可以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 memory memory-management shared-memory

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

pthreads SIGEV_THREAD 和异步安全函数调用

无法追踪 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)

如果可能,请提供参考。

signals pthreads

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

pthreads、mq_timedreceive、pthread_cond_timedwait 和 CLOCK_REALTIME

我正在使用一个实现了两个 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 派生的不同时钟,但我没有自由更改设计。

pthreads message-queue condition-variable

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