Chinaunix首页 | 论坛 | 博客
  • 博客访问: 155413
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-28 14:16
文章分类

全部博文(115)

文章存档

2017年(36)

2016年(79)

我的朋友

分类: LINUX

2017-02-19 16:58:35

原文地址:Linux 页缓存 作者:chaohona

(虚拟地址空间是相对磁盘空间到物理内存空间的映射而言来说的).
经内存映射的文件每次只读取一页内容,读取后的页保存在页缓存中,利用页缓存,可提高文件的访问速度。如图 10-6 所示,页缓存由 page_hash_table 组成,它是一个 mem_map_t 数据结构的指针向量。页缓存的结构是 Linux 内核中典型的哈希表结构。众所周知,对计算机内存的线性数组的访问是最快速的访问方法,因为线性数组中的每一个元素的位置都可以利用索引值直接计算得到,而这种计算是简单的线性计算。但是,如果要处理大量数据,有时由于受到存储空间的限制,采用线性结构是不切合实际的。但如果采用链表等非线性结构,则元素的检索性能又会大打折扣。哈希表则是一种折衷的方法,它综合了线性结构和非线性结构的优点,可以在大量数据中进行快速的查找。哈希表的结构有多种,在 Linux 内核中,常见的哈希结构和图 10-6 的结构类似。要在这种哈希表中访问某个数据,首先要利用哈希函数以目标元素的某个特征值作为函数自变量生成哈希值作为索引,然后利用该索引访问哈希表的线性指针向量。哈希线性表中的指针代表一个链表,该链表所包含的所有节点均具有相同的哈希值,在该链表中查找可访问到指定的数据。哈希函数的选择非常重要,不恰当的哈希函数可能导致大量数据映射到同一哈希值,这种情况下,元素的查找将相当耗时。但是,如果选择恰当的哈希函数,则可以在性能和空间上得到均衡效果。
在 Linux 页缓存中,访问 page_hash_table 的索引由文件的 VFS(虚拟文件系统)索引节点 inode 和内存页在文件中的偏移量生成。有关 VFS 索引节点的内容将在第十三章中讲述,在这里,应知道每个文件的 VFS 索引节点 inode 是唯一的。


图 10-6 Linux 页缓存示意图
当系统要从内存映射文件中读取某页时,首先在页缓存中查找,如果发现该页保存在缓存中,则可以免除实际的文件读取,而只需从页缓存中读取,这时,指向 mm_map_t 数据结构的指针被返回到页故障的处理代码;如果该页不在缓存中,则必须从实际的文件系统映象中读取页,Linux 内核首先分配物理页然后从磁盘读取页内容。
如果可能,Linux 还会预先读取文件中下一页内容,这样,如果进程要连续访问页,则下一页的内容不必再次从文件中读取了,而只需从页缓存中读取。
随着映象的读取和执行,页缓存中的内容可能会增多,这时,Linux 可移走不再需要的页。当系统中可用的物理内存量变小时,Linux 也会通过缩小页缓存的大小而释放更多的物理内存页。
阅读(773) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~