有没有所谓的非阻塞mlock()?在繁忙的流量下,我不希望线程阻塞等待I/O。我更愿意使用mlock()从mmap()的d文件中告诉Linux内核我需要哪个区域,然后在页面被获取时得到通知。(据我所知,标准的mlock()调用是阻塞的。)
发布于 2014-07-25 01:43:21
mlock接口似乎没有任何您想要的内置功能,所以我认为实现它的唯一方法是使用单独的线程执行mlock,并在mlock返回时让该线程通知您(通过条件变量、信号量或其他机制)。显然,这会带来一些开销,但如果你的目标是获得实时延迟保证,而不是改善总体运行时/平均延迟,那么它仍然是一个明显的胜利。
当然,除非您使用mlockall,否则很难做出任何实时假设,因为您的代码可能会被换出。因此,与使用mmap相比,使用mlockall和POSIX AIO (或您自己在线程方面实现的类似但更干净的API系统)进行读取可能更有意义。那么你就有了一个硬性保证,一旦你的数据被获取,它就不能被交换出去。
发布于 2014-07-25 01:59:34
我相信您想要的是madvise()或posix_madvise()和mincore()的组合。
您可以使用madvise调用向内核请求MADV_WILLNEED。然后,您必须使用mincore进行轮询,以检查页面是否已被读取到内存中。
如果系统的内存负载很重,那么madvise调用可能永远不会读入页面,因此需要超时并回退到阻塞读取模式。
发布于 2014-07-25 01:26:34
如果您mmap()一个文件,那么您将该文件视为内存,VM分页传入/传出文件块取决于您的使用情况,这可能会从预读中受益。
有多种方法可以实现非阻塞I/O (asyncio、轮询、选择、epoll),但mlock()的作用是在RAM中保留一个内存区域,不允许它被调出到交换分区;尽管在严重的内存压力下,内核可能不会支持这一点。
最有可能的是,mmap(2)就像使用内存分页一样足够了,它们不会被选中进行页出,但无论如何都会保留在内存中,所以如果这个问题是过早优化,内核会努力提供(默认情况下)良好的性能。
https://stackoverflow.com/questions/24939931
复制相似问题