C 在Linux中访问mark_page_的目的是什么?

C 在Linux中访问mark_page_的目的是什么?,c,linux,performance,linux-kernel,disk-io,C,Linux,Performance,Linux Kernel,Disk Io,我正在分析我的I/O密集型应用程序,在执行read时遇到了一些奇怪的事情。下面是让我感到困惑的性能报告的一部分: 可以看出,它占用了文件读取例程的20%。它似乎与块设备I/O无关,在我的例子中,块设备I/O是由块设备I/O执行的,而块设备I/O甚至没有被调用。所以所有文件数据都在缓存中 以下文字对实施进行了评论: /* * Mark a page as having seen activity. * * inactive,unreferenced -> inactive,r

我正在分析我的I/O密集型应用程序,在执行
read
时遇到了一些奇怪的事情。下面是让我感到困惑的
性能报告的一部分

可以看出,它占用了文件读取例程的20%。它似乎与块设备I/O无关,在我的例子中,块设备I/O是由块设备I/O执行的,而块设备I/O甚至没有被调用。所以所有文件数据都在缓存中

以下文字对实施进行了评论:

/*
 * Mark a page as having seen activity.
 *
 * inactive,unreferenced    ->  inactive,referenced
 * inactive,referenced      ->  active,unreferenced
 * active,unreferenced      ->  active,referenced
 *
 * When a newly allocated page is not yet visible, so safe for non-atomic ops,
 * __SetPageReferenced(page) may be substituted for mark_page_accessed(page).
 */
因此,如果页面处于
非活动状态
未引用状态
,则会出现这种情况


问题:访问此
标记页面的原因是什么?是否因为页面处于
非活动状态
未引用
?原因可能是什么?页面已从磁盘读取,因此不会发生页面错误(主要或次要)

似乎与()及其LRU列表有关,请检查。页面缓存中的页面以几种结构列出,以允许内核在没有可用内存时查找最近未使用的页面。@osgx谢谢,非常有用!但在某种意义上,内核对某些页面执行了
readahead
,此后这些页面仍然没有“最近使用过”。这怎么可能?或者我没听清你的意思?readahead不是主动存取,而是I/O预取(优化),因为IO设备更适合大顺序存取(旋转生锈的HDD更适合大I/O,而不是短请求;SSD只适合大的几倍)。活动的页面缓存跟踪用于用户空间请求。读/写系统调用没有任何页面错误-直接调用时会进行复制(复制页面到iter,复制用户增强的快速字符串rep movsb),逐页复制,哪些调用是通用的页面读取+标记页面访问