`
woodding2008
  • 浏览: 290374 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Linux内存管理

 
阅读更多

       内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻址单位通常为字(甚至字节),但是内存管理单元(MMU 管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理。正是因为如此,MMU以页(page)大小为单位来管理系统中的页表。从虚拟内存的角度来看,页就是最小单位。

    struct page{

   unsigned long flags;

   atomic_t  _count;

   atomic_t  _mapcount;

   unsigned long private;

   struct address_space *mapping;

   pgoff_t      index;

   struct list_head lru;

   void    *virtual;

  };

  • flag域用来存放页的状态,这些状态包括页是不是脏的,是不是被锁定在内存中等。
  • _count域存放页的引用计数,当计数器值变为-1时,就说明当前内核并没有引用这一页,在新的分配中就可以使用它。
  • virtual域是页的虚拟地址。在高端内存并不永久映射到内核地址空间上,这时域的值为null,需要的时候动态映射这些页。

      内核用这一个结构来管理系统中所有的页,因为内核需要知道一个页是否空闲。如果已经分配,内核还需要知道谁拥有这个页。拥有者可能是用户空间进程、动态分配的内核数据、静态内核代码或页高速缓存等。

      计算页管理内存开销,假设struct page占40字节,假定系统物理页为8kb大小,系统有4GB物理内存,那么系统中一共有524288个页,page结构体要消耗20MB,这个体量相对于4GB而言只占很小一部分。

 

        由于硬件的限制,内核并不能对所有页一视同仁。有些页位于内存中特定的物理地址上,所以不能将其用于一些特定的任务。由于存在了这种限制,所以内核把页划分为不同的区(zone)。内核使用区对具有相似特征的页进行分组。

       Linux必须处理如下两种由于硬件存在缺陷而引起的内存寻址问题:

  • 一些硬件只能用某些特定的内存地址来执行DMA(直接访问内存)
  • 一些体系结构的内存的物理寻址访问比虚拟寻址范围大的多,这样就有一些内存永远不能映射到内核空间上。

      因为这些限制条件,Linux主要使用了四种区:

  • ZONE_DMA -- 这个区包含的页功能来执行DMA操作
  • ZONE_DMA32 -- 和ZONE_DMA类似,该区包含的页面可用来执行DMA操作,而和ZONE_DMA不同之处在于,这些页面只能被32位设备访问。
  • ZONE_NORMAL 这个区浩航的都是能正常映射的页。
  • ZONE_HIGHEM 这个区包含“高端内存”,其中的页并不能永久地映射到内核地址空间。

       Linux把系统的页划分为区,形成不同的内存池,不是所有的体系机构都定义了全部的四个区,有些64位的体系结构,如Intel的x86-64体系机构可以映射和处理64位的内存空间,所以x86-64没有ZONE_HIGHMEM区,所有的物理内存都处于ZONE_DMA和ZONE_NORMAL区。

 

slab层

       分配和释放数据结构是所有内核中最普遍的操作之一。为了便于数据的频繁分配和回收,编程人员常常会用到空闲链表。空闲链表包含可供使用的、已经分配好的数据结构块。当代码需要一个新的数据结构实例是,就可以从空闲链表中抓取一个,而不需要分配内存,再把数据放进去,以后当不需要这个数据结构的实例,就把它放回空闲链表,而不是释放它。从这个角度讲,空闲链表相当于对象的高速缓存。

       内核中,空闲链表面临的主要问题之一是不能全局控制。当可用内存变得紧缺时,内核无法通知每个空闲链表,让其收缩缓存的大小以便释放出一些内存来。实际上,内核根本就不知道存在任何空闲链表。为了弥补这一缺陷,也为了使代码更加稳固,Linux内核提供了slab层(也就是slab分配器)。slab分配器扮演了通用数据结构缓存层的角色。

       slab分配器试图在几个基本原则之间寻求一种平衡:

  • 频繁使用的数据结构也会频繁分配和释放,因此应当缓存他们。
  • 频繁分配和回收必然导致内存碎片,因为已释放的数据结构又会放回空闲链表,因此不会导致碎片。
  • 回收的对象可以立即投入下一次分配,因此,对于频繁释放和分配,空闲链表能提高性能。
  • 如果分配器知道对象大小,页大小和总的高速缓存的大小这样的概念,它会做出更明智的决策。
  • 如果让部分缓存专属于单个处理器,那么分配和释放就可以在不加SMP锁的情况下进行。
  • 如果分配器是与NUMA相关的,它就可以从相同的内存节点为请求者进行分配。
  • 对存放的独享进行着色(color),以防止多个对象映射到相同的高速缓存行(cache line)。 

 

     slab层把不同的对象划分为所谓的高速缓存组。其中每个高速缓存组存放不同类型的对象,每种对象类型对应一个高速缓存。slab由一个或多个物理上连续的页组成。一般情况下,slab也就仅仅由一页组成。每个高速缓存可以由多个slab组成。每个slab有三种状态:满、部分、空闲。


 

 

 

  • 大小: 49.1 KB
分享到:
评论

相关推荐

    linux内存管理实验报告

    Linux内存管理是操作系统的核心组成部分,它负责有效地分配和回收内存资源,确保系统高效稳定地运行。在本实验中,我们主要探讨了Linux虚拟内存管理的原理、动态内存操作函数的使用,以及如何检测主存使用情况。 ...

    linux内存管理源代码导读

    Linux 内存管理源代码导读 Linux 内存管理是操作系统中最重要的组件之一,它负责管理计算机的内存资源,确保系统的正确运行。在 Linux 操作系统中,内存管理是通过页框管理、Slab 算法和动态存储器管理来实现的。 ...

    Linux内存管理详解.ppt

    Linux内存管理是操作系统的核心组成部分,尤其对于服务器和嵌入式设备等依赖稳定高效内存操作的环境至关重要。在Linux内核中,内存管理涉及到多个层面,包括分配、释放、碎片控制以及高速缓存优化等。 首先,Linux...

    Linux内存管理笔记

    Linux内存管理笔记详细介绍了Linux操作系统内核中内存管理机制的关键知识点,下面将依次对这些知识点进行详细说明: 存储器的层次结构:计算机系统采用分层的存储子系统以在存储容量、访问速度、成本效益之间取得...

    linux内存管理总结

    以下是Linux内存管理的一些关键知识点: 1. **内存管理工具**: - CodeViz:这是一个用于生成代码调用关系图的工具,可以帮助开发者理解代码间的调用结构,虽然在描述中没有详细展开,但它是分析Linux内核源码的...

    linux内存管理结构图

    Linux内存管理是操作系统的核心部分,它负责有效地分配和回收系统中的物理和虚拟内存。在Linux中,内存被划分为多个区域(Zone)和节点(Node),以优化内存的使用和性能。以下是对这些概念的详细解释: 1. **节点...

    Linux内存管理编程技术.doc

    Linux内存管理是操作系统的核心组成部分,它负责有效地分配、管理和回收内存资源。在Linux环境中,程序员通常通过系统调用和库函数来与内存管理接口交互。本实验主要关注两个方面:一是使用malloc()函数进行内存分配...

    Linux内存管理介绍

    ### Linux内存管理介绍 #### 虚拟内存与Linux 在深入探讨Linux内存管理之前,我们先了解一下虚拟内存的基本概念及其在Linux系统中的应用。虚拟内存是一种计算机内存管理技术,它通过将进程的虚拟地址空间映射到...

    一种Linux内存管理机制.pdf

    Linux内存管理机制包括多种层次和策略,旨在高效地分配和回收内存,避免内存耗尽和系统崩溃。本文将深入探讨Linux内存管理模型、伙伴系统、Slab分配流程以及内存回收策略。 首先,Linux内存管理模型将物理内存划分...

    linux内存管理

    ### Linux内存管理详解 #### 一、Intel x86保护模式下的分段与分页机制 在探讨Linux如何实现内存管理之前,我们首先需要理解Intel x86架构下的内存管理基础——分段与分页机制。 **分段机制**: - **段选择器**:...

    深入理解Linux内存管理

    ### 深入理解Linux内存管理 #### 一、引言与概述 本文档旨在深入探讨Linux 2.4版本中的内存管理系统。作者Mel Gorman在2004年撰写了这一篇详尽的文章,其内容涵盖了从启动时的内存分配到运行时内存管理的所有方面...

    Linux内存管理实验.pdf

    Linux内存管理实验是关于Linux操作系统内存管理机制的学习和实践。本实验中会涉及到诸多内存管理的关键概念和工具,如free、vmstat、readelf、objdump等。接下来将详细解释上述内容中涉及的关键知识点。 首先,free...

    linux内存管理工具

    linux内存管理工具

    Linux内存管理 vs. Windows 2000内存管理

    同时,Linux内存管理器提供不同类型的内存区域(如BSS、堆、栈等)以满足不同需求,并且有 slab 分配器优化小对象的分配和回收。 - **Windows 2000**:Windows 2000使用分代垃圾收集(Generational Garbage ...

    深入理解LINUX内存管理学习笔记

    我不可能完全理解LINUX内存管理的精髓,肯定有很多地方理解错误。希望大 家能够指正,以便提高,谢谢。 学习方法: 可能您第一次阅读的时候很多地方都不理解,不用担心。那您可能需要阅读一些 文件系统的知识。 或者...

    linux内存管理-物理内存管理.pdf

    整个内存管理系统可以分为2部分来看待: 第一部分是对物理内存的管理, 第二部分是对虚拟内存的管理. 物理内存管理的对象是板载的物理内存(DDRAM), 它把物理内存按页划分, 并把这些页放到一个池子里面. 物理内存管理...

    Linux内存管理编程

    Linux内存管理编程是操作系统核心部分的关键技术之一,它涉及到如何高效地分配、使用和回收内存资源。本实验旨在帮助你深入理解Linux环境下的内存管理机制,主要包括内存映射(mapping)和解除映射(unmapping),...

    Linux 内存管理详细介绍.docx

    "Linux 内存管理详细介绍" 本文将详细介绍 Linux 内存管理的概念、机制、重要性和组成部分,旨在帮助读者深入了解 Linux 内存管理的原理和实践。 一、Linux 内存管理概述 Linux 内存管理是指对系统内存的分配、...

    《深入理解LINUX内存管理》学习笔记c.PDF

    《深入理解LINUX内存管理》学习笔记c.PDF

Global site tag (gtag.js) - Google Analytics