节点、内存管理区及页框

2015-7-25 chenhui 内存管理

计算机对于内存的访问可以有两种模型:UMA(一致内存访问)和NUMA(非一致内存访问)。在前者的计算机系统中,CPU访问内存中的任何一个地方所花费的时间都是一样的;后者则不然,访问内存所花费的时间取决于其所访问的位置。
对于 NUMA 模型的计算机体系而言,Linux 把那些花费时间不相同的内存分成多个节点;而对于 UMA 模型的计算机来说,他只有一个节点,包含了所有内存。
在节点下面,Linux还根据内存的使用类型把内存分成多个内存管理区,内存管理区最少分为两种类型:DMA(用于DMA的内存)、NORMA(普通内存)。在 X86 上实际还有一个 HIGHMEM(高端内存),但对于 ARM 而言,高端内存是不被使用的。
在内存管理区下面,内存又以页框为单位来进行管理,页框是最小的内存管理单位,其大小一般为 4K。。

内存节点、内存管理区、页框分别用 struct pglist_data、struct zone、struct page 来进行描述,下面我们来介绍一下这三个结构体。




node_zones :节点下的所有内存管理区描述符数组。

node_zonelists :节点的备用内存管理区,节点内存不足时从该备用区分配内存。

nr_zones :节点中管理区的个数。

node_mem_map :我们可以把他看成一个数组,这个数组保存了节点内所有的页框。当然,实际上他只是一个指针,他指向 mem_map[] 数组中某一个位置(mem_map[] 数组保存了系统中所有页框)。

bdata :内核刚启动时,会暂时使用一个叫做 bootmem 的内存分配器来管理内存,这里保存的就是那个分配器的核心结构。

node_start_pfn :节点中第一个页框的编号(他也是第一个页框在 mem_map[] 数组里的下标)。

node_present_pages :节点内页框数,不包括空洞(空洞:节点内的物理内存实际在地址上不一定连续,比如说0~1000是一段物理内存,而5000~7000 又是一段物理内存,他们就是不连续的。而1001~4999 这段地址空间因为不是物理内存所以不被使用,所以他被看成空洞。)。

node_spanned_pages :节点内页框数,包括空洞。

node_id :节点号。

kswapd_wait、kswapd、kswapd_max_order :kswapd内核线程使用。





Pages_min :管理区中保留页的数目

Page_low :回收页框使用的下界。同时也被管理区分配器为作为阈值使用,如果空闲页框数小于该值时,开始页框回收。

pages_high :回收页框使用的上界,同时也被管理区分配器作为阈值使用,如果空闲页框数大于该值时,应该停止页框回收。

lowmem_reserve :为内存不足保留的页框。

Pageset :用于实现单一页框的特殊高速缓存。每CPU、每内存管理区都有一个。包含热高速缓存和冷高速缓存。

free_area :标识出管理区中的空闲页框块。包含11个元素,被伙伴系统使用。分别对应大小的1,2,4,8,16,32,128,256,512,1024连续空闲块的链表。第k个元素标识所有大小为2^k的空闲块。free_list字段指向双向循环链表的头。

active_list :管理区的活动页框链表,最近访问过的页框指针存放在这里。

inactive_list :管理区中的非活动页链表,回收页框时就从这个链表回收,他存放很长时间没有访问的页。

nr_scan_active :每次扫描活动链表准备回收页框时,一次扫描几个页。

nr_scan_inactive :每次扫描非活动链表准备回收页框时,一次扫描几个页。

nr_active :管理区的活动链表上的页数目。

nr_inactive :管理区的非活动链表上的页数目。

wait_table :当进程等待管理区中的某页时,进入该等待队列。

wait_table_size :wait_table 的大小。

wait_table_bits :wait_table_size 的对数。

zone_pgdat :管理区所属的节点。

zone_start_pfn :管理区的第一个页框的编号。

spanned_pages :管理区内的页框数,包括空洞。

present_pages :管理区内的页框数,不包括空洞。



大多数字段我们这里并不需要理解,所以我们下面只简单介绍少数字段。

flags :一组标志,也对物理页所在的管理区进行编号。

count :页框的引用计数。要注意,他是当小于0时才表示没有人使用,有1个人使用时他为 0

_mapcount :映射到此页框的页表项数。他的值有三种可能。

-1: 表示没有页表项映射该页框。

0: 表明页是非共享的即一个用户态进程的页表中的页表项指向这个页框 )

>0: 表示而是共享共享的。即多个用户态进程的页表中的页表项指向这个页框 )

 


发表评论:

Copyright ©2015-2016 freehui All rights reserved