linux页框回收机制

       在现在多任务的操作系统中,内存变得越来越重要,为了保证当前进程的顺利和高效的运行,就需要在必要的时候释放一些当前不在运行的进程的页。这里就涉及了页框回收机制(PFRA)。自然这些释放的页框之前肯定不在伙伴系统的任何free_area数组中,按照页框所存的内容大体将页框分为不可回收页、可交换页、可同步页、可丢弃页。下面针对这些页进行分析。

       不可回收页,其中包括保留页(PG_reserved置位)、进程内核态堆栈页(存放task_struct等数据不能释放)、临时锁定页(PG_locked置位),可想而知这些页是不能被回收的。

       可交换页,包括用户态地址空间的匿名页、temfs文件系统的映射页(IPC共享内存的页),这类页在回收的时候首先应该将页中的内容保存在交换区(磁盘上)。

      可同步页,用户态地址空间的额映射页,存有磁盘中文件数据且在高速缓存中的页。、某些磁盘告诉缓存中的页、块设备缓冲区的页。这类页在同步的时候,如果该页中存在脏位就将该页首先与磁盘进行同步。如果页中不存在脏位就直接将该页舍弃。

最后为可丢弃页,其中包括高速缓存中的某些未使用页(文件预读进内存但是没有使用)、目录项高速缓存的未使用页,这类页可以直接丢弃。

在PFRA选择页进行释放的时候首先选择释放无害的页,然后是用户态进程的页,为了选择用户态进程的页进行释放,一般选择长时间没有被使用的页进行释放也就是所谓的LRU算法。

在释放用户态的页的同时,也要将相应的页表项进行修改。为了快速定位相应的页表项和页目录项linux中定义了反向映射机制,即通过物理页本身找到页表项。在映射的过程中映射页和匿名页采用了不同的方式.

首先说匿名页。对于每一个匿名页存在一个变量指向一个链表的头结点,这个链表中的数据是与该物理相对应的线性区的描述符(vma)。每个线性区只存在于一个这种类型的链表中。假如这个线性区对应了多个物理页,那么这些物理页就全部指向这个线性区所在链表的头结点,此时就可能造成这个链表中可能存在不与该物理页想对应的线性区(vma)。因此在反向映射的时候应该首先判断该物理页是否属于该线性区。

在找到相应的线性区之后,线性区描述符中存在指向内存描述符的指针,而内存描述符又包含指向页全局目录的指针。这样就通过物理页找到了相应的页目录。

然后是映射页,匿名线性区描述符存放在双向链表中,一般来说共享匿名页的数量不会很大,因此这个方法可以很好的工作。但是对于匿名页而言情况就不同了,例如对于包含c库代码的页几乎所有的进程都会共享,因此使用了优先搜索树这种结构快速定位应用该页框的线性区。每个页对应一个优先搜索树,通过i_mmap指针指向树根。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值