以前实现操作系统通常把内存划分的很明确,例如内存通常包括Cache和Buffer以及自由内存(Free) 等等,角色明确。现代操作系统则在内存管理上不再那样分明,通常整个物理内存都当作Cache来用。
操作系统中物理内存通常是分页管理的,而且由体系结构决定页面大小,例如在Intel i386类型的 CPU上,物理内存页的大小是4096字节。FreeBSD的称
为一种unified buffer
cache的技术,字面意义就是cache和buffer是统一管理的。为了支持分页交换,每个进程的地址空间都有一个叫做vm_map
的链接表来管理,而且每个地址范围内的一项通常有一个叫做vm_object_t的类型来为程序需要某个页面时提供申请一个新页面后从某处加载保存的数据
到该新页上,同时该新页被映射进进程的虚拟地址空间,每个页面的控制信息由一个叫做vm_page_t的结构类表示,一个页面某一个时刻只能归一个
vm_object_t拥有,
vm_object_t代表了内存与外部数据源之间的联系,当页面从硬盘换入时,它为页面提供数据,当页面需要拿作他用,vm_object_t又会把数
据保存到硬盘某个地方。vm_object_t可以各种数据源,不一定是硬盘交换区,还可以是一个磁盘文件,也可以是一块显示卡中的内存区。
为了反映系统动态地使用物理内存,FreeBSD在内核中建立一些页面队列,其中主要有active, inactive, cache,
和free四种队列。active是当前系统中在一定的时间内被持续使
用的页面,系统中有一个后台核心进程专门扫描active队列,当有发现好久没有使用某个页面时,内核就会把该页面移动到inactive队列。而
cache队列中的页面是有些子系统释放某些页面,但是页面中的数据依然有效,将来还有可能再次使用其中的数据的页面,只是这些页面已经是“干净的”,不
用再存盘,典型的是文件系统使用这种技术,用户关闭文件,但是文件系统有自己的cache管理,不一定就立即关闭文件,而将数据留在内存中,以便下次
使
用时能迅速获得数据而不需要读盘。free的意思很明了,其中不包含数据也没有谁再与其有联系。无论上述是哪种页面,内核都可以随时那来作其他用途,只是
使用的优先级别不一样,在内核需要一个新页时,free的页面被最先考虑,但是当数值小于一定量时,就会从cache类型的队列中找,cache中的页面
被取出时,需要与原来的vm_object交互,或许要脱钩,当然没有申请free的页面来得快,但使用cache还是很快的,如果cache队列中没有
了页面,就会去找inactive队列中的页面,
inactive中的页面有可能是“Dirty”,在拿做其他用途时,不但要与原来的vm_object脱钩,而且还要因为是“Dirty”而要引起写
盘,万不得已时active队列中的页面就会被拿作他用,这是系统会非常繁忙了。以上队列的实现是使用LRU算法。为了优化使用CPU的L2
cache,避免给同一个vm_object_t(通常代表一个数据实体)分配映射到同一个L2 cache
行上的页面,cache和free队列都有通常有好几个队列,分配是根据一定的算法轮流在这些队列上获取页面,这个机制成为page coloring。
系统中还有另外一类页面,叫做wired,
意思是被挂起的,这些页面是不在上面讲的队列中的,因此它不能被交换到硬盘,这些页面多了会导致系统使用内存紧张,需要交换时可以活动的余地就会减少,导
致系统性能下降。通常内核中的数据结构都使用wired页面,避免在内核使用自己的数据时发生缺页而导致不可预料的结果,通常是无法恢复故障而崩溃,负载
较重的系统,wired页面会多一些。而除了内核使用的内存是wired以外,用户进程则几
乎全部使用上述四种队列种的页面,全是可以被丢弃而再重新恢复的那种类型。wired页面还可以由用户进程调用mlock系统调用锁定页面而引起的。
总之,FreeBSD的虚拟内存是与文件系统和其他数据源浑然连成一体的,整个内存被视 做一个巨大的 cache,
充分加以利用,平常见到一个系统读过硬盘上很多文件或读过一个巨 大无比的文件,系统的
cache类型的页面就会很多,而free减少就是上边讲的机制所产生的 现象,这是一种优势,使得系统整体性能得到极大提高。
常见一些朋友对FreeBSD 的内存管理迷惑不解,希望这篇文章能有所帮助,则不胜荣幸 。
阅读(668) | 评论(0) | 转发(0) |