笨叔叔借我点内存用用呗

笨叔叔,可以借我点物理内存用用吗?用完了就还给你。

不行,你是坏进程,你在偷笨叔叔的内存,我要kill了你~~



有不少同学接触Linux的内存管理是从malloc()这个C语言库函数开始的。从那时候开始就知道了有虚拟内存这个概念,那虚拟内存究竟是个什么东西呢?怎么虚拟法呢?只关注上层应用程序编写的同学对于这些东西可能不是太关心。可是如果不了解一些这方面的知识,也很难设计出高效的应用程序。很早期的操作系统是没有虚拟内存这个概念的,为什么现代操作系统都有虚拟内存这个概念了,包括windows或者Linux。要搞明白虚拟内存是怎么回事,你可能需要了解什么是MMU、什么是页表、什么是物理内存、什么是物理页面、什么是建立映射关系、什么叫按需分配、什么是缺页中断以及什么是写时复制。

当了解什么是MMU时,除了了解MMU工作原理外,还会接触到Linux内核是如何建立页表映射的,这当中也包括用户空间页表的建立和内核空间页表的建立。还包括内核是如何查询页表以及修改页表的。

当了解什么是物理内存和物理页面时,会接触到struct pg_data_t、struct zone以及struct page数据结构,这三个数据结构描述了系统中物理内存的组织架构。struct page数据结构除了描述一个4KB(或者其它大小)大小的物理页面外,还包含了很多复杂而有趣的成员。

当了解怎么分配物理页面时,会接触到伙伴系统机制以及页面分配器(page allocator),页面分配器是内存管理中最复杂的代码之一。

物理内存有了,那怎么和虚拟内存建立映射关系呢?在Linux内核中描述进程的虚拟内存用struct vm_area_struct数据结构。虚拟内存和物理内存建立映射关系采用建立页表的方法来完成。为什么和进程地址空间建立映射的页面有的叫匿名页面而有的叫page cache页面呢?

当了解malloc()怎么分配出物理内存时,会接触到缺页中断。缺页中断也是内存管理中最复杂的代码之一。

这时,虚拟内存和物理内存已经建立了映射关系了,这是基于页为基础的,可是有时候内核需要小于一个页面大小的内存,那slab机制诞生了。

上面已经勾画出虚拟内存和物理内存的基本框图了,但是如果用户进程持续分配和使用内存,这时物理内存不足了怎么办?页面回收机制和反向映射机制孕育而生了。

虚拟内存和物理内存的映射关系经常是建立了又被解除了,时间长了系统物理页面布局变得凌乱不堪,碎片化严重,这时候内核如果需要分配大块连续内存变得越来越困难了,那内存规整机制(Memory Compaction)就诞生了。

上述是一位笨叔叔学习Linux内核内存管理知识痛并快乐的心路历程。



敬请关注《奔跑吧Linux内核》,即将和大家见面。

微信号:runninglinuxkernel

微博/微信公众号:奔跑吧Linux内核


详情请点击



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值