欢迎来到天天文库
浏览记录
ID:49527078
大小:367.50 KB
页数:23页
时间:2020-03-02
《内存管理(堆、栈).doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、内存管理(堆、栈)Linux内存管理摘要:木章首先以应川程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核小讨论系统物理内存管理和内核内存地使用方法。力求从外自内、水到渠成地引导网友分析Linux地内存管理与使用。在木章最后我们给出一个内存映射地实例,帮助网友们理解内核内存管理与用户内存管理之间地关系,希望人家最终能驾驭Linux内存管理。刖H内存管理一向是所有操作系统书籍不惜笔墨重点讨论的内容,无论市面上或是网上都充斥着大景涉及内存管理的教材和资料。因此我们这里所要写的Linux内存管理采取必重就轻的策略,
2、从理论层血就不去板门弄斧,贻笑人方了。我们最想做的和可能做到的是以开发者的角度谈谈对内存管理的理解,最终日的是把我们在内核开发屮使用内存的经验和对Linux内存管理的认识与人家共享。当然这其小我们也会设计一些诸如段页等内存管理的基本理论,但我们口的不是为了强调理论,而是为了指导理解开发中的实践,所以仅仅点到为止,不做深究。遵循“理论來源于实践”的“教条”,我们先不必一下子就钻入内核里去看系统内存到底是如何管理,那样往往会让你陷入似懂非懂的窘境(我当年就犯了这个错谋!)o所以最好的方式是先从外部(用户编程范畴)來观察进程如何使用内
3、存,等到对人家内存使用有了较直观的认识后,再深入到内核屮去学习内存如何被管理等理论知识。最后再通过一个实例编程将所讲内容融会贯通。进程与内存进程如何使用内存?毫无疑问所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自川户输入的数据等等。不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内存是事先静态分配和统一•冋收的,而有些却是按需要动态分配和冋收的。对任何一个普通进程來讲,它都会涉及到5种不同的数据段。稍佇编程知识的朋友都该能想到这儿个数据段种包含有“程序代码段”、“稈序数
4、据段”、“程序堆栈段”等。不错,这几种数据段都在其屮,但除了以上几种数据段之外,进程还另外包含两种数据段。下血我们來简单归纳一下进程对应的内存空间小所包含的5种不同的数据区。代码段:代码段是用來存放可执行文件的操作指令,也就是说是它是可执行程序在内存种的镜像。代码段需要防止在运行时被菲法修改,所以只准许读取操作,而不允许写入(修改)操作——它是不可写的。数据段:数据段川來存放可执行文件屮已初始化全局变量,换句话说就是存放程序静态分配1[1]的变量和全局变量。BSS段2[2]:BSS段包含了程序中未初始化全局变量,在内存屮bss段
5、全部置零。堆(heap):堆是用于存放进程运行屮被动态分恻的内存段,它人小并不固定,可动态扩张或缩减。当进程调用nialloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)栈:栈是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”小定义的变量(但不包括static声明的变量,static意味这在数据段中存放变量)。除此以外在函数被调用时,其参数也会被压入发起调用的进稈栈中,并且待到调用结束后,函数的返冋值也冋被存放冋栈屮。由于栈的先进先
6、出特点,所以栈特别方便用來保存/恢复调用现场。从这个意义上将我们可以把堆栈看成一个临时数据寄存、交换的内存区。进程如何组织这些区域?上述几种内存区域小数据段、BSS和堆通常是被连续存储的一—内存位置上是连续的,而代码段和栈往往会被独立存放。有趣的是堆和栈两个区域关系很“暧昧”,他们一个向下“长”(i386体系结构屮栈向下、堆向上),一个向上“长”,相对而生。但你不必担心他们会碰头,因为他们之间间隔很人(到底人到多少,你可以从下面的例子程序计算一下),绝少有机会能碰到一•起。下图简要描述了进程内存区域的分布:1[1]静态分配内存就
7、是编译器在编译程序的时候根据源程序来分配内存.动态分配内存就是在程序编译之后,运行时调川运行时刻库函数来分配内存的.静态分配由于是在程序运行Z前,所以速度快,效率高,但是局限性人.动态分配在程序运行时执行,所以速度慢,但灵活性高.2[2]术语"BSS"已经有些年头了,它是blockstartedbysymbol的缩写。因为未初始化的变量没有对应的值,所以并不需要存储在可执行对象屮。但是因为C标准强制规定未初始化的全局变量要被赋了特殊的默认值(基木上是0值),所以内核要从可执行代码装入变量(未赋值的)到内存川,然后将零页映射到该片
8、内存上,于是这些未初始化变量就被赋予了0值。这样做避免了在H标文件中进行显式地初始化,减少空间浪费(來自《Linux内核开发》)代码段User-LevelMemoryManagement》)來展示上血所讲的各种内存区的差别与位置。AZV堆BSS数据段#incl
此文档下载收益归作者所有