繁体   English   中英

非阻塞mlock()

[英]Non-blocking mlock()

是否有非阻塞mlock()之类的东西? 在通信繁忙的情况下,我不想让线程阻塞等待I / O。 我宁愿只是使用mlock()告诉Linux内核我需要从mmap()文件中的哪个区域,然后在提取页面时得到通知。 (据我所知,标准的mlock()调用正在阻止。)

mlock接口似乎没有您想要的任何内置功能,因此我认为实现此功能的唯一方法是使用单独的线程执行mlock并使该线程通知您(通过条件变量,信号量)或其它机构),当mlock已经返回。 显然,这会产生一些开销,但是如果您的目标是获得实时延迟保证,而不是改善总体运行时/平均延迟,那仍然是一个明显的胜利。

当然,除非使用mlockall否则很难做出任何实时假设,因为代码可能会被换出。 因此,使用mlockall和POSIX AIO(或类似的但更清晰的API系统,根据线程自己实现)可能更有意义,而不是使用mmap 然后,您将坚决保证,一旦提取了数据,就无法将其交换出去。

我相信您想要madvise()posix_madvise()mincore()

您将使用madvise调用向内核询问MADV_WILLNEED 然后,您将不得不使用mincore进行轮询,以检查是否已将页面读入内存。

如果系统承受沉重的内存负载,则可能无法通过madvise调用来读取页面,因此您将需要超时并回退到阻塞读取模式。

如果您对文件进行mmap()处理,则将该文件视为内存,VM会根据您的使用情况来分页输入/输出文件,这可能会受益于预读。

有多种方法可以执行非阻塞I / O(异步,轮询,选择,epoll),但是mlock()涉及在RAM中保存一个内存区域,不允许将其分页到交换分区。 尽管在严重的内存压力下,内核可能无法兑现。

mmap(2)最有可能就好像您正在使用内存页面一样,它们不会被选择用于页面输出,但是无论如何都会保留在内存中,因此请考虑是否这个问题是过早的优化,内核会尽力提供(默认情况下) ) 很好的表现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM