1.Struct page数据结构中的_count和_mapcount有什么区别?
1.1 _count
_count和_mapcount都是引用计数,它们都是atomic类型的变量,但是它们的用途各不一样。 其中,_count表示内核中引用该页面的次数,当_count值为0时,表示该page页面为空闲或即将要被释放的页面。当_count的值大于0时,表示该page页面以及被分配且内核正在使用,暂时不会被释放。内核中加减_count引用计数的API为get_page()和put_page()。
_count引用计数常在内核中用于追踪page页面的使用情况。使用情况如下:
① 分配页面时_count引用计数会变成1
② 加入LRU链表时,page页面会被kswapd内核线程使用,_count会加1
③ 被映射到其他用户进程pte时,_count加1,例如创建子进程
④ 页面的private私有数据会增加引用
⑤ ⑤内核对页面进行操作会增加引用计数(follow_page)
1.2 _mapcount
_mapcount用于表示这个页面被进程映射的个数,即已经映射了多少各用户pte页表。_mapcount引用计数主要用于RMAP反向映射系统中。
_mapcount=-1,表示没有pte映射到页面
_mapcount=0,表示只有父进程映射了页面。匿名页面刚分配时,会设置_mapcount=0。
_mapcount>0,表示除了父进程还有其他进程映射了这个页面。
2.匿名页面和page cache有什么区别?
匿名页面:匿名页面没有指定映射的文件来源。出现匿名页面的场景由四个:
① 发生写时复制,当缺页中断出现写保护错误时,新分配的页面是匿名页面。
② 用户空间malloc/mmap接口函数来分配内存,在内核空间发生缺页中断时,调用do_anonymous_page()会产生匿名页面。
③ do_swap_page(),从swap分区 读回数据时会新分配匿名页面
④ 迁移页面
Page cache:
每当读取文件时,都会将数据放入page cache中,以避免后续读取时进行昂贵的磁盘访问。 类似地,当写入文件时,数据被放置在page cache中并最终进入后备存储设备。 写入的页面被标记为脏,当 Linux 决定将它们重用于其他目的时,它会确保将设备上的文件内容与更新的数据同步。
3.Struct page数据结构中有一个锁,trylock_page和lock_page有什么区别?
trylock_page使用test_and_set_bit_lock去尝试为page的flags设置PG_locked标志位,并且返回原来标志位的值。trylock_page返回false表示获取锁失败,返回true表示获取锁成功。
lock_page用于申请页面锁,如果页面锁被其他进程占用,那么就会睡眠等待。
4.在linux2.4中如何从一个page找到所有映射该页面的VMA?反向映射可以带来哪些便利?
在2.4的内核中,为了从一个page找到映射该页面的VMA,必须遍历每个进程的页表。
反向映射的使用提高了查找进程页表的效率,减少了查找VMA的工作量。