Linux内存管理详解_第1页
Linux内存管理详解_第2页
Linux内存管理详解_第3页
Linux内存管理详解_第4页
Linux内存管理详解_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、虚拟地址即使是现代操作系统中,内存依然是计算机中很宝贵的资源,看 看你电脑几个T固态硬盘,再看看内存大小就知道了。为了充分利用和管理系统内存资源,Linu x采用虚拟内存管理技 术,利用虚拟内存技术让每个进程都有4GB互不干涉的虚拟地址空间。 进程初始化分配和操作的都是基于这个虚拟地址,只有当进程需 要实际访问内存资源的时候才会建立虚拟地址和物理地址的映射,调 入物理内存页。打个不是很恰当的比方,这个原理其实和现在的某某网盘一样。 假如你的网盘空间是1TB,真以为就一口气给了你这么大空间吗?那 还是太年轻,都是在你往里面放东西的时候才给你分配空间,你放多 少就分多少实际空间给你,但你和你朋友看

2、起来就像大家都拥有1 TB 空间一样。虚拟地址的好处o避免用户直接访问物理内存地址,防止一些破坏性操作,保护操作系 统o每个进程都被分配了 4GB的虚拟内存,用户程序可使用比实际物理内 存更大的地址空间用户空间和内核空间i4GB的进程虚拟地址空间被分成两部分:迸程A用户空间3GB进程5用户空间3G0iSSC用户空间3GB匹核空问1GB用户空间内核空间使用的地 核的请物理地址上面章节我们已经知道不管是用户空间还是内核空间, 址都是虚拟地址,当需进程要实际访问内存的时候,会由内 求分页机制产生缺页异常调入物理内存页。把虚拟地址转换成内存的物理地址,这中间涉及利用MMU内存管 理单元(Memory

3、M an age ment U ni t ) 对虚拟地址分段和分页(段 页式)地址转换,关于分段和分页的具体流程,这里不再赘述,可以 参考任何一本计算机组成原理教材描述。flY段页式内存管理地址转换 Li nu x 内核会将物理内存分为3个管理区,分别是:ZONE_DMADMA 内存区域。包含0M&1 6MB之间的内 存页框,可 以由老式 基于I SA的设备通过DMA使用,直接映射到内核的地址空间。 ZONE_NORMAL普通内存区域。包含16MB896MB之间的内存页框,常规页框,直接 映射到内核的地址空间。ZONE_HI GHMEM高端内存区域。包含896 MB以上的内存 页框,不进行直接

4、映射,可以 通过永久映射和临时映射进行这部分内存页框的访问。ZONE_HIGHMEM ,假设内喜黄小为4G880M-4G20NE_N0RMAL&0MZONE_DHA -4物理内存区划分用户空间用户进程能访问的是用户空间,每个进程都有自己独立的用 户空间,虚拟 地址范围从从 0x00000000至OxBFFFFFFF总容量 3G。用户进程通常只能访问用户空间的虚拟地址,只有在执行内陷操 作或系统调用时才能访问内核空间。进程与内存进程(执行的程序)占用的用户空间按照访问属性一致的地址 空间存放在一起的原则,划分成5个不同的内存区域。访问属性指 _的是“可读、可写、可执行等。o代码段代码段是用来存放

5、可执行文件的操作指令,可执行程序在内存中 的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作, 它是不可写的。o数据段数据段用来存放可执行文件中已初始化全局变量,换句话说就是 存放程序静态分配的变量和全局变量。厂BSS段BSS段包含了程序中未 初始化的全局变量,在内存中bss段全部 置零。o 堆 hea P 堆是用于存放进程运行中被动态分配的内存段,它的大小并不固 定,可动态扩张或缩减。当进 程调用mall oc等函数分配内存时,新 分配的内存就被动态添加到堆上(堆被扩张);当利用fr ee等函数释 放内存时,被释放的内存从堆中被剔除(堆被缩减)。o 栈 sta ck栈是用户存放程序

6、临时创建的局部变量,也就是函数中定义的变 量(但不包括st at ic声明的变量,sta ti c意味着在数据段中存放变 量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进 程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由 于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这 个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。 上述几种内存区域中数据段、BSS段、堆通常是被连续存储在内存中, 在位置上是连续的,而代码段和栈往往会被独立存放。堆和栈两个区 域在i3 86体系结构中栈向下扩展、堆向上扩展,相对而生。桟 stack堆 HeapBSS你也可以

7、在l in ux下用si ze命令查看编译后程序的各个内存区 域大小:lem on -# size /usr/local/sb in /sshdtext data bss dec hex file name1924532 12412 426896 2363840 2411c0 /usr/local/sbi n/sshd 内核空间在x86 3 2位系统里,Lin ux内核地址空间是指虚拟地址从OxCOOOOOOO开始至U OxFFFFFFFF为止 的高 端内存 地址 空间,总计1G 的容量,包括了内核镜像、物理页面表、驱动程序等运行在内核空间。4KB固走戌存映时区4MDh永久内存浜射区4MD总计

8、T 线性地址映身 以上28M的 时到物理地址 旳高垛内存&KB安全保护区域0IMB1r内核空间细分区域.直接映射区直接映射区 Di re ct Memory Reg ion :从内核空间起始地址开始, 最大896M的内核空间地址区间,为直接内存映射区。直接映射区的896MB的线性地址直接与物理地址的前 896MB进行映射,也就是说线性地址和分配的物理地址都是连续的。 内核地址空间的线性地址Ox C000 0001所对应的物理地址为0x00 0000 01,它们之间相差一个偏移量 PAGE_OFFSET =OxCOOOOO 00该区域的线性地址和物理地址存在线性转换关系线性 地址=PAGE_OF

9、FSET+物理地 址也可以 用vi rt _t o_phys()函数 将 内核虚拟空间中的线性地址转化为物理地址。高端内存线性地址空间内核空间线性 地址 从896 M到1G的区间,容量1 28 MB的地址 区间是高端内存线性地址空间,为什么叫高端内存线性地址空间?下 面给你解释一下:前面已经说过,内核空间的总大小1 GB,从内核空间起始地址开 始的8 96 MB的线性地址可以直接映射到物理地址大小为896 MB的 地址区间。所以,内核空间拿出了最后的128M地址区间,划分成下面三个 高端内存映射区,以达到对整个物理地址范围的寻址。而在64位的 系统上就不存在这样的问题了,因为可用的线性地址空间

10、远大于可安 装的内存。动态内存映射区vmal lo c Reg ion 该区域由内核函数v mal loc 来分配,特点是: 线性空间连续,但是对应的物理地址空间不一定连续。vmal lo c 分 配的线性地址所对应的物理页可能处于低端内存,也可能处于高端内 存。永久内存映射区Pers is te nt K er nel Mappin g Regi on 该区域可访问高端内 存。访问方法 是使用all oc_p age (_ GFP_HIG HMEM)分配高端内存页 或者使用kmap函数将分配到的高端内存映射到该区域。固定映射区Fi xi ng k er nel Mappin g Regi o

11、n 该区域 和 4G 的顶端只有 4k 的隔离带,其每个地址项都服务于特定的用途,女口 ACPI _BASE等。dKB匡走応存映更国4r/&东汎円再映尉邑4MB星L计8M宪歧性戢赴勒i里昨0窑W以上E:)有歸内存ZOMt NORMAL-seoM安主保护舉ESM&ZOMt_DMA IU. 0 .一 g1GM曲舸JT丘小葩(5切内棣空lE内核空间物理内存映射先别着急进入下一节,在这之前我们再来回顾 如果认真看完上面的章节,我这里再画了一张上面讲的有点多, 一下上面所讲的内容。 图,现在你的脑海中应该有这样一个内存管理的全局图。3云古与ifJGM it.I.a1024 11024片 4 尸 4 护斗

12、*1024伙伴系统,减少了外部碎片产生。申请4个页框,但是长度为4个连续页框块链表没 伙伴系统会从连续8个页框块的链表获取一个,并 个,另外一个放入连续4因为任何正整数都可以由2八n的和组成,所以总能找到合适大小 的内存块分配出去 分配实例比如:我需要 有空闲的页框块, 将其拆分为两个连续4个页框块,取其中 个页框块的空闲链表中。释放的时候会检查,释放的这几个页框前后 的页框是否空闲,能否组成下一级长度的块。命令查看lem on # cat /p roc/buddy infoNode 0, zone DMA 1 0 0 0 2 1 1 0 1 1 3Node 0, zone DMA32 319

13、8 4108 4940 4773 4030 2184 891 180 67 32 330Node 0, zone Normal 42438 37404 16035 4386 610 121 22 30 0 1 slab分配器看到这里你可能会想,有了伙伴系统这下总可以管理好物理内存 了吧?不,还不够,否则就没有sla b分配器什么事了。那什么是sl ab分配器呢?一般来说,内核对象的生命周期是这样的:分配内存-初始化-释 放内存,内核中有大量的小对象,比如文件描述结构对象、任务描述 结构对象,如果按照伙伴系统按页分配和释放内存,对小对象频繁的 执行分配内存-初始化-释放内存会非常消耗性能。伙伴系

14、统分配出去的内存还是以页框为单位,而对于内核的很多 场景都是分配小片内存,远用不到一页内存 大小的空间。slab 分配器, 通过将内存按使用对象不同再划分成不同大小的空间,应用于内 核对象的缓存。伙伴系统和slab不是二选一的关系,slab 内存分配器是对伙 伴分配算法的补充。原理对于每个内核中的相同类型的对象,如ta sk_ st ru ct、已经初始化的对象,每当要申请这种 sl ab列表中分配一个出去;而当要释放 ,而不是直接返回给伙伴系统,从而避 了内存分配性能。file_str uct等需要重复使用的小型内核数据对象,都会有个sl ab 缓存池,缓存住大量常用的 类型的对象时,就从缓

15、存池的 时,将其重新保存在该列表中 免内部碎片,同时也大大提高 主要优点o sl ab内存管理基于内核小对象,不用每次都分配一页内存,充分利用 内存空间,避免内部碎片。o sl ab对内核中频繁创 建和释放的小对象做缓存,重复利用一些相同的 _对象,减少内存分配次数。数据结构Zcache_criainkmpm cacheBtabft fullslabpageobjectkmm cacheslabs_partja1slabG亘IGobjectkmem cachefilab&_empty JslabpageVobjectV(完全分配的sl ab链表)l (部分分配的sla b链表)(没有被分配对象

16、的sl ab链表)中有个重要的结构体kmemJi st 3包含了以上三个数据slab分配器kmem cache 是一个 each e ch a in 的 链表 组成节 点,代表 的是 个内核中的相同类型的对象高速缓存,每个kmem_ca ch e通常是 一段连续的内存块,包含了三种类型的sl abs链表:sl ab s_fu llsl ab s_pa rt ia sl ab s_empt y k mem_c ac he 结构的声明。-h I i t. .:. Ur: Hl Jd . UbL p; rL Ldi ;: *. hr l i I; I ;- 2冷址-_ ee; ,-urriqned

17、Lang free_otjjectsj ,“ unsigned ini free.Iinit:un&lgnetf knt 分餐旨後人sianajullslabs_parial11皇打ir;求苗Clslab分配图解命令查看上面说的都是理论, 你可以通过cat / proc/比较抽象,动动手来看看系统中的s l ab吧! sl ab in fo命令,实际查 看系 统中sl ab信息。SMrVt k*LL M If Ufl*Ml戶.迓屯-耳直勰SP砂 -wbjprt tji-”暉?轴画 I.fi i74 IJ -IdMC rch_lirf 4EPf;fi3-iiQ AM 6*4 -urvl 2!氏_

18、叩tC0审 Fii削-yU护旺云包t 肚伙密5 L IM T|iiriidiciTr tujCmq Junntt: UrvCJr;HuU_L*frirTv叮皿5 lx riril_th hME 严“弼厂血注踊盯JO*124ua121ra-Ijfi 屈r/ ., EnH 1 H;二 TiAMb ;i n JUtlHir4 : tUdblffBi :;TUM阳耳 i : idMffllK.! LilMt* : TJtml1 ImkKJ = SAtls J tJWtMtar-LlUEz-j mgq. 11占 fl i : t1皿出; t .; iUftdiri 甲 H卄IN a vlMdij h :

19、和曲恒 D llAblA h Hiii a tlALab m申门m fhblJivB 和曲皿p my$ U HtU4llfli rvG.slabi nfo 查询 已ab t op实时显示内内存缓存信息。% used) Active y Total Slmbs (% usd) Active 7 Total Caches (先 used) Active J Total 5ize 代 jsed) Minimum / Average Z Maximm Object(99.31_ 噢幻送一咚 V SIZE SLABS OBJ/SLAB CACHE SIZE NAMEslabtop 查询 si ab高速缓

20、存的分类 sl ab高速缓存分为两大类,通用高速缓存 通用高速缓存si ab分配器中用kmem_cache来描述高速 需要s la b分配器对其进行高速缓存。cach e 速缓存描述符的高速缓存,是一种通用高速缓存,保存在 cach e_ch ai n 链表 中的第一个 元素。另2卜,sla b分配器所提供的小块连续内存的分配,也是通用高 速缓存实现的。通用高速缓存所提供的对象具有几何分布的大小,范 围为32到131 072字节。内 核中提供了 kmall oc ()和kfr ee()两个 接口分别进行内存的申请和释放。专用咼速缓存内核为专用高速缓存的申请和释放提供了一套完整的接口,根据 所传

21、入的参数为指定的对象分配sla b缓存。专用高速缓存的申请和释放k mem_c ac he _c re ate ()用于对一个指定 的对象创建高速缓存。 它从c ac he_c ac he普通高速缓 存中为新的专有缓存分配一个高速缓 存描述符,并把这个描述符插入到高速缓存描述符形成的 cach e_ch ai n 链表中 。kmem_c ac he_de sto ry () 用 于撤 消和 从 cach e_ch ai n链表上 删除高速缓 存。sl ab的申请和释放sl ab数据结构在内核中的定义,如下:9TSfc97 9S% rmS.IGK 64590G-20KO.04KQ.93KL959

22、7195& 5692r re1392Q102342595&GK buffMjiad783BaK. dent ry782 4K e xt4_ext en t_s t a tu s 1&2144K ext4 inpde cqche和专用高速缓存。缓存的结构,它本身也_ ca ch e保存着对高unsigned long coiauroff; vod *s_en;unsigned tdt vnus电; kmpm一bufctl一t freej unsigned short nodeid;Slab结构体内核代码kmem_c ac he_a ll oc()在其参 数所 指定的 高速缓 存中分配一个 sl

23、ab,对应的 kmem_cac he_f re e() 在其参数所 指定 的高 速缓存中 释放一个sl ab。虚拟内存分配前面讨论的都是对物理内存的管理,Linu x通过虚拟内存管理, 欺骗了用户程序假装每个程序都有4G的虚拟内存寻址空间(如果这 里不懂我说啥,建议回头看下 别再说你不懂Linux内存管理了,10 张图给你安排的明明白白!)。所以我们来研究下虚拟内存的分配,这里包括用户空间虚拟内存 和内核空间虚拟内存。注意,分配的虚拟内存还没有映射到物理内存,只有当访问申请 的虚拟内存时,才会发生缺页异常,再通过上面介绍的伙伴系统和 sl ab分配器申请物理内存。用户空间内存分配mal l o

24、cmall oc用于申请 用户 空间的 虚拟 内存,当申请小 于128KB小内 存 的时,mall oc使用sbr k或br k分配内 存;当 申请大于128KB的内 存时,使用mmap函数申请内存;存在问题由于br k/ sb rk /m map属于系统调用,如果每次申请内存都要产生 系统调用开销,cpu在用户态和内核态之间频繁切换,非常影响性能。 而且,堆是从低地址往高地址增长,如果低地址的内存没有被释放, 高地址的内存就不能被回收,容易产生内存碎片。解决因此,mal lo c采用的是内存池的实现方式,先申请一大块内存, 然后将内存分成不同大小的内存块,然后用户申请内存时,直接从内 存池中

25、选择一块相近的内存块分配出去。f、用户空问逬程mmdpindllocbih sbrk*vm area structvrteiIIqc 进屋页我夢仪徉舷鶴理内荐 空用页框内核空间内存分配在讲内核空间内存分配之前,先来回顾一下内核地址空间。vmal loc分别用于分配不同映射区的虚拟内存,看这张上kmal Io c 和次画的图:4KBHl走氏存映死区4MD永久内存映射区4 MB&KB安全保护区域8IMB直绥映鸵区 最小吕总计吕忖的线性地址映射到物理tffititS95MUi的高垛内存jr内核空间细分区域kmal I ockmal Io区。按字节为单位虚拟内存,一般用于分配小块内存,释放内存对应 于kfr ee,可以分配连 续的物理内存。函数 原型在中声明,一般情况下在驱动程序中都是调用 kmal Io c()来给数据结构分配内存。c()分配的虚拟地址范围在内核空间的直接内存映射还记得刖 面说 的sla b吗? kmall oc命令,c-1同样可以用cat / pr oc/ sl 下面的k mal lo oc咼速缓存。对象信息, 配 的 k mallabin c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论