linux 内存管理ppt,《Linux内存管理》PPT课件

62e50291a81fc54b507f33cb80033297.gif 《Linux内存管理》PPT课件

(26页)

3516854e89def20961af38655a14593a.gif

本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!

14.90 积分

Linux内存管理 Linux内存管理Linux内核的设计并没有全部采用Intel所提供的段机制,仅仅是有限度地使用了分段 机制。这不仅简化了Linux内核的设计,而且为把Linux移植到其他平台创造了条件,因为很多RISC处理器并不支持段机制。 Linux内存管理 所有段的基地址均为0由此可以得出,每个段的逻辑地址空间范围为0-4GB。因为每个段的基地址为0,因此,逻辑地址到线性地址映射保持不变,在Linux中所提到的逻辑地址和线性地址(或虚拟地址)指的也就是同一地址。看来,Linux巧妙地把段机制给绕过去了,而完全利用了分页机制。 Linux页式管理前面介绍了i386的二级页管理架构,不过有些CPU(Alpha 64位)使用三级,甚至四级架构,Linux 2.6.29内核为每种CPU提供统一的界面,采用了四级页管理架构,来兼容二级、三级、四级管理架构的CPU。Linux页式管理 Linux页式管理这四级分别为:1.页全局目录(Page Global Directory):即 pgd,是多级页表的抽象最高层。2.页上级目录(Page Upper Directory):即 pud。3.页中间目录(Page Middle Directory):即 pmd,是页表的中间层。4.页表(Page Table Entry):即pte。 虚拟内存Linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的进程地址空间,该空间是大小为3G,用户看到和接触的都是虚拟地址,无法看到实际的物理地址。利用这种虚拟地址不但能起到保护操作系统的作用,而且更重要的是用户程序可使用比实际物理内存更大的地址空间。 虚拟内存Linux将4G的虚拟地址空间划分为两个部 分——用户空间与内核空间。用户空间从 0到0xbfffffff,内核空间从3G到4G。用 户进程通常情况下只能访问用户空间的虚 拟地址,不能访问内核空间。例外情况是 用户进程通过系统调用访问内核空间。 用户进程地址空间(3G)[root@localhost root]# size hello //显示文件结构 可执行程序存储结构(1).text存放 CPU 执行的机器指令,代码区通常是只读的,防止程序意外地修 改了它的指令。 (2).data该区包含被初始化的全局变量、静态变量.它们是在编译阶段被编译器 存放在可执行目标文件的.data段中的.(3).BSS 未被初始化的全局变量和静态局部变量,编译的时候并未被分配空 间,仅仅在.bss段中标记它们,当程序运行的时候才为它们在内 存中分配空间,并把它们初始化为零或空指针(NULL)。 (4).rodata该区包含常量数据(如字符串常量)在编译阶段被编译器存放在可执 行目标文件的.rodata段中的。 编译后可执行代码例:查看编译后可执行代码中几个基本段#gcc -c neicunguanli.c -o neicunguanli #objdump –h neicunguanli 程序运行时内存结构 (1)代码区(text) 代码区指令根据程序设计流程依次执行,对于顺序指令, 则只会执行一次(每个进程),如果反复,则需要使用跳 转指令,如果进行递归,则需要借助栈来实现。 (2)全局初始化数据区/静态数据区(data): 只初始化一次 (3)未初始化数据区(BSS):在运行时改变其值。 (4)栈区(stack):由编译器自动分配释放,存放函数的参 数值、局部变量的值等。 (5)堆区(heap):用于动态内存分配。一般由程序员分配 和释放,若程序员不释放,程序结束时有可能由 OS 回收。 程序执行时的内存分配情况 int a = 0; //a 在全局已初始化数据区 char *p1; //p1 在 BSS 区(未初始化全局变量) main() { int b; //b 在栈区 char s[] = "abc"; //s 为数组变量,存储在栈区, //“abc”为字符串常量,存储在已初始化数据区 char *p1,p2; //p1、p2 在栈区 char *p3 = "123456"; //123456\0 data数据区,p3 在栈区 .static int c =0; //c为局部静态数据,data数据区 p1 = (char *)malloc(10); //分配得来的 10 个字节的区域在堆区 p2 = (char *)malloc(20); //分配得来的 20 个字节的区域在堆区 free(p1); free(p2); } 栈和堆的区别 (1)管理方式不同 栈编译器自动管理,无需程序员手工控制;而 堆空间的申请释放工作由程序员控制,容易产 生内存泄漏。(2)空间大小不同。 栈是向低地址扩展的数据结构,是一块连续的 内存区域。因此,用户从栈获得的空间较小。 堆是向高地址扩展的数据结构,是不连续的内 存区域。堆获得的空间较灵活,也较大。 内存分配方式 (1) 静态分配: 编译器在处理程序源代码时分配,静态对象是 有名字的变量,可以直接对其进行操作,静态 对象的分配与释放由编译器自动处理。(2) 动态分配: 程序在执行时调用 malloc 库函数申请分配,动 态对象需要通过指针间接地进行操作,分配与 释放必须由程序员显式地管理。 高速缓存1)缓冲区高速缓存 缓冲区高速缓存中包含了被块设备驱动使用的数据 缓冲,这些缓冲的单元的大小一般固定(比如512 字 节),包含从块设备读出或者写入的信息块。块设备 是仅能够以固定大小块进行读写操作的设备。所有的 硬盘都是块设备。利用设备标志符和所需块号作索引 可以在缓冲区高速缓存中迅速地找到数据块。块设备 只能够通过缓冲区高速缓存来存取。如果数据在缓冲 区缓存中可以找到,则无需从物理块设备(如硬盘)中 读取,这样可以加速设备的访问。 高速缓存2)页高速缓存 页高速缓存用来加速块设备上可执行映象 文件与数据文件的存取。它每次缓冲一个页 面的文件内容。页面从块设备上读入内存后 缓存在页高速缓存中。3)交换高速缓存 只有修改过的页面存储在交换文件中。只要 这些页面在写入到交换文件后没有被修改则 下次此页面被交换出内存时就不必再进行更 新写操作 高速缓存4)硬件高速缓存 一个常见的硬件高速缓存是处理器中的指 令和数据cache,它们缓存CPU最近访 问过的指令和数据,使CPU不需要到内 存中获取数据。实际上它是CPU与内存 之间的桥梁。 伙伴算法Linux通过伙伴算法管理和分配页,Linux使用了3个Zone, 每个Zone由一个自己的伙伴系统来管理: l ZONE_DMA 包含可以用来执行DMA操 作的内存 l ZONE_NORMAL 包含可以正常映射到 虚拟地址的内存区域 l ZONE_HIGHMEM 永久映射到内核地 址空间的内存区域 伙伴算法原理 Linux的伙伴算法把所有的空闲页面分为10个 块组,每组中块的大小是2的幂次方个页面,例 如,第0组中块的大小都为20 (1个页面),第 1组中块的大小为都为21(2个页面),第9组 中块的大小都为29(512个页面)。也就是说, 每一组中块的大小是相同的,且这同样大小的 块形成一个链表。 伙伴算法分配过程 假设要求分配的块其大小为128个页面,该算法先在块大小为128个页面的链表中查找,看是否有这样一个空闲块。如果有,就直接分配;如果没有,该算法会查找下一个更大的块,在块大小为256个页面的链表中查找一个空闲块。如果存在这样的空闲块,内核就把这256个页面分为两等份,一份分配出去,另一份插入到块大小为128个页面的链表中。如果在块大小为256个页面的链表中也没有找到空闲页块,就继续找更大的块,即512个页面的块。如果存在这样的块,内核就从512个页面的块中分出128个页面满足请求,然后从384个页面中取出256个页面插入到块大小为256个页面的链表中。然后把剩余的128个页面插入到块大小为128个页面的链表中。 伙伴算法释放过程满足以下条件的两个块称为伙伴:Ø 两个块的大小相同Ø 两个块的物理地址连续伙伴算法把满足以上条件的两个空块合并为一个块,如果合并后的块还可以跟相邻的块进行合并,那么该算法就继续合并。 Slab分配器linux采用了slab来管理小块内存的分配与 释放 Slab分配器Slab将缓存分为两种:Ø 专用高速缓存:用来存放内核使用的数据结构,例如: mm,skb,vm等等Ø 普通高速缓存:存放一般的数据,比如内核为指针分配 一段内存注:Ø 所有的高速缓存区都通过链表的方式组织在一起,它的 首结点是cache_chainØ 普通高速缓存将分配区分为 32*(2^0),32*(2^1),32*(2^2) ….32*(2^12)大小,共13个 区域大小 Slab分配器每个高速缓存都包含了一个 slabs 列表,这是一 段连续的内存块(通常都是页面)。存在 3 种 slab:Ø slabs_full 完全分配的 slab Ø slabs_partial 部分分配的 slab Ø slabs_empty 空 slab,或者没有对象被分配 Slab分配器 slab 列表中的每个 slab 都是一个连续 的内存块(一个或多个连续页),它们被 划分成一个个对象。这些对象是从特定缓 存中进行分配和释放的基本元素。注意: slab 是 slab 分配器进行操作的最 小分配单位 Linux内存管理 Linux内存管理Linux内核的设计并没有全部采用Intel所提供的段机制,仅仅是有限度地使用了分段 机制。这不仅简化了Linux内核的设计,而且为把Linux移植到其他平台创造了条件,因为很多RISC处理器并不支持段机制。 Linux内存管理 所有段的基地址均为0由此可以得出,每个段的逻辑地址空间范围为0-4GB。因为每个段的基地址为0,因此,逻辑地址到线性地址映射保持不变,在Linux 关 键 词: 《Linux内存管理》PPT课件 ppt、pptx格式 免费阅读 下载 天天文库

524d6daf746efaa52c3c71bbfe7ba172.gif  天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值