问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

linux内核物理内存管理有哪些常用算法 lru slab

发布网友 发布时间:2022-04-21 15:37

我来回答

1个回答

热心网友 时间:2023-06-29 03:08

采用伙伴算法分配内存时,每次至少分配一个页面。但当请求分配的内存大小为几十个字节或几百个字节时应该如何处理?如何在一个页面中分配小的内存区,小内存区的分配所产生的内碎片又如何解决?
Linux2.0采用的解决办法是建立了13个空闲区链表,它们的大小从32字节到132056字节。从Linux2.2开始,MM的开发者采用了一种叫做slab的分配模式,该模式早在1994年就被开发出来,用于Sun Microsystem Solaris 2.4操作系统中。Slab的提出主要是基于以下考虑:
· 内核对内存区的分配取决于所存放数据的类型。例如,当给用户态进程分配页面时,内核调用get_free_page()函数,并用0填充这个页面。 而给内核的数据结构分配页面时,事情没有这么简单,例如,要对数据结构所在的内存进行初始化、在不用时要收回它们所占用的内存。因此,Slab中引入了对象这个概念,所谓对象就是存放一组数据结构的内存区,其方法就是构造或析构函数,构造函数用于初始化数据结构所在的内存区,而析构函数收回相应的内存区。但为了便于理解,你也可以把对象直接看作内核的数据结构。为了避免重复初始化对象,Slab分配模式并不丢弃已分配的对象,而是释放但把它们依然保留在内存中。当以后又要请求分配同一对象时,就可以从内存获取而不用进行初始化,这是在Solaris 中引入Slab的基本思想。
实际上,Linux中对Slab分配模式有所改进,它对内存区的处理并不需要进行初始化或回收。出于效率的考虑,Linux并不调用对象的构造或析构函数,而是把指向这两个函数的指针都置为空。Linux中引入Slab的主要目的是为了减少对伙伴算法的调用次数。
· 实际上,内核经常反复使用某一内存区。例如,只要内核创建一个新的进程,就要为该进程相关的数据结构(task_struct、打开文件对象等)分配内存区。当进程结束时,收回这些内存区。因为进程的创建和撤销非常频繁,因此,Linux的早期版本把大量的时间花费在反复分配或回收这些内存区上。从Linux2.2开始,把那些频繁使用的页面保存在高速缓存中并重新使用。
· 可以根据对内存区的使用频率来对它分类。对于预期频繁使用的内存区,可以创建一组特定大小的专用缓冲区进行处理,以避免内碎片的产生。对于较少使用的内存区,可以创建一组通用缓冲区(如Linux2.0中所使用的2的幂次方)来处理,即使这种处理模式产生碎片,也对整个系统的性能影响不大。
· 硬件高速缓存的使用,又为尽量减少对伙伴算法的调用提供了另一个理由,因为对伙伴算法的每次调用都会“弄脏”硬件高速缓存,因此,这就增加了对内存的平均访问次数。
Slab分配模式把对象分组放进缓冲区(尽管英文中使用了Cache这个词,但实际上指的是内存中的区域,而不是指硬件高速缓存)。因为缓冲区的组织和管理与硬件高速缓存的命中率密切相关,因此,Slab缓冲区并非由各个对象直接构成,而是由一连串的“大块(Slab)”构成,而每个大块中则包含了若干个同种类型的对象,这些对象或已被分配,或空闲,如图6.12所示。一般而言,对象分两种,一种是大对象,一种是小对象。所谓小对象,是指在一个页面中可以容纳下好几个对象的那种。例如,一个inode结构大约占300多个字节,因此,一个页面中可以容纳8个以上的inode结构,因此,inode结构就为小对象。Linux内核中把小于512字节的对象叫做小对象。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
搜索不到蓝牙设备咋办啊?我装了驱动了 安装蓝牙适配器遇到的问题!!! ...是哪位高手请指教!哦还有我忘了王梓木的老婆是哪位? ...V1 U1 W1 请问怎么对应电表接电?(我是外行) oppo ph111买哪个渠道比较好 oppo手机ph111好用吗? 哪种宠物好养?(除猫,狗,兔,鼠,水生物,冷血动物) 养什么宠物好,(不要狗和猫)要不臭的,兔子好养吗?还要小一点。 我的要求... 怎样从中华广场到一得路? 该怎么办呀?宝宝总是抓耳朵? 8086cpu采用哪些方法管理内存 牛肉蒸饺做法 内存管理有哪几种方式 蒸牛肉需要多长时间 今天想做牛肉包,牛肉包蒸多久合适? 空间不足怎么解决 推荐6种管理手机存储空间方法 内存管理可以有多种方式,其中内存利用率最高的是( 牛肉蒸包蒸多长时间熟 操作系统内存管理的方式 包牛肉蒸饺的馅怎么做好吃,谢谢,急盼,牛 为什么我的支付宝里面没有借呗? 常用的内存管理机制有哪几种 牛肉蒸包 蒸牛肉的做法大全 怎样蒸牛肉 支付宝运动步数455步是多少米? 常用的内存管理方法有哪些? 如何蒸牛肉包子 支付宝运动步数靠谱吗? 牛肉蒸饺蒸多久 牛肉蒸包的馅如何调制 牛肉蒸包需要蒸多长时间 牛肉蒸饺的做法步骤图,牛肉蒸饺怎么做好吃 为了解决内存容量不足的问题,在现代操作系统中都引入了虚拟存储器的概念,它得以实现的基础是( )原理。 蒸牛肉要多久才能熟? 牛肉蒸饺多长时间 牛肉蒸饺怎么做好吃 内存管理的基本问题 牛肉蒸饺馅怎么做最好吃窍门 常用的linux操作系统采用怎样的内存管理和调度机制 牛肉芹菜包子蒸多久能熟 为什么说Python采用的是基于值的内存管理模式 蒸牛肉的做法有哪些 malloc函数 牛肉包需要蒸多长时间 内存管理的功能主要体现在哪些方面? 内存管理的内存对象 微信抓包工具可以实现哪些功能 如何通过wireshark2.2.1抓包定位微信 怎么对微信小程序抓包 您好,这个微信怎么抓包对方的ip。