Linux内存管理之全局框架
反碎片机制其实还在伙伴系统之前,它主要是将各个zone区域的物理内存分成可回收reclaimable但不可移动unmovable,可移动movable,不可移动unmovable. 这些标记按照一定得list串联起来管理,当外部条件申请物理内存导致许多碎片的时候,它可以按照这些数据结构的标志,来从新组织归类物理内存,从而减少碎片页或者孤独页。反碎片技术在嵌入式系统当中少用,绝大部分由伙伴系统占据江山了,因此不会对此做具体分析,简略过之。 四. Slab分配机制。 众所周知,操作系统使用伙伴系统管理内存,不仅会造成大量的内存碎片,同时处理效率也较低下。SLAB是一种内存管理机制,其拥有较高的处理效率,同时也有效的避免内存碎片的产生,其核心思想是预分配。其按照SIZE对内存进行分类管理的,当申请一块大小为SIZE的内存时,分配器就从SIZE集合中分配一个内存块(BLOCK)出去,当释放一个大小为SIZE的内存时,则将该内存块放回到原有集合,而不是释放给操作系统。当又要申请相同大小的内存时,可以复用之前被回收的内存块(BLOCK),从而避免了内存碎片的产生。[注:因SLAB处理过程的细节较多,在此只是做一个原理上的讲解 1. 总体结构 图1 SLAB内存结构 2.处理流程 如图1中所示:SLAB管理机制将内存大体上分为SLAB头、SLOT数组、PAGES数组、可分配空间、被浪费空间等模块进行分别管理,其中各模块的功能和作用: SLAB头:包含SLAB管理的汇总信息,如最小分配单元(min_size)、最小分配单元对应的位移(min_shift)、页数组地址(pages)、空闲页链表(free)、可分配空间的起始地址(start)、内存块结束地址(end)等等信息(如代码1所示),在内存的管理过程中,内存的分配、回收、定位等等操作都依赖于这些数据。 SLOT数组:SLOT数组各成员分别负责固定大小的内存块(BLOCK)的分配和回收。在nginx中SLOT[0]~SLOT[7]分别负责区间在[1~8]、[9~16]、[17~32]、[33~64]、[65~128]、[129~256]、[257~512]、[513~1024]字节大小内存的分配,但为方便内存块(BLOCK)的分配和回收,每个内存块(BLOCK)的大小为各区间的上限(8、16、32、64、128、256、512、1024)。比如说:假如应用进程请求申请5个字节的空间,因5处在[1~8]的区间内,因此由SLOT[0]负责该内存的分配,但区间[1~8]的上限为8,因此即使申请5个字节,却依然分配8字节给应用进程。以此类推:假如申请12字节,12处于区间[9~16]之间,取上限16,因此由SLOT[1]分配16个字节给应用进程;假如申请50字节,50处于区间[33~64]之间,取上限64,因此由SLOT[2]分配64个字节给应用进程;假如申请84字节,84处于区间[65~128]之间,取上限128,因此由SLOT[3]分配128个字节;...;假如申请722字节,722处于区间[513~1024]之间,取上限1024,因此由SLOT[7]分配1024字节。 PAGES数组:PAGES数组各成员分别负责可分配空间中各页的查询、分配和回收,其处理流程可参考3.2节的说明。 可分配空间:SLAB在逻辑上将可分配空间划分成M个内存页,每页大小为4K。每页内存与PAGES数组成员一一对应,由PAGES数组各成员负责各内存页的分配和回收。 被浪费空间:按照每页4K的大小对空间进行划分时,满足4K的空间,将作为可分配空间被PAGES数组进行管理,而最后剩余的不足4K的内存将会被舍弃,也就是被浪费了! 【编辑推荐】
点赞 0 (编辑:南京站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- remote-desktop – 为什么不显示RemoteApp图标
- windows-server-2008 – 无法连接到我的FTP服务器,为什么?
- 如何阻止程序在Windows 10中连接到Internet
- windows-server-2008 – 在Windows Server 2008中安装服务
- 用户没有收到Win10正式版推送的解决方法
- 最后的Windows XP,也将在4月9日退役
- windows – shadow / V实际上做了什么?
- Linux常用命令:简单易学,但能解决95%以上的问题!
- Windows Lite 对微软来说意味着什么?
- win10系统下如何打开internet ISS 信息服务