Linux内核源代码情景分析-内存管理

    用户空间的页面有下面几种:

    1、普通的用户空间页面,包括进程的代码段、数据段、堆栈段、以及动态分配的“存储堆”。

    2、通过系统调用mmap()映射到用户空间的已打开文件的内容。

    3、进程间的共享内存区。

    这些页面的的周转有两方面的意思。

    1、页面的分配,使用,回收。如进程压栈时新申请的页面,这类页面不进行盘区交换,不使用时释放得以回收。

    这部分通过一个场景来解释:

    Linux内核源代码情景分析-内存管理之用户堆栈的扩展。

    通过用户调用,free_pages回收。

    2、盘区交换。如要执行硬盘上的对应代码段。把硬盘上的代码段换入内存才能执行。

    这部分通过三个场景来解释:

    Linux内核源代码情景分析-内存管理之用户页面的换入。

    Linux内核源代码情景分析-内存管理之用户页面的分配。

    Linux内核源代码情景分析-内存管理之用户页面的定期换出。

    定期换出,就会调用free_pages来回收。

    内核空间的页面有下面几种:

    1、内核代码和内核中全局量所占的内存页面既不需要经过分配也不会被释放。这部分空间是静态的。

    2、内核通过kmalloc后者vmalloc分配、用作某些临时性使用和为管理目的而设的数据结构,如vma_area_struct数据结构等,这些数据结构一旦使用完毕便无保存价值,所以立即便可释放。不过由于一个页面中往往有多个同种数据结构,所以要到整个页面都空闲时才能把页面释放。

    通过kmem_cache_reap和kmem_cache_shrink来回收。

    3、内核中通过调用alloc_pages(),为某些临时使用和管理目的而分配的页面,例如,每个进程的内核栈所占的两个页面、从内核空间复制参数时所使用的页面等等。这些页面也是一旦使用完毕便无保存价值,所以立即释放。

    通过内核调用,free_pages来回收。

    4、在内核中还有一种页面,虽然使用完毕,但其内容仍有保存价值,因此,并不立即释放。这类页面“释放”之后进入一个LRU队列,经过一段时间的缓冲让其“老化”。如果在此期间又要用到其内容了,就又将其投入使用,否则便继续让其老化,直到条件不再允许时才加以回收。这种用途的内核页面大致有以下这些: · 文件系统中用来缓冲存储一些文件目录结构dentry的空间 · 文件系统中用来缓冲存储一些索引节点inode的空间 · 用于文件系统读/写操作的缓冲区。

    通过shrink_dcache_memory和shrink_icache_memory来回收。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值