00:00
好的,那首先啊,欢迎各位朋友来到铃声教育,我是威克。接下来我们主要是学习这个Linux内核里面的一个伙伴系统架构。那么通过第一张图我们知道啊,Linux内核的研究,它是一个非常庞大的体系。那么今天晚上呢,我们主要是研究的是什么,内核空间这一块里面的一个什么内存管理对不对。那么在讲内存管理之前,我们首先要搞清楚啊,什么问题呢?就相当于我们在设计的这个啊,Linux内核内存管理架构的时候,就是相当于什么,就相当于在什么,你在这个Linux内核啊,哎,在Linux内核干什么呢?内核初始化完成之后,对不对。完成之后,你下一步的一个什么呢?内存管理的工作的一个什呢?责任,它就是由什么呢?就是由我们这个伙伴啊系统。
01:00
直接来什么呢?来承担啊。这点要搞清楚。但是我们知道。伙伴系统它是基于一种什么,相对简单啊。一种强大的一种算法,对不对,这种算法用的比较久了啊,用了很久了,是不是,所以说。它结合了什么呢?它主要啊,结合这个内存的一个什么呀,结合内存啊。结合这个内存分配器的什么两大,两大关键的一个特征。哪两大关键特点呢?第一大就是速度快是不是,第二大呢,它效率高是不是啊。主要是从这两个方面啊进行进一步的分析,那么各位朋友啊,如果大家啊,在学习过程当中啊,在学这个伙伴系统的结构当中是吧,有哪些搞不清楚内核相关的,大家呢,直接找谁呢?找秋香老师来领取我们今天晚上给他准备好的这个相关资料啊。
02:02
啊,一个是内存管理相关的,对不对,另外一个是网络协议站的啊。还有这个相关的参考这个学习书籍PDF文档啊,以及时分大场的面试题。那么针对这个问题的话呢,那现在我们就来看。伙伴系统它的结构是怎么回事啊,大家要搞清楚,它是这样的,就是说。系统啊,系统内存当中的这个什么,每一个物理液啊。就是每一个这个什么呢?每一个物理内存页,我们把它叫做什么呢?叫做这个液针是不是。啊,它都有什么呢?都对应啊,都对应一个什么呢?专门叫做这个structure,有一个什么呢?配这个对应的实例。但是你每一个内存,每一个内存域,它都会什么呢?都会直接关联啊,都会直接关联。关联什么呢?关联一个叫做structure啊,后面有个什么Z这个什么实例,所以说这里他就提了一个问题啊,其实它其中呢,它就保存了什么呢?保存用于管理什么呢?管理这个伙伴呢。
03:14
这个什么呢?伙伴数据的一个主要啊,数组就在这里面了。那么具体它在哪个地方呢?我们大家啊来分析一下是不是,嗯,我们来看一下啊,大家不要着急是吧。那么在哪里呢?我们打开这个内核源码分析里面是吧。就出来了,三。好在这里面我们找到什么,找到这个。MMz.H。打开啊。
04:00
好,直接到这边来是吧。你看啊。CTRL键加F。那么它有一个什么呢?有一个叫做structure啊Z这么一个数据结构。那你双击就可能看没有。啊,双击看到没有。那么在这个地方啊,我们注意了。在这个数据结构里面。他专门有一个。存储较fist。等一下啊。叫做康。有一个叫做F_A。
05:00
那就这么一个结构。就这个。看到没有?这个它是在哪里啊,在我们这个Z的这个结构体里面套用的,看到没有。啊,我们来分析啊。我把它啊。黄哪吒来。它下面就有这么一个成岩,看到有一个书组是吧。哪个书组呢?刚刚我们讲的是这个list。啊。就这个。看到没,就这个地方是不是这个地方是什么呢?就是不同长度的一个什么空闲区域,要搞清楚啊。
06:04
啊,不同。不同长度的一个什么空闲区域是吧。啊,去干这个事情,但是我们知道这个FA是吧,它是一个什么东西呢。要注意啊。它是一个辅助的一个数据结构,要搞清楚是不是。嗯,它是个辅助数结构。哎,这个就可以了是吧。你看我们就找到它的核心点是不是好,再往下面你点击一下,你看它就弹出来这两个看到没有。哎,这两个分别是用来做什么的呢?好,注意啊。比如我们看到一个什么NF是不是。
07:01
恩阿夫瑞是什么意思呢?在这里它主要是用来表示这个。In a rail。是什么呢?它是指定。这个成员是专门来指定什么呢?指定我们当前这个内存区当中内存区啊,内存区当中这个空闲什么呢?空闲的一个叶块的一个什么数木对不对?叶块数木它是对于什么,比如说对临街的这个内层区,它分什么呢?会逐叶啊。哎,逐页逐页进行计算。对于什么呢?对有一个阶的这个内存区域,哎,它就计算什么呢?它计算一对的一个什么数目是不是啊对二是不是二就二的四呢,是不是对二阶的这个内存区呢?哎,它就计算什么呢?就计算。啊,事业事业集合的一个什么呢?集合的一个数目啊,那么剩下就是什么,我们就会依次什么,依次类推啊,就会得出这个结果,所以各位朋友啊,一定要知道这一点就OK啦。
08:12
好,那我们了解这个问题之后啊,那么其实它后面有一个什么,比如说它对应一个free list。他是干什么?它用于连接空闲的一个什么。啊,要注意啊,它是用于。这个是吧。OK。啊,List啊。它用于什么呢?用于链接什么?链接空闲页的一个什么呢?链表,它就是做这个事情。那么。页链表注意啊,页链表它包含大小相同的一个什么联系内存区域,就这个意思啊,你这个页链表。
09:02
它就包含什么呢,包含大小啊相同的一个什么联系内存区。连续内存区就这么简单。大家要注意。尽管你定啊,很多的这个什么,很多个月的一个链表。但是啊。我们后面再进行什么呢?进一步来研究。但是伙伴系统它不一样,是不是伙伴系统它是一个非常重要的一个专业,是不是。它它干什么呢?它是描述我们内存分配数量的一个单位啊。这个你要搞明白,是不是不搞明白就不行啊。那现在我们就来看一下啊。我们将这个结果是。看着啊。到这边来。
10:00
啊,这个结果就不一样了,是不是。那怎么做呢?我们现在讲到了一个阶,一阶两阶三阶11阶是吧?啊。啊,注意啊,这个接是不是接它为什么接就为我们这个虎伴啊,接就是为火伴。那它是伙伴系统中最重要的一个什么参数,是不是?那么它是用来描述什么呢?描述我们内存分配的一个什么数量单位。就这么简单。还有一个什么呢?还有一个就是内存块对不对,内存块啊,内存块的长度它是相当于I的什么呢?就相当于二的一个二的次次方对不对,那么其中啊。其中什么呢?其中这个or的。它的一个范围,范围是从几开始呢?范围是从零到什么呢?零到这个马克X_一个什么呢?O对不对啊。
11:05
但是它机体啊,就是机体的这个内核的一个什么呢?啊盐码分析如下。我们就可以看得到是吧。那么找到这边来的话呢,我们有一个什么呢,专门有一个你看。有一个Mars。下划线。就这个。然后他装了一个钉啊。看到没有?最大值是11,从零开始是不是?它就可以分配出来,大家注意啊。它就这么一个结构,你看。啊,释放这个内存的一个管理,看到没有。这个伙伴的一个分配啊。啊,就这一个,现在你要关注的是这个问题。
12:01
看到没有?哎,我们把它移到这边来是吧,那具体怎么回事呢。那么注意啊,通常这个marks是不是。就是。这个啊,就是该常数我们就设置,为什么呢,设置为11嘛。所以它就意味着什么呢?意味着就是一次。啊一次啊一次呢,它分配的可以请求多少呢?可以请求的那个页数啊。页数最大是多少呢?最大?喂。二的什么呢?二的。二的11次方。二的11次方,它就相当等于多少了?等于两二零四八,是不是就等于2048?等于这个。
13:01
2048。啊,就这么简单是吧。但是啊,如果它特定于体系结构啊,它也有一些专用的这个体系结构。对不对。那么桩体结构的话,那它也可以设置手工改变,是不是要注意啊,但是有一种体系又不一样,是不是它这个体系如果IT64就不一样了啊,如果是I杠什么呢。六四的这个体系结构是不是。体结构呢?它的一个什么,它的一个地址空间,它可以处理什么呢?处理这个马克斯奥。它是多少,它就相当等于18了,它等于18是不是。啊,还有一个比如M啊,啊,它这个系统它跟小一般是八或者是九就差不多了,是不是。那么机体要看啊,具体要看你怎么去设置是不是。看大小是多少。OK。
14:00
那么伙伴系统。当中是不是就是啊list嘛,刚才我们讲了一个list e看到没有。像我们看到刚才我们看那个阎王看。A是吧啊,它的最大是什么呢?这个马克X数组数主的严素,它就是索引的一个什么阶数,我们看一下啊。我们看这个内河野马里面。往上面是吧。它有一个什么a ch下面一个什么,比如V850的啊。他有一个con。看里面。啊。啊,第一。Foot。
15:05
这一款啊,他这个没有是不是。那可能是一些老的版本啊,这个那也没关系了。它那么新版本是这样,就是说内存区是不是就是你内存区当中它第一页。D页内啊,它这个烟表链表这个元素啊。它可以进行进步操作,所以说啊,也不需要引入一些新的数据结构来管理这个什么物理上联系的一个区域是不是,所以说它的整体操作啊。他有这么一回事是不是?啊,通过一个链表进行什么进行进一步的存储。你看你也可以通过什么来看PC这个伙伴系统嘛。你看在内核里面啊。打开。好,我们注意一下啊。
16:04
启动。嗯,这就可以了。然后我们看下一个。下一个是什么呢?下一个我们是基于什么,基于这个伙伴系统的一个内存管理啊。它主要是什么呢?主要还是专注于某一个什么,某一个节点的某一个内存域进行处理。你比如什么呢?比如我们这个什么呢,DMA啊,或者是什么呢,或者是这些高端的一个什么内存域。但是啊。但是所有这个内存域呢啊。和这个节点的一个什么。伙伴系统啊。伙伴系统它都通过什么,都通过这个备用分配,嗯。
17:03
备用分配这个列列列表啊,把它什么呢?把它们连接起来是不是。注意要把它连接起来是不是啊,就是说首先内存域里面,或者是说它这个节点无法满足我们内存分配的需求的时候,他就去尝试同一个节点的一个另一个内存域是不是啊。他就这么一个思路啊。内存它有很多个,它不止一两个啊,大家注意是不是。好,那现在我们看一下。嗯,这边启动了没有啊,啊可以了,胃口是吧?啊完了之后呢,我们就来一个,嗯,把这个口令输进去啊。So。嗯,现在已经登录进来了啊。
18:11
登录进来之后是吧,我们在终端里面啊,你看这个。内涵了这个什么呢。你就通过什么呀,那K是吧,好对Su。是吧?可以了吧。然后呢,再来一个cat。我们把它拖大一点啊。PC是吗?杠PLC下面有一个什么呢?有一个build。Building什么呢?这个information你看到没有?那normal是多少DMS多少DMS是多少,你看这都全部出来了,是不是你看。所以说啊,我们看到是不是这个是什么呢。他针对这一块,你看我们来研究这个问题是吧。啊,把它连接起来是不是,那我们可以通过什么呢?嗯。
19:01
就是。嗯。就是我们。通过什么呢?通过这个。伙伴系统啊,当前的一个状态啊。状态的一个信息是不是啊,可以在什么呢?在。可以如下操作啊。获取什么呢?获取相关的信息。我把它放下来,看到没有。这个问题就搞定了是吧,那么上面是不是我们用使用什么,我们使用这个视图啊。
20:01
使用视图。嗯,来描述啊。描述什么呢?描述伙伴系统对不对,描述这个第一个是伙伴系统对不对,还有什么呢?内存域。啊和什么呢?和节点之间的一个什么关系如下对不对。好,现在我画一个图啊,大家注意一下,画一个图是吧。我就画到这儿来算了啊,借这个来画。怎么做呢?首先你比如第一个内存一,第二个内存E是不是。比如这个内存域。内存域它连接是不是。OK。好,那这个内存搞定之后,它连接很多个啊。第一个它大小不一样嘛,你分配这个大小不一样,你多少K多少K的是吧。
21:03
两个。它大小可以不一样啊,你要注意啊。差不多了是吧。进行进一步管理啊,你看啊。
22:02
可以了。然后这是一个比如分别多少K是不是。大一点的是吧。看到没,就这么管理啊,有的时候呢,它也可能比这个大小页面不一样嘛,是不是它大小不一样啊。别地方我搞三个。第一个。第二个。看第三个。
23:04
看到没有?可以了啊,你看啊,现在我们所看到这的这个还没连到这来啊。这一块。可以了。啊,那现在看到这一块就是个内存域是吧,它有多少块呢?这个备用列表里面,备用列表里面很多个啊,大家注意啊。很多个是不是。就你这个备用列表里面,它有很多个,它不止一个啊。伙伴系统的话就说如果一个内存区里面是不是它就分配过磅嘛,按照半来上计算。比如第一个我就。
24:04
这是第一个。把它保存起来。那现在我们看到是第一个就出来了。这个大小啊。颜色我们就自己填充算。跟它的页面大小一样。我填这个颜色。这两个大小一样,我就填这个颜色。啊,这个一样,我就填这个颜色。你看到没有,那么它到底有多少个呢?它可以是多个,你要注意啊,多个。那我就。框架C是吧。这是一块,看到没有。
25:02
这是一块。然后呢,两块。四块了,看到没有。就这么简单。然后呢,它们之间的连接是通过什么呢?备用链表进行备用列表啊。把它存起来是吧。比如这一块。啊,就这么一种结构啊。差不多了。
26:02
第二个是吗?看到没有?他们之间右边我去给他搞一个什么呢。专门有一个备用。不用这个列表来存储啊。他就这样存储啊。然后把它复制。好,那现在。这个图形我们就解决了是不是。
27:02
看伙伴系统当中的一个什么,它这个内存域跟节点之间的一个关系,我们全部就描述完毕了是吧。这是一个问题,那另外一个问题是什么呢?另外一个问题我们就要啊研究一下今天晚上。哎,我们要讲解的第几个,第二个啊,第二个啊。第二个就是说如何避免这个内存碎片化是吧。第一个解决了啊,各位朋友啊,我们看第二个。第二个是吧。第二个内存碎片化是什么意思是吧,就是说。前面我讲过啊,就是一个双向链表,它可以满足这个伙伴系统所有的需求。就是一个双向啊,就是一个双向链表。它可以什么呢?可以满足我们这个。可以满足这个伙伴。
28:01
系统的什么,所有的一个什么需求,是不是但是。我们作为这个内核的开发人员,是不是他对伙伴系啊,伙伴这个系统的要求可能更高,是不是。伙伴系统呢,是内核当中啊,一直值得在追求的一个东西,是不是。所以说第一个。它可以什么呢?第一个就是说它根据什么,根据可移动性,主职业这是一方面啊,我们可以什么呢?可以根据,比如说第一个是吧,它可什么呢。可根据。可移动性。啊,组词这个业就这个意思。伙伴系统,它这个基本原理我们前面已经讲过了啊,这个我们就不多讲了,是不是,但是是不是。但是什么呢?但是你在什么,你在这个利纳克斯内存管理的啊。这方面是不是它有一个什么一个长期啊。
29:00
存在的长期存在的一个问题是不是。你长期存在什么问题啊,就是你在系统啊,一旦启动之后啊,系统启动啊,系统启动,并且你长期是不是。你长期运行之后呢,是不是这个物理内存就不一样了啊,你看物理内存它就会产生了,产生什么,产生很多的这个什么,很多的一个内存碎片化是不是。所以这时候我们应该是怎么处理的?是不是,哎,大家注意啊。你比如啊。它的管理方式,你比如说假定你内存有60个页,是不是啊。60页是普通计算机了,是不是啊,但是已经足够了,对不对,那么地址空间它散布是空闲是不是。你看他怎么用啊,60页就零到什么呢,零到59嘛。你怎么去描述,你看啊。比如。就是物理内存啊。
30:01
物理内存的一个什么,物理内存的一个碎片化。碎片的一个什么视图啊?碎片。视图如下。他怎么去管理呢?我们来看一下。第一个问题啊。画一下了是吧,他有多少个,假设他有60个啊。60个,你就这么放了?看一下C是不是。第一个,第二个。第三个。第四第三个啊。第四个。十个。
31:05
一二三四五六七八九十十一十二可以了。OK。啊,这是一个啊,再来一个。等一下我们再用颜色上进行整理啊。60个啊。给五行。
32:00
五行差不多了是吧,好可以了,五行的话它编号是不是你看啊。编号你这地方是零呢。那他是零零到什么呢。哎,这地方是零到11是吧。啊,你零到11就相当于什么,就相当于你这里有12页了是不是。零。11下面再往下面啊。哎,这个是12了是吧。来一个就是。13、没有。
33:01
啊,13。是。啊,15。啊,不是了,12。嗯,12到十二十三二十三这个这个不对了,这个24。乘二十四二十四再加一十二三十六。啊,36在后面。四十八四十八到59。好,这边。就是到23是吧。加12嘛。嗯,再来一个。就到35。
34:06
啊,35再往后面。47。啊,47后面。59。好,那现在啊。其中的话,你比如对方呃,空闲是不是,那我就来个空闲填充不填充颜色你看啊。啊,这就没有颜色了,对不对啊,你比如这地方它也没颜色。这两枚颜色是吧,空闲的啊。没有颜色是吧。
35:10
嗯,可能看到没有。那现在大家所观察到的这个问题啊。看到没有,你所观察的这个部分,你看就这么简单,是不是你看到这一块啊,这里面我也可以给他钱,把空闲全部搞起来啊。这里一个是吧。第二行是吧。给他搞几个空的啊。来到展览。
36:08
没有填充的啊。啊,先空这么多啊,我就给他空这么多是不是。差不多了是不是,但是说实际上啊。假设你这个是60个页面是吧,60页。所以说。左侧是不是这个地址空间,它存在什么呢?存在一些空隙,你看到没有。比如这个空闲的。你看没有。
37:31
啊,基本上就出来了,是不是你看。这一块啊。把它画好一点,到时候我们要用到啊。
38:40
这是基本结构啊,基本结构。看这地方对一下。可以了,这边也来一个啊。
39:38
好,基本结构是这样啊。
40:33
这就是内存啊。就是物理内存的一个碎片化是不是?但是你要把它什么呢?你要把它移动起来,是不是形成一块,你比如我把这个挨到一块,空闲挨到一块是不是啊,把可用的挨到一块。啊,正在使用那一块,那怎么做呢,你只有看啊。这怎么做呢?你空多少个是不是?空多少个,你这个可以算出来嘛,你看一个两个三个四个五个是吧。
41:02
六个七个八个九个。十个十一十二。十三十四十五十六十七十八。总共18个,是不是18个那么对称设设计的时候你再复制一下啊,18个。嗯,那你空18个是不是。空18个啊,这个地方一样。这个颜色。是吧,你是八个的话。十十二个手这里12个啊。12个再加八个12个十三十四十五十六十七十八。大概就到这个地方的样子。18个可以了,你看。他空18个,你这个不能空。这地方就不能空啊。
42:15
差不多了啊。可以了,你看。他们俩之间的一个对比关系是吧。你除一下就知道了,是不是60啊,你空18个是不是。18个。把计算器拉出来是不是。
43:17
他们俩之间的一个对比关系就出来了。那现在我们理解这个问题之后,是不是。要注意,比如说左边是不是还有右边这个图,先搞清楚。但是你还有一个什么,就是我们用户空间注意啊。嗯,这个问题我们应该是怎么回事呢,就是说。嗯,刚才没写了啊,就是假设是不是上面已经写好了,假设你这个内存它是有多少呢?60页啊60页组成。60页组成的话呢,啊已经足够了,是不是比如左侧就是左边了。左边这个地址空间当中它会散啊。散布一些什么呢?上部的一些空闲的这个叶看到没有白色啊。
44:03
沙漠空闲液。那么你这个空弦液的话呢啊。它大约呢是占什么?占25%左右。18乘四嘛。看一下啊。百分之多少?60个。60个。25%左右了,是不是。本上五二十五。打野战。大约25%。他的一个什么。它的一个物理内存啊。仍然没有什么呢,没有分配。但是是不是。但这个最大的一个什么呢?最大的一个连续空间是不是。那你最大联系空闲。区它只有什么呢?只有一页,是不是就这个意思啊,所以说。
45:01
这对用户用程序是没问题,但是对内存通过页表映射的话,你无论是空闲页呢啊。在这个物理内存中的分布如何?是不是应用程序看到的总是连续的?就这个意思啊。那右边这个图形看到没有。右边图形是什么意思呢?就是空弦页和使你看空弦页跟使用页啊,我把它分开是不是啊,跟左图是啊,跟左边那个图形是一样,这是把它使用液跟那个空弦液是混合在一起的,先把它撑开是不是,那么但是所有空弦液都是为一个连续区,这样的更好是不是,但是对内核来讲。碎片呢,它就是个问题了,是不是由于物理内存它一致映射到地址空间的一个内核部分,对不对。但是啊。那么你在我们在左边的这个图形里面,我们可以看到。你无法映射一个比一个页更大的一个内存区,是不是,尽管很多时候内核它都分配什么呢?比比较小的一个内存是不是,但是它也有的时候也分配一个大一页的内存呢,是不是?所以分配大页内存的情况下,那么啊右边这个图形是不是就更容易啊,处理是不是处理联系的内存区啊。
46:15
所以说大家要注意这一点,就是说我们所提到的内存碎片只涉及到内核啊,这个要注意这个问题啊,大多数呢,现在这些CPU它提供什么剂型液啊。比普通要大很多,是不是啊,这就不用考虑了,是不是。这就是我们研究的第二个问题,就是内存碎片。那么就是说我们如何什么呢?第二个问题你要搞清楚的就是说,比如说我们这个仿碎片是不是。反碎片的一个工作的一个什么呢啊。机制它是怎么做是不是。防碎片有这么几种啊,嗯,怎么做呢,比如你不可。不可移动的液是不是什么意思呢?
47:00
就像呢,在内存当中,它有固定的位置啊。你不能移动到其他地方,那么核心内核它分配这个大多数在内存属于啊这个这个部分还有一个什么,还有一个是可回收的液。可回收液是什么呢?就是不能直接移动,但是可以删除啊。它内容也可以从某一个领域里面进行重新生成,对不对。啊,就这个意思,除了这个什么呢?除了这个可回收液以外啊,和什么呢,和这个可移动液。可移动页复制什么?复制随意的一个什么,随意的移动是不是什么意思呢?就是说属于用户空间应用程序的页,它是属于这个类别的啊,是属于可移动页。但是可以通过什么呢?通过页表映射是不是就可以了啊,如果他们复制到新的位置,那么页表下来它就可以什么可以相应的更新嘛,所以应用程序它不会什么不会注意到任何事情啊。这就是我们啊,给大家讲解本节课是不是我们主要研究内容,我们就全部啊。
48:02
给大家讲完了是不是啊,有任何问题啊,可以通过QQ啊。微信啊,跟我进行进一步的沟通与交流。那么今晚的课程我们就讲到这里了,是不是?来,我们下一次课啊。下次我们把这个分配释放液和分配器内存映射全部讲完。
我来说两句