Linux 内存管理浅析

来源:互联网 发布:贵州省大数据公需科目 编辑:程序博客网 时间:2024/05/16 07:19

一. Linux内存管理概览


在我们进入这部分内容之前,我想先问几个问题。为什么我们需要内存管理呢?内存管理是由哪些模块来实现的呢?应用程序是否有自己的内存管理呢?和内核的内存管理有关联吗?

对于内存管理,我们大致可以分为应用程序内部和系统级的内存管理。设想一下,对于应用程序来说,需要解决的是什么呢?当然是业务需求,是具体的问题,是与现实世界的交互。需要关心内存管理吗?我认为是不需要的,这是计算机本身的问题,在我的应用程序里为什么要去管理它呢。像JAVA之类的语言已经在进行这方面的尝试了,应用程序的实现者只要关注功能实现就可以了,至于计算机本身的问题,就交给中间件去实现吧。这里的中间件或虚拟机之类的就是应用程序内部的内存管理。它负责管理从系统申请的内存在程序内部的有序使用和释放。这是语言库和语言的设计者需要考虑的问题。

当有多个应用程序同时运行时,系统内存管理就是必不可少的了。而这是计算机的问题,是系统设计者需要考虑的问题。系统内存管理一个重要问题就是,如何管理多个同时运行进程的内存需求。现代CPU大多都采用了虚拟页面映射技术。这是一次技术飞跃。它是基于这样一种假设,即内存访问的局部性。这增加了内存管理的复杂性,但带来的好处是显而易见的。

  1. 它让进程的运行更加安全。CPU在用户态访问的地址,严格限制在每个进程的自己的地址空间内。
  2. 使内存访问的安全控制成为可能。CPU访问实际的内存地址空间,必须要进行地址转换。在MMU进行地址转换的时候,可以根据页表的设置灵活配置访问权限。
  3. 使内存资源的管理更加有效,灵活。内存申请做到真正按需分配。同时让系统理论上可以同时运行无限多的进程成为可能。
  4. 在PowerPC上,还有另外一种好处。就是IO访问的统一编址。PowerPC与x86不同之处有一点就是对于物理地址空间的统一编址。实现了页面映射后,IO地址的访问更加灵活。

我所介绍的基于PowerPC平台的Linux内存管理就是以这种虚拟页面映射技术为基础。这包括了以下几个大的部分:

  1. 页面映射管理部分。
    这部分会比较多的涉及到平台相关。我会从通用框架部分开始,通过PowerPC平台,尽量帮助你理解这部分系统是怎么设计的。
  2. 物理内存的管理及内核地址空间管理。
    这部分涉及到物理内存资源的管理。主要有伙伴算法、slab分配器、内核部分的内存分配函数(vmalloc, kmalloc, __get_free_pages等)等的介绍。这部分内容,很多书籍和文档都有描述。我尽量把我的理解分享给大家。
  3. 用户进程空间的管理。
    这部分是关于用户进程空间地址的管理,包括了用户进程栈、堆分配,mmap的实现等。
  4. 内存的回收和页面交换。
    这部分内容涉及到比较多的模块,需要对上面几个部分有了比较深入的了解之后,我们才能讨论这个主题。

下面我大概的列出了Linux内存管理模块各部分。


Linux内存管理模块


后面我们先看看页面映射管理模块。