00:00
各位朋友大家好,我是维克,接下来我们主要是学习啊利拉克斯内核里面的页面回收机制。那通过上一次课啊,我们已经将这个页面回收机制,它的一个整体流程,以及相关部分的源码分析已经全部讲完了。那么这节课呢,我们接着继续来学习啊。如何进行收缩,这个什么呢?内存域的一个原理啊。怎么做?那首先我们来看第一点。什么意思呢?就是说收缩这个内存啊。内核啊。内核的其他部分,它需要什么呢?需要向这个负责收缩,收缩这个内存域的一个历程。那么首先我们提供一些信息,第一个你需要什么,需要放出的一些啊,页数是多少,是不是你要放弃之前哪一些操作啊,可能检查一些最大因数啊,比如哪一些啊不适合放出,哪一些适合放出,这些我们都要考虑啊,大家要记住这一点就行了,那现在我们就先看啊第一个。
01:16
第一个是什么呢?就是Linux内核。那么其他的呀,就是。那内核。要什么呢?要向这个负责啊,收缩内存的一个什么呢。他的一个什么历程?要提供什么呢?提供这个啊。如下的这些相关的这个选项。有哪些呢?第一个。你要给出一个什么呢?西药啊,放出的一个什么呢西药。放出的一个页数,这是第一个。第二个呢,就是说我们在什么,我们在放弃放弃啊操作之前对不对,那么可能要检查什么呢?检查的一个最大页数是多少,你不能超过它是不是。
02:11
啊,还有什么呢,还有我们就要对什么,你要对这个对释放这个业的一个请求啊,啊所指定的一个什么呢?所指定的一个优先级问题。所以我们要从这几个方面进角度,还有什么呢?还有你还知道什么呢?Nu啊,Nu什么呢?Nu ma这个节点和什么呢?和其中所包含的一个什么呢?包含的将要什么,将要处理的一个内存,这些啊,我们都必须要将它考虑在这个范围内,这是第一个问题啊,大家要。了解的是。那么接下来的话呢,我们就来看第二个是不是,第二个是什么,第二个就是说大家注意啊,就是说。利纳克斯,是不是他不这个对释放的这个什么一请求所指定的优先级。
03:05
它并不是我们啊,一些传统的尤尼克斯的这个啊,进程优先级。而且他这个优先级在什么,在这个啊,核心态上也没什么意义啊。优先级只是一个整数,是不是它是指定内核需要什么新内存的一个什么啊。急切的一个啊。过程。那比如啊。比如什么呢,就是当。当在我们后台放出页的时候,你要预防什么,你要预防这个内存不足的时候,需要什么呢?需要急切的程度啊,就不如这个内核直接检测,这个检测到严重的内存不足的时候更重要。那么在后面一种情况就是说内核呢,它急需要什么呢?急需要新的内存来执行这些相关的操作,所以说我们啊,通过前面我给大家讲过了什么问题呢,你看那个图啊。这个图有个什么呢?有一个she_Z这个是干什么?这个就是我们所讲的页面。
04:08
选择就这么个意思啊。好,所以我们接下来你就要分析这个是不是啊,页面选择啊。页面。选择的一个什么选择函数啊,我们上一次课刚刚也提到过了啊帅里面什么就。肉啊,OK。但是啊,但是啊,但是什么呢?但是我们我们在研究是吧,就是我们在什么,我们在研究这个函数啊。之前对不对,哎,那还必须什么呢?还必须要掌握一些啊。掌握一些更为什么,更为核心的一个什么啊。技术点。
05:00
哪一些呢?首先第一个问题,我们掌握的就是这个什么呢?就是控制扫描。现在我们看啊,第二个就是控制扫描了。控制扫描。好,那空之扫描什么意思?它是什么意思呢?就是说它就相当于就是说它是一个特别啊,控制扫描它一个它是一个啊,非常特别的一个什么呀,数据结构啊。数据结构保存什么呢?保存了用于什么?用于控制扫描操作的一些相关参数。但是要注意了,就是说这就是如下结构啊,如下结构呢,它不仅啊,不仅仅是用于什么,用于从高啊从高层。从高层这个函数呢,向这个什么呢,向这个低层啊,向低层函数啊,来传递这什么呢,传递这个指令,而且啊,也用于什么呢。
06:04
而且啊,也用于反向,嗯。反向传递结果。他就这么一个思路,就是说他可以通知这个调用者操作是否成功。可以啊,来通知这个什么呢?调用者操作是否成功。那机体的这个什么呢?机体的这个盐码啊,嗯,机体野码如下。啊,那现在啊,我们啊,大家就来看一下啊。OK。怎么做啊?我们注意了。就到这了啊。我们来看这个。在哪里呢?在这个MM这里啊。在MM下面是不是它有一个什么VSCVM,就是虚拟内存扫描。
07:01
V开头啊。这个。啊,上面这个。然后找到专门一个scan。这个地方看到没有这个结构体对不对?好,那么现在我们所看到这个结构体呢,首先它有一个什么,你看有个scan是不是还还这个GPF啊,还ni等等啊,那么现在我就给大家呢,挑出几个啊,非常我们经常使用的一个核心成员,那这些成员分别是用来干什么的。大家知道,首先我们看第一个什么,这里面有个什么这么一个man_sweep是不是?哎,慢下划sweep,还有一个什么man right page,对不对,Main page啊。那么这个是做什么呢?啊,现在我们就看第一个成年。这个核心疼啊。这个成年它主要是什么?主要是回收过程要放出液,是不是就回收过程是要放出液这些相关啊,大家记住了是不是。
08:06
除此以外,它有很多的,就是说我们可以指定这个地方啊。比如。这个成年。它可以什么呢?就可以指定啊,它指定什么,指定内核是否什么呢?是否允许将这个页啊写出到什么呢?写出到后背的一个什么存储器什么意思。就是说Linux内核它运行于什么呢?七上模式的时候。啊,有的时候呢,我们需要什么,需要禁用写出操作对不对,这是一个问题啊好,再往下面它有一个什么,有这么一个问题,下面这个地方看到没有,嗯。那么这个my swap它是什么呢?它主要是确定什么,确定这个页面回收的一个什么处理过程中。是否什么呢?是否允许这个液的一个交换,什么意思,就是说只有两种情况嘛,只有两种情况啊,它会什么呢?它会禁业啊,就是会禁用这个夜交换,第一个是软件刮起。
09:17
软件挂起机制,在执行这个页面回收的时候,或者是说在numa这个内存域里面,它显示的禁用这个什么呢?页交方。他就可以做这一点啊。好,那么除此这些啊,相关的这个啊,核心成员以外,对不对,我们还有在在还我记得还有一个非常重要的啊,叫做思维。这里有一个。Scan。OK。什么意思呢?这个成员他是像什么,像我们这个调用者报告啊,已经什么呢,已经扫描到的一个什么,不活动的一个什么呢。
10:10
产物活动页的一个数量是多少?那么它用于什么?用于在这个啊,用于在这个页面回收。页面回收什么呢?设计啊,各个内核的一个什么函数。内核。函数之间的一个什么之间的一个进行通信。就这么个意思是不是?啊,这这这是一个啊,还有一个你看有一个什么gfp这个mask嘛,对不对,其实这个成年它主要是什么呢?它主要还是指定这个什么,指定我们这个调用啊,指定在调用页面。回收函数的一个什么?嗯,上下文的一个什么环境下有效的一个什么有效页面分配这个标志。
11:03
来做这个事情,但是注意啊,这点非常重要,为什么呢?因为有的时候啊,在页面回收这个期间,它必须要分配出新的一个内存。如果我们发起这个页面回收上下文环境啊,啊,不允许睡眠是不是,那么这个它就约束,当然必须要转给什么呢?实的函数调,否则就不行是不是啊。这就是我们啊要研究的一个点是不是。好,除此以外我们看啊,还有一个就是。叫做。还有个陈燕啊。等刚才我们有一个专门统计的。啊,这个。我们就搞定了啊。看到没有?好,接着什么,接着我们在这一边。
12:05
你要知道在哪个地方啊。这个地方。解决了是吧。好,那么这个地方啊。这个地方解决之后,那还有什么呢?还就说内存统内存域的一个统计量。他在什么呢?在我们上一次课啊,所讲过的,看到没有,内存一的统计量是在这里,你要搞清楚啊。内存的统计量。在。Linux。MM。
13:01
这个。下面有一个上面有这么个层,看见没有啊。凹凸。麦克下滑钱了啊,就这个看没这个。这个是什么?现在我们所看到的这个成年看到没有。这地方啊。这个辰缘它是什么呢?是内层。内存E的一个统计啊,这个数量是由下面这个来决定的。这个产这个数组是不是,但是现咱们所看到这个配给啊,你看。等一下啊。第一个。
14:05
OK。就这个。好,这个是。内存E啊。内存域的一个什么呢?统计的一个啊,统计量是吧。好,内存一这个统计数量的话,你要注意啊,因为什么呢?因为你内核它需要扫描什么。就是这么一个意思啊,这个统计量它就是这么得来的。就是我们这个Linux内核是吧。他需要什么呢?需要扫描这个活动啊。想扫描活动列表和什么呢?和这个惰性列表是不是?惰性的一个列表来什么呢?来查找可以啊,在什么呢?在两者之间进行移动什么呢?移动的页是不是,或者啊,我们是从什么呢?从这个惰性的一个。
15:07
惰性列表啊,来回收什么回收这个页,但是啊,你要注意了。但是什么呢?就是完整的链表,它不可能一遍就扫描完成了,就是你每一次你只能扫描什么,扫描链表的一个什么活动链表上的一个,刚刚我们讲的一个什么呢?叫做NR这个active是不是啊。这两个链表就是说由于内核它使用LRU这个方案,所以说你这个链表它是从尾部开始计算。大家搞清楚这个问题就行了。好,那么具体这个函数怎么实现呢?我们来看一下啊。打开这边是吧。刚才这个函数。一个she。S是吧。下划线走。
16:01
然后下一个三。就这个函数看到没。啊,现在我们就找到这个函数来算。你要搞清楚啊,其实它这个函数是什么呀。在整个操作过程当中,它就是实现什么,实现每一次调那个函数是不是哎。它就会通过这个激活这个页啊,内存里面进行不断的操作,是不是啊,不断的进行进一步来实现。啊,这么一个函数你看。这就是他的一个操作过程是不是。OK。下面记住啊。这个函数。好,你那是。内核。这个函数啊。
17:41
好,那么这个是这样的啊。什么意思呢?就是每一次啊。就是每一次你调用啊此函数时对不对,它将会什么,将会扫描这个活动和不活动的一个什么。
18:00
啊,不活动这个叶的一个数目,就这个意思。哎,他就是做这个事情。好,那我们了解这个问题之后,那接下来后面就好办了,还有一种呢,还有一种就是说我们要隔离这个l rue是不是刚才呢,是第几个啊。刚才我们是第二个是吧。看这是第一个啊。那接下来我们来看第三个。第三个是什么呢?是隔离啊。隔离什么呢?隔离LRU啊,这个液和集中这个什么回收。怎么做?它相当于什么呢?相当于就是说我们在什么,就是你在这个内存域当中啊,在内存域当中,那么保存在什么呢。
19:01
保存在链表上的这个活动和什么和你这些不活动液。它都,嗯,它都什么呢?它都需要,都需要什么,都需要有一个什么,有一个叫做我们经常讲的这个叫什么叫自选属的一个保护,就这个意思啊。那么准确的来讲就是它通过什么,通过这个。重直接指向什么呀?LRU?这个什么呢,Lock这个啊成演。那么就是说一般情况下啊,我们可以忽略这个锁,因为什么呢?因为我们啊。因为你在操作LRU链表的时候,那么需要锁定那个链表,锁定链表的话在内核当中。对很多很多工作啊,啊这个负荷而言,页面回收代码它是属于热点,是不是属于最热的最重要的代码之一,所以说因为什么呢?因为你这个锁的竞争几率啊相当高。
20:00
所以说内核它需要尽可能的在锁的外部啊。工作就这个意思啊。所我们要搞清楚,所以它有两个点嘛。所以它在优化,是不是就是它一种什么呢?一种优化啊,一种优化是这样的是不是啊。哪一样呢?就我们有两个函数了,你看到没有。他这个图啊。优化。哪两个优化,你看一个是active list,一个是in active list这两个嘛,对不对。你看那个图就可以研究出来了啊。嗯,将什么呢,将这个。Sha下划线这个什么呢?Active和什么呢?和这个list和什么呢?和这个Sha。In。Active。下划线这个list。
21:01
它是什么?通过这两个函数啊,它可以将什么呢?可以将我们分析的什么,将我们将分析的所有的这个什么,所有的页都啊。把它放置到什么,放置到一个局部的一个链表上面,是不是,那这时候我们要放弃什么呢。你要放弃对什么对,这个前集的一个LRU链表的一个什么锁,就这个意思,然后呢,它就会什么。然后我们就会继续啊。然后继续什么,然后再继续局部的一个什么呢?局部链表上的一个什么处理的这些啊液就这个意思啊。啊,所以这这这就这个问题啊。还有什么呢,还有就是说你我们也可以通过什么第四个啊。也可以通过这个is是不是。
22:01
下划线,什么Li ru里面的这个pages函数。嗯,负责什么呢?负责从这个活动啊。活动链表和这个什么呀。我们经常讲的一个啊。惰性链表选择给定啊。啊,这个树木的一个什么。给定啊。树木的一个叶是不是。啊,所以说你从链表这个末尾开始,是不是通过循环遍历这个链表。每一步获取一个叶是不是,然后将它移动到这个局部的后面,就这个意思啊,直到你所需要的叶全部搞定为止。就是你要关心的一个问题,是不是。这是一个问题啊,那么一个配时,它实现所谓的一个什么集中回收算法是不是啊,它有一个集中回收算法,除以这个这这这个思路是不是啊,就最简单的一个问题啊。
23:00
好,那现在这个问题我们就搞定了是不是。可以了是吧。那还有一个什么呀。还有一个问题啊。就是说。我们讲一个什么呢?就是集中回收算法。它可以有助于这个内核回收比较大的一个连续物理内存。页面就这个意思啊。第五个是吧。第五个是什么呢?第五个的话,专门有个什么,专门有个集中回收,是不是集中回收技术是不是它可以什么呢?它可以有助啊。只是有助。OK。
24:01
有助于什么呢?有助于这个内核回收啊。比较大的一个什么。连续的一个什么,连续的物理内存的一个什么区域,嗯。他就这个意思。那么机体的这个什么,机体的这个啊啊视图。如下。我们来看一下。怎么做?什么意思呢?就是我们这里,其实他提到这个问题是这样,就就是这样的啊。括起来算什么意思呢?就是我们讲一个什么pages。配置时也可以实现什么,也可以实现这个集中回收算法。那么,这个集中分数算法的目的是什么?就是高阶分配,它需要什么呢?需要一段有多个业组成的一个连续物理液啊。这种分配请求是很难满足,所以你请求这个页数越多,面临的困难就越大,所以系统啊,它运行一段时间之后,那物理内存就变得越来越啊,越来越少是不是,那么怎么解决这个问题,所以它产生一个什么集中回收算法。
25:15
他就这么个意思是不是。所以它有一个什么呢,你看啊。集中回收算法是由这个啊。就是说假假设是不是啊,假设你这个啊,内核里面它需要什么,需要联系到几个液针是不是,但是我们可以分配到液针所属的。这个页啊,当前IR电表上面,那么这些。叶,它就散裂在我们这个散步啊,就是分散在我们内存当中了,它就这个意思啊,最大连续的是两个月,就这个意思,你你要搞清楚这个这个点就行了,是不是。所以它从双向链表进行存储。啊,就这个问题啊。好,那我们了解这个问题之后,那么接下来我们来看下一个是不是下一个什么威SK里面它有一个啊,设计过程当中啊,专门有一个叫做。
26:08
忘记这个叫什么了啊。这里面有。有个隔离部活动页和活动页吗?站在前面。看见F啊。活动。为此,看点C。就是说它是什么呢?一个是隔离不活动液,还有什么呢?啊隔离活动液,还有活动和不活动液都隔离。
27:06
它是有这个有相关的函数啊进行来解决,就是说只有隔离和不隔离活动液就通过。调用函数去处理。还有一个什么。还有就是说我们要了解一个什么。就是下一个问题了,是不是?啊,下一个问题就我们要回收什么回收啊,这个对搞。上山。第二个是吧。那这里是回收活动页的一个链表,是不是怎么做呢?他怎么做就是将什么,其实啊,它是将这个页从这个什么,从活动链表当中啊。
28:00
进行什么呢?移动到什么,移动到这个啊,惰性的这个链表。路行链表。啊,镀锌链表它是E呢,它是我们这个页面回收的一个啊策略算法。促进算法实现的一个什么?促进算法实现的关键操作。就是这个问题,所以说啊,这里面它就有一个什么,它有个步骤啊,就是我们执行的时候,它有个步骤是不是,那这个步骤它怎么去执行呢?第一步你要调用什么函数,第二步调用什么函数,第三步调用什么函数,可以通过这么一个啊图形进行进一步来操作,你看啊。啊,第一步。OK。哎。下划线。
29:00
In。Active。这是第一个是。好,第二个。IRU_ad。这个算。第三个。下划线LRU里面什么呢?Pages。最后我们就可以什么计算啊。啊,G3什么呢?G3这个叶交换的一个什么。参数就这个意思。OK,你看啊。
30:30
啊,就这么个思路。第一个是吧。啊,这两个。那么这个函数的代码的流程就是这样的。就这个函数代码流程就上面这个函数啊。就是。
31:03
下划线。Active里面的什么呢,Z?的函数。函数的一个什么内核的?野马。流程如下。就那么个过程。好,那现在这个啊,我们就解决了是不是。但是他具体的操作是不是你可以看这边啊。抗F是吧。下划线。X5是吧。
32:03
他这些计算啊,比如优先级他从01234567是吧。要注意啊,还有什么呢,还有就是说一般情况下啊。我们有一个什么,它有个对应的一个值,就是说比如啊。数字是吧,比如map的是不是。等等啊,他在计算过程当中也需要一些相关的参数进行进一步的参考,否则的话,他还不知道这个怎么去执行是吧。所以说我们在操作过程当中,那这是第一个点。那么另外一个点是什么呢?另外一个点就是说你在回收过程当中,你回收什么呢?你比如这边,比如这是第一个是吧,那比如下一个,你看下一个啊。你比这个。这个是什么呢?这个就是回收部活动页了,是不是。那么回收不活动液是什么意思?就说内存域就相当于你这个内存域。
33:02
内存一当中。内存域当中对不对啊,它的一个什么液,它已经在什么呢?已经在LRU。LRU这个链表上面啊。进行什么,进行重新分配对不对。但是他已找到什么呢?找到一个适合回收的一个什么。啊,回收的时候啊进行要选,要选中什么,选中这个叶。但是啊,它其内存空间还没有被释放。所以说我们在什么呢?在释放内存最终的步骤,它还是要选择什么呢?She inact list啊。或者是这个谢啊。这个配置list这个函数去执行。那么两者它是两个是协同操作啊。就是什么呢?这两个函数是不是当中这个液集情啊液啊液氢集成什么集成一块。
34:04
这样的话,它有利于什么,有利于交换这个什么聚焦啊。就这个意思,所以说我们有一个什么,而且它通过这个函数啊。就是哪个函数呢啊Sha。这个page list,它将结果这个链表上的成员向下传递,并且什么将这个页啊。发送给相关的后备存储器,你比如啊。叶被同步了是不是,或者你这个丢弃啊。或者是放出啊等等他这些都是可以的啊。大家要理解这个点是吧。好,那理解这点之后,那么还有什么呢?还有就是我们除了什么,比如你除了这个页的链表啊,通常收缩控制参数以外,是不是它可以通过另外一种参数呢?就这么个意思啊,你比这个,我们今天讲了这个代码流程你看啊。
35:02
什么代码流程呢,就下。下划线。The catch。开启这个。函数的一个什么代码?流程如下。好,我们来看一下啊。通过图形表示最容易是吧。这个它是一块啊。好第二个是吧。那首先第一步调那个函数是吧。下划线,Catch。啊,这就处理了。定了函数之后呢,它就往下执行啊。
36:02
一直到什么呢?一直到后面这个。这个是什么,他。防防什么呢?就是防防这个。回收液的一个什么?数量是不是。就这流程啊,首先第一个啊。就用什么用这个。Li ru_A里面什么呢?RA。第一个。好,第二个。I saw这个什么let?啊,下划线ARU里面的什么呢。Pages。
37:03
第二个。好,第三个。第三个是什么呢?Shak下划线。配置里面的什么是吧。啊,这是第三个啊,第四个它可以可以什么呀,在这个操作过程当中,它可以处理啊。它处理什么呢?处理直接回收。可以这么做啊。直接回收。那么它除了这个直接回收以外,它也可以什么。它可以将什么,将不可什么呢?将不可释放的液进行回收到什么LRU链表里面去。
38:05
他也可以这么做啊。哎,他就这么一个思路啊。这就是一个过程。那么大家在实际啊。应用的时候多研究一下就可以,这个并不难啊。OK。那么机体这个内核的掩码设计是不是在后面啊?你可以找到什么?找到这些相关函数直接回收操作是不是?就这么个函数啊,大家注意。那么它执行什么呢?你比如他执行这个页面回收,是不是执行页面回收就必须调用这个了,看到没有。
39:04
就专门有个什么呢,举个she page这个list,你看用这个函数中间这了啊。调用它是不是,调用它之后你要检查什么呢?检查是否必须要保留这个液,但是这个液呢,你要看它是否处于什么呢?嗯。他是否处于这个什么。在回血过程当中是不是等等啊,它有很多参数进行配合,它并不是单个的。啊,所以啊,那么今天晚上啊,这个课程啊。页面回收整个过程我全部都给他讲解完毕了,是不是哎,有任何问题,大家可以通过什么呢?QQ啊啊和微信啊,跟我进行进一步的沟通与交流,那啊课堂的资料是不是我应该准备好了,那么这些相关资料大家呢?直接什么直接找秋香老师就可以了啊。嗯,秋香老师的QQ是二二。07032995,那么今晚的课程,那我们就到此结束了,是不是啊。
40:05
我们啊,下一次课啊,再。
我来说两句