【问题标题】:C: Know when a variable is read or writtenC:知道何时读取或写入变量
【发布时间】:2017-11-06 12:48:30
【问题描述】:

目前致力于 Arm Xilinx 开发平台。使用 linux 和 C。

我映射了一些页面。例如a = mmap(...) 。我想知道哪些页面最近使用最少,以便我可以将它们复制到其他地方。

【问题讨论】:

  • XY problem? 为什么你需要知道?谁访问它们?简单的回答:你不能,除非你将这些访问封装在其他人使用的函数中。
  • 我正在写一个库,我想知道哪些页面最近最少使用,所以我可以将它们复制到其他地方。
  • 库不能这样做,除非它将所有访问都包装在调用者必须使用的函数中(这会非常不方便)。 内核也许可以做类似的事情。
  • 您可以在页面被访问时被告知:将访问权限设置为PROT_NONE(使用 mprotect)并安装一个 segv 处理程序,该处理程序将在任何时候访问变量时调用。但是,如果频繁访问变量,这当然会对性能产生重大影响。
  • 要么在调试器中插入观察点,要么插入探查器检测,或者简单地输入日志信息。

标签: c linux memory arm mmap


【解决方案1】:

Linux 内核本身会跟踪 LRU 页面,例如,在内存争用时找出要交换或不交换哪些页面。

如果你想在你的库中使用它,你可以从用户空间读取 LRU 标志:

  • 遍历您要在 /proc/pid/pagemap 中跟踪的虚拟页面条目并记住页框编号
  • 从 /proc/kpageflags 中读取这些页面对应的标志

现在您有几个标志,可用于您的逻辑:

 3. UPTODATE  page has up-to-date data
              ie. for file backed page: (in-memory data revision >= on-disk one)
 4. DIRTY     page has been written to, hence contains new data
              ie. for file backed page: (in-memory data revision >  on-disk one)
 8. WRITEBACK page is being synced to disk

    [LRU related page flags]
 5. LRU         page is in one of the LRU lists
 6. ACTIVE      page is in the active LRU list
18. UNEVICTABLE page is in the unevictable (non-)LRU list
                It is somehow pinned and not a candidate for LRU page reclaims,
        eg. ramfs pages, shmctl(SHM_LOCK) and mlock() memory segments
 2. REFERENCED  page has been referenced since last LRU list enqueue/requeue
 9. RECLAIM     page will be reclaimed soon after its pageout IO completed
11. MMAP        a memory mapped page
12. ANON        a memory mapped page that is not part of a file
13. SWAPCACHE   page is mapped to swap space, ie. has an associated swap entry
14. SWAPBACKED  page is backed by swap/RAM

this document 中描述了更多标志

还有一个名为soft-dirty 的功能,专门用于跟踪最近的写入(读取被忽略)(请参阅Soft Dirty 文档)。您可以通过 /proc 清除软脏标志,然后通过 /proc/pid/pagemap 再次读取它们。也许这对您的应用程序也很方便。

【讨论】:

【解决方案2】:

您是否考虑过使用vmstat(8) Report virtual memory statistics

vmstat 报告有关进程、内存、分页、块 IO、陷阱和 cpu 活动的信息。 (强调我的)

包括:

平板模式字段说明

cache:缓存名称 num:当前活动对象总数:Total 可用对象数量大小:每个对象的大小页面:数量 具有至少一个活动对象的页面 totpages:总页数 分配的页面pslab:每个slab的页数

这里有一个 Linux Journal article 更详细地介绍了如何使用 vmstat 来监控操作系统统计信息。摘录如下:

使用 vmstat

vmstat,顾名思义,报告虚拟内存统计信息。它 显示有多少虚拟内存,有多少空闲和分页 活动。最重要的是,您可以将页面输入和页面输出观察为 他们发生了。这非常有用。

要监控系统上的虚拟内存活动,最好 延迟使用 vmstat。延迟是之间的秒数 更新。如果您不提供延迟,vmstat 会报告平均值 自上次启动并退出。建议延迟五秒 间隔。

要延迟 5 秒运行 vmstat,请输入:

vmstat 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多