网站大量收购独家精品文档,联系QQ:2885784924

Linux内存管理子系统.ppt

  1. 1、本文档共70页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux内存管理子系统

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 库函数申请分配,动态对象需要通过指针间接地进行操作,分配与释放必须由程序员显式地管理。 进程空间 用户空间对应进程,所以每当进程切换,用户空间就会跟着变化。 进程空间 每个进程的用户空间都是完全独立、互不相干的。把同一个程序同时运行10次(为了能同时运行,让它们在返回前睡眠100秒),会看到10个进程使用的线性地址一模一样。 (cat/proc/pid/m

文档评论(0)

feixiang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档