linux内核 -内存管理模块概图
1.从进程(task)的角度来看内存管理每个进程对应一个task_struct;每个task_struct 里面包含mm_struct 的指针mm_struct 里面的主要成员:a.指向vma链表的头指针:mmapb.指向vma红黑树的根节点: mm_rbc.指向进程列表的指针pgb;vma(vm_area_struct)结构体的主要成员:a.vm...
1.从进程(task)的角度来看内存管理
- 每个进程对应一个task_struct;
- 每个task_struct 里面包含指向mm_struct 的指针mm,
mm_struct 里面的主要成员:
a. 指向vma链表的头指针:mmap
b. 指向vma红黑树的根节点: mm_rb
c. 指向进程列表的指针pgb; - vma(vm_area_struct): 进程虚存管理的最基本的管理单元应该是struct vm_area_struct了,它描述的是一段连续的、具有相同访问属性的虚存空间,该虚存空间的大小为物理内存页面的整数倍。通常,进程所使用到的虚存空间不连续,且各部分虚存空间的访问属性也可能不同。所以一个进程的虚存空间需要多个vm_area_struct结构来描述。
结构体的主要成员:
a. vma的起始和结束地址;
b. 指向vma 前后节点的指针
c. 指向当前vma在红黑树中的位置指针;
d. 指向当前vma所归属的mm_struct 的指针;
2.从物理页面(page)的角度来看待内存管理
- mem_map[] 里面包含了所有的物理页面,可以通过索引来访问。
每一个物理页面用 struct page来表示,page 里面的主要成员介绍:
a. flags里面包含了当前页面的标志
另外也包含了其所属的zone的标志。
b. mapping:表示这个页面指向的地址空间。反响映射(reverse mapping)时使用,比如页面回收时。
c. _mapcount:表示这个页面被进程映射的个数。
d. _count:内核中引用该页面的次数,当其为0时,表示这个页面空闲。struct zone:
zone 里面的主要成员介绍:
a. watermark[]: zone的3个水位值:min/low/high, 在kswapd页面回收中会用到;
b. lowmem_reserve[]: zone中遗留的内存:
https://blog.csdn.net/kickxxx/article/details/883573
kernel在分配内存时,可能会涉及到多个zone,分配会尝试从zonelist第一个zone分配,如果失败就会尝试下一个低级的zone(这里的低级仅仅指zone内存的位置,实际上低地址zone是更稀缺的资源)。我们可以想像应用进程通过内存映射申请Highmem 并且加mlock分配,如果此时Highmem zone无法满足分配,则会尝试从Normal进行分配。这就有一个问题,来自Highmem的请求可能会耗尽Normal zone的内存,而且由于mlock又无法回收,最终的结果就是Normal zone无内存提供给kernel的正常分配,而Highmem有大把的可回收内存无法有效利用。
因此针对这个case,使得Normal zone在碰到来自Highmem的分配请求时,可以通过lowmem_reserve声明:可以使用我的内存,但是必须要保留lowmem_reserve[NORMAL]给我自己使用。
同样当从Normal失败后,会尝试从zonelist中的DMA申请分配,通过lowmem_reserve[DMA],限制来自HIGHMEM和Normal的分配请求。
c. zone_pgdat: 指向内存节点
在UMA系统上,只使用一个NUMA结点来管理整个系统内存
d. lruvec: LRU的链表集合,用于内存页面回收(page reclaim)
共5个链表:
匿名页面的不活跃链表、匿名页面的活跃链表
文件页面的不活跃链表、文件页面的活跃链表
不可回收页面链表
struct lruvec {
struct list_head lists[NR_LRU_LISTS];
struct zone_reclaim_stat reclaim_stat;
#ifdef CONFIG_MEMCG
struct zone *zone;
#endif
};
enum lru_list {
LRU_INACTIVE_ANON = LRU_BASE,
LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
LRU_UNEVICTABLE,
NR_LRU_LISTS
};
3.task里面的vma和page怎么关联呢?
下一节详细研究
更多推荐
所有评论(0)