目录
申请分配页的时候,页分配器首先尝试使用低水位线分配页。如果分配失败,说明内存轻微不足,页分配器将会唤醒内存节点的页回收内核线程,异步回收页,然后尝试使用最低水线分配页。如果使用最低水线分配失败,说明内存严重不足,页分配器将会直接回收页。
1)交换支持的页(没有存储设备的支持)包括:1)匿名页;2)tmpfs文件系统的文件页;3)进程在修改私有的文件映射时复制生成的匿名页。
交换支持的页回收策略:采用页交换的方法,先把页的数据写到交换区,然后释放物理页。
2)存储设备的支持的文件页:
1)如果是干净的页,即把文件从存储设备读到内存后没有修改,可以直接回收;
2)如果是脏页:即把文件从存储设备读到内存后修改过,先回到存储设备,再释放物理页。
LRU(Least Recently Used,最近最少使用)选择最近最少使用的页。
如果物理页被映射到虚拟地址空间(反向映射),需要从页表中删除虚拟页到物理页的映射。
每个内存节点的pglist_data实例有一个成员lruvec,称为LRU向量,包含5条LRU链表。
不活动匿名页LRU,活动匿名页LRU,不活动文件页LRU,活动文件页LRU,不可回收LRU链表。
回收页表映射的匿名页或文件页时,需要从页表中删除映射,内核需要知道物理页被映射到那些进程的虚拟地址空间,需要实现物理页到虚拟页的反向映射。分为匿名页的反向映射和文件页的反向映射。
每个内存节点有页回收线程,如果内存节点的所有内存区域的空闲页数小于高水位线,页回收线程就会反复尝试回收页,调用函数shrink_node以回收内存节点中的页。
针对备用区域列表中符合分配条件的每个内存区域,调用函数shrink_node来回收内存区域所属的内存节点中的页。回收页以内存节点为单位。
1)计算需要扫描多少不活动匿名页,活动匿名页,不活动文件页和活动文件页;
2)依次扫描四类LRU页
3)如果是活动LRU链表,并且不活动的页比较少,那么调用shrink_active_list把一部分活动页加入到不活动页(收缩活动页列表)
4)如果是不活动LRU链表,那么调用shrink_inactive_list回收不活动页。
当内存不足的时候,把最近很少访问的没有存储设备支持的物理页的数据保存到交换区,释放内存空间,当交换区内存中存储的页访问的时候,再把数据从交换区读到内存中。
交换分区可以是一个磁盘分区(机械硬盘、固态硬盘、NAND闪存),也可以是存储设备上的一个文件。
使用方法
参考链接
https://course.0voice.com/v1/course/intro?courseId=2&agentId=0