00:00
那咱们接下来呢,学习新的一个章节啊,这张呢,咱们来介绍一下系统的进程,系统的性能,还有计划任务,那这章内容呢,是我们以后工作中也是经常面临的问题在。后续呢,我们经常会用到一些工具,了解当前系统的运行状态,比方说你的主机上有多少进程,他们占用的资源如何。不仅有进程问题,还有内存使用情况,包括磁盘的IO情况,还有网络的IO情况,这些呢都是我们在工作中经常要关注的点。
01:01
如果这些对应的指标超出一定的。标准啊,阈值,比方说我们经常给大家举的例子就是磁盘空间。我们就应该及时的采取一些行动。那么,如何来实现这些资源的查看、控制?那这是我们这章要给大家介绍的。那当然还有一个呢,叫计划任务,这个好理解,就是定期执行。所以这章围绕的内容就这么多啊,那下面咱们就来展现给大家来介绍。那在这部分呢,我们先来看一下和进程相关的一些概念,包括和Linux他工作流,工作内在机制相关的。
02:00
一些内容,这个对于我们理解后续的工具的使用是很有帮助的。但是接下来我们会介绍大量的用户工具。这些工具很多和进程和性能有关,有的是管理进程,查看进程,有的是查看啊磁盘O啊,查看CPU,查看网络这些。这些工具都是和性能相关,最后一点呢,我们来说计划任务。作为一个Linux来讲,它是一个超级懂。它的核心功能我们已经前面讲了很多超级懂核心功能,比方说大家前面学习的。网络管理。包括文件系统的管理。啊,包括一些权限安全控制。那今天我们进入到另一个话题,就是关于操系统的另外一些功能,比方说进程管理,内存分配对吧?那么有一个每个进程运行它不要消耗内存吗?你怎么分配内存呢?啊,这个很重要,这是任何一个操系统必备的技能,必备的功能属于基本功能,操系统Windows也是这样的。
03:24
那在我们实际工作中可能会遇到一些。故障,比方说有一个程序突然停掉了,虽然说Linux它的运行已经相对Windows要稳定很多,但是也不可避免的出现说,哎,有个程序跑着跑着,诶突然没了,突然停了,这也是正常的啊,这个Linux虽然稳定,也不是说他不出事啊,所以如何来把控这些进程的执行,如何监控他们,如何能让他们更好的跑起来。并且能够提供更好的性能,这是我们应该要掌握的技能。
04:00
所以这章我们就围绕着这个话题来给大家慢慢解解释。首先大家应该知道,最早我们讲计算机基础那部分,实际上我们应该提到过,在计算机里面处理这些所谓的程序,它都是把它加载到内存里面,但是加载内存里面只是说暂时放在内存中,真正处理还是靠CPU处理的,是不是啊?那你在磁盘上有一个程序,有一个文件,比方说我装了一个MYSQL也好,装了一个小软件,比方说哎,装了个老司机软件SL是吧?哎,开火车的我装完以后我得运行它,那么这个运行实际上就是把那个SL那个程序从硬盘加载到内存里,对不对?但是加到内存里它就运行起来了吗?不是,它要真正运行是要靠CPU来运行,而也就是说要把SL的这个程序代码要加到CPU里面,真正运行是在CU来运行。
05:00
那内存只是个暂时存放的地方,它是一个中间,相当于一个中间存放,临时存放的一个区域。啊,有人说那不靠内存,直接从硬盘交给CPU行不行啊?不是不可以,但是都知道硬盘和CPU的性能差别太大了,已经没有办法直接对接了。啊,否则的话,CPU在那空闲的要死啊,内存还在那吭哧吭哧干活,等的时间太久,所以我们需要有一个磨合,它中间一个速度差,加个内存,让内存速度比硬盘快了很多。当然对于我们来讲,我们都知道电脑上CPU,一般家用电脑不就一颗CPU吗?啊,当然服务器上可能会双核啊,四核,甚至有八啊八颗CPU啊等等都有可能。但是再怎么着,那你的CPU个数总是有限的。那么假设就一颗CPU。
06:01
那一核CPU,但是我们在计算机里面似乎同时运行了好多程序啊。比方说我现在上课我开了好多软件,大家注意到,你看我这个VC开着,腾讯课堂开着,我这录屏还开着,马克娜还在这看着,那大家感觉,哎呀,这个电脑上怎么好像同时跑了这么多软件都在运行,对不对,那它是怎么实现的?那就像一个人一样,那一个人你能同时做好多事吗?双手互脖这种事情通常不是一般人能干得了的,是吧?啊啊,这是奇人大部分是做不了的,那所以对于CPU来讲,他也就是一颗CU,他不不可能把这些事都干了,那他是怎么实现的,那就是靠CPU切片,他把这个时间段切成特别碎的小时间片。啊,我们假设就切成十毫秒一个时间片,我们把一秒钟切成十毫秒一个小片,大家想就切成了100个片片是吧,100个片,我们现在我在电脑上假设就跑了十个程序。
07:09
啊,假设啊,假设跑了十个程序,我们如果按照均匀分分配的情况下,我就可以这么干,我把这个第一个时间片来运行第一个程序,第一个时间片一到,马上就把这个CPU交给第二个程序来运行它。第二个程序占第二个时间片,那么这十个时间片过去,也就过去了100毫秒,对不对,那么100毫秒过去以后,下一轮来了,我又接着开始运行第一个程序。大家想100毫秒对人有没有感觉,人可能这种感觉是比较迟钝的,他没有什么感觉,所以对于计算机来讲啊,它就可以快速的利用这种切换的方式,让用户感觉到多个程序在同时运行,事实上并不是真的同时,这是一种伪同时是吧,因为它切换太快了,就感觉好像在同时运行式。
08:05
啊。啊,这就是咱们时间片的逻辑,当然了,最终表现成大家看就是这个样子,你看它这个切成我们这有三个程序啊,第一个时间片给第一个程序运行了,第二个时间片运行第二个程序,第三个那就轮轮着来,哎,所以就最终。感觉好像是三个程序在同时一体。那么接下来呢,咱们就来给大家说一些和系统。工作机制密切相关的一些概念,比如说第一个进程,进程英文单词process。Process进程和程序程序翻译成program对吧?哎,Program,程序程序和进程,这是两个不同的单词,那他俩本身也不是同一个含义。
09:02
程序大家可能说,哎,那我电脑上装了个程序。那么你电脑上装了个程序,并不代表着你要运行它。你看我电脑上装了这么多软件,我装了office啊,我还装了QQ,但是QQ我没启动,没启动,它仅仅是磁盘上的一个文件而已,那么它要运行起来,它就需要把它加到内存里面,最终要加到CPU里面去运行它。所以如果要真正运行起来,我们就称为进程。没有运行的,那只是一个磁盘文件而已。所以咱们在手机上有很多人说,哎,我的手机上装了好多软件,如果你在手机上装了再多的软件,你不运行,他也不会占用内存,也不会慢。你之所以慢,是因为那些进程序给都运行起来了,运行起来以后,那当然它就肯定内存就不够了,你装多少和你运行多少两码事啊。
10:04
就跟你挣了很多钱,实际你花了多少对不对。实际上,你的钱都给媳妇花了。那就像我一样,我每个月的生活成本实际上很低,没什么特别多的这个消费品,也不追求什么奢侈品是吧,咱就吃饭睡觉打豆豆,咱们班里没人叫豆豆吧,啊啊,所以呢,实际上最终并不消耗什么资源啊。那进程,它就是正在运行中的程序,当然它就必然会消耗CPU,消耗内存。当然,对于一个程序来讲,我是可以运行多次的。什么叫运行多次呀?就是我同时打开两个,两次同一个软件,比方说最简单理解就是我打开记事本,大家看我打开了记事本,我是不是同一时间,我可以再打开一个记事本,我是不是开俩记事本,这两个记事本对应的程序是不是同一个,都是磁盘上那个notepad.i译嘛,程序是同一个,但是进程是几个两个,因为他在内存中占用了两份空间。
11:23
啊。所以进程和程序的区别,相信大家明白了啊。那么进程和进程之间什么关系?那我现在运行了两个进程,这两个进程有没有关系啊。比方说我的两个记事本,或者note,我或者markdown和记事本之间有啥关系啊,那这两个程序彼此之间苍蝇系统会把它隔离开,因为仓统不隔离的话,这两个程序同时会可能会涉及到资源的,哎,资源的冲突打架。
12:06
所以我们必须有一个中间人,有一个足够权威的中间人,把他们隔离开。让你们彼此为彼此之间不感知到对方的存在。你就以为这个世界就是你的操,我的工作就是干这个活的。操作系统会让每一个计算机上运行的程序认为你的机器上只运行了你这个进程和操系统自身,他并不知道别的应用程序的存在,他以为拥有了整个主机。你看这个概念实际上就跟井底之蛙是一个道理。对吧?哎,在井底下有一个青蛙,他以为这个世界就是天空的一小块,对吧?他以为拥有了整个全世界,就像我们每个人一样,实际上我们每个人眼睛看到的东西也是很有限,你以为你看到的就是全世界了吗?你以为你看到的就是真实存在的东西吗?对吧,你看到的颜色是红色,难道他真的是红色吗?对吧?你看到的是黑色就是黑色啊,说不定你做的任何事情有更高层次的生物存在,他会觉得你好好可可笑是吧?就人类一思考上帝就发笑是吧?就很可可笑,就跟蚂蚁所做的所谓他搬来搬去,你是不是作为一个高级人类这个生物来讲,你觉得他好可笑啊,就这个道理啊,突然我们学哲学了,哈,那实际。
13:44
实际上呢,操一种自身的工作机制,都是离不开我们生活中这些道理,因为计算机它也是人来开发出来的,它也是要符合规则的,符合逻辑的。所以它也是基于这一套理论来设计的。那么当然进程在内存中加载以后,他肯定会占用一块空间啊,那么也会分配它足够的资源,比方说分配CPU时间片,它会占用资源。
14:12
那么当然进程在操系统里面,为了加以区分,因为操系统是可见他们的所有进程的,操系统知道诶,我这机场跑了多少进程,但是进程并不知道,我的电脑上还有其他进程的存在。啊,那每个进程就像井底之蛙,而我们猜懂就像上帝一样,他掌控整个系统。当然,那上帝要掌控这个世界。那给编个号吧,是吧,哎,你是进程一,他是进程二,你是张三,他是李四,那编个号呗,方便他管呀,对不对,哎,所以进程是有进程编号的,咱们叫PID。啊,当然每个进程他有运行的环境,比方说以谁的身份运行的,是以张三这个人的身份运行呢?李四的身份运行的,他有运行的身份啊。
15:02
还有就是进程,它会占用的内存资源,包括他使用的所资源等等,都会在进程中有一些记录。当然进程它的创建是怎么创建的,比如说上帝创建的。确实是,在Linux中有一个就是用来创建进程的上帝就是谁呢?叫。这个是我们整个系统中的第一个进程,他就是那个女娲造人,那个女娲,女娲是造的人是吧?人在身人类啊,一代一代下来,小宝贝一号啥意思?郝总,你的小宝贝是谁呀?你是九月几号了?那当然我们系统中这个进程是系统中的第一个进程啊,这个进程从渗透S的这个七开始以后,哎,就改头换面了啊,换成了一个叫四分D的,当然八也是啊,这个我们看进程数的话呢,可以看的很清楚,大家看这有一个四分D对吧。
16:18
它是从左到右,左边就是上级进程,右边是下级进程,那我们看到最跟上的这就是CND。早期的时候这个CND啊,实际上它就是以内这个内进程,为什么从C7开始变成了CND呢?它怎么变的呢?那就是用软链接机制实现的。这叫偷天换日是吧,就是软链接指向CD了,所以呃,系系统一启动,诶找C以内,结果哎转到CCD去了,CCD变成了新的第一个进程,早期的时候以内的就是内的啊啊早期的啊,我这个七系统没起来啊,把它启动起来。
17:05
啊,六系统可以看一下,六系统的话,它就是真正的内。好看,这是这是这几点啊,第一个。所有的进程都是在他的基础上逐渐生成子进程以及生成。当然,父进程生成紫禁城。那么附近城一旦。死了。关闭了,那么请问紫金团还在吗?那么进程一定要关联到这个树上。相当于你这个所有的进程必须在这个树里面,如果你的负进程没了,你这个树是不是就连不上了,连不到这棵树上去了,相当于树叶和树树枝断了,树枝没了,树叶连不到树干上了。这不就。
18:00
脱离了嘛,脱离了自然就没了,所以父进城一旦消失,紫禁城自然就没了啊,除非除非,除非,他赶紧再找一个复新的副继长啊,当然这个本事也得够厉害啊,找个干爹赶紧,对吧?这个干爹不行了,赶紧找个新干爹,对吧?这个能找干爹的人肯定是非常本事大的人是吧,这不是一般人能迅速找到这个啊,当然这个是有情况的啊,这个为什么这么说是有原因的啊,那大部分情况下,我们说正常情况下父进程一关子进程就关了啊啊那接下来咱们来看一下。这个进程它。生成的时候,这个进程它并不是简单的一个进程编号那么简单,它进程实际上是一些资源的集合。
19:02
它包括进程本身的程序代码,比方说我刚才运行了notepad记事本,那么这个记事本本身的点页程序的这个程序代码就会加到内存里去啊,程序代码它就会加载到内存里面,将来我们在程序中就能看到,在内存中它要占空间。当然这个程序本身是不是要打开文件,比方说我用记事本打开磁盘的一个文件啊,比方说我用记事本在桌面上,我这打开一个。哎。那你看我这个桌面上,这是42期笔记,这个双击是不是就把这个文件给打开了,这个文件和noted之间是两个独立的文件了,Notepad是个点Yee程序对不对?这个test是另外一个文件,这两码事,这只不过用这个记事本把它的这个文件的内容是不是加载到这个里面去了,对吧?所以呢,它在磁盘,在内存中也是有两个的,打开的文件看到没?程序本身打开的文件,包括可能还有一些数据在处理,比方说什么叫数据呢?我打开记事本以后,呃,是不是有可能我在里面会写东西,但是我写还没保存,我没保存,大家想是不是这东西还在内存里,是不是还不在文件里,对不对?所以这就是数据,这不是数据,当然他肯定要占磁盘空,内存空间对吧,啊啊,那么所以一个进程。
20:36
它实际上是有很多租资源组合而成,同时这个进程它有一个干真正干活的人,这个干活的人叫线程,线程就是执行这个程序的。真正的执行者啊,我们可以把进程想象成一个工厂,或者是一个项目小组。那么一个工厂要真正运作,那里面是需要有一些原材料啊,它的办公的一些这个工厂的设备啊,厂房啊,场地啊,人呐,都需要的。
21:14
除此之外。工厂至少得有一个人干活吧,再小的工厂是不是得有一个人啊?那么这个县,这个县城就是那个人。当然,那如果这个工厂比较大一些,做的事比较复杂,那是不是就可能会有很多人,那这时候就有可能会表现为多线程,听懂了吗?就一个进程里面可能会有多个线程,但是至少得有一个线程。啊,那么多线程在咱们的系统中是可以用命令看到的,比方说这就是线程,这个花括号就是线程,听懂吧,花括号就是线程,像这个小括号,这就是进程,也就是说这个进程里面包含了这么多的线程,当然线程它也有编号,线程也有编号。
22:01
啊,这就是现场。咱们线程一个进程到底是单进程还是呃,单线程还是多线程,用这个命令可以看的非常清楚,那事实上咱们也可以用一些别的命令来看啊,那比方说我再送到八来执行,那比比方说这个吧。这个叫什么polo Kitty的是吧?Polo Kitty的它的进程编号是726,那在这实际上看到它是多线程的,那我们实际上还有个地方可以看,就是在这有一个叫POC的726 p26就是它的进程编号,然后这里面呢,有一个叫。这样的一个文件,这个文件你把它打开,在这有一个线程,看到没。写的六,这是多线程啊,多线程,当然如果说一的话,那就是单进程单线程了,明白吧?C面试的时候曾经有有人出过这样的题目啊,就是让你说说怎么判断是多线程的。
23:14
方法有很多,那事实上还可以用这个命令叫。UX。在这儿我们找到刚才说的那个。这个大家看这有一个L,这个L代表的就是多线程,明白吧,多线程。那面试题再出这种题,你是不是可以告诉他好几种方法是吧,我知道多种方法,多种方法。可以判断出来。啊,所以县城和进城之间的关系,你现在是就明白了啊,实际上刚才这个图画的已经非常明确了,县城就是工人,进城就是工厂。啊,那当然,县城和县城之间的关系,就是工人和工人之间的关系,工人工人间的关系,他们是不是有些资源是共享的?
24:07
比方说工厂里面的原材料是共享共享的吧,工厂里面的这个办公啊,或者是场所,哎,是不是共享的呀,共享的,那既然共享,大家想有没有打架的可能性啊。可能啊,一个单位里面同事之间有矛盾啊,对吧,有冲突啊,有打架啊,你要用我这个,我还想要呢,那咱俩就打吧。所以线程和线程之间是可能产生冲突的,所以这个冲突那怎么办啊,那就得开发者写好代码,避免他们产生冲突,这个程序员就要负责好了。因为县城谁先执行,谁后执行,程序员是负责不了的,程序员控制不了,因为县城的执行是操级总来进行调度的。他调度的时候就分配时间片,分配时间片这个事啊,是超系统来负责的。
25:02
这个时间片到了,到底分配给哪个线程执行这个操总说了算,程序员不管了,程序员管不了这个事,所以你写代码的时候,当初就要考虑到他们之间可能会产生冲突的问题。所以写程序要避免出现这种冲突打架,所以可能在县城里面我们要采取一些加锁呀等等一些机制,来避免县城之间的打架冲突。好。当然。县城。一个县城出了问题。是有可能干扰到其他县城的。正常运行是吧。啊,比方说一个县城使用了一个资源,结果呢,他迟迟霸占这个资源不释放。是不是别的线程用不了啊?所以线程和线程之间是有可能会干扰。但是进程和进程之间有没有那么强的干扰性啊,说有个工厂倒闭了。
26:07
如果说正常情况下是不是不会影响别的工厂。是吧,当然我们说前他两人的进程之间是没有关系的啊,你别说有什么这个,呃,有这个企业之间是有合作伙伴的啊,华为要倒闭了,估计相关的小好多小公司都得倒闭,因为他们都依赖于华为的生态圈,是吧。相信大家明白啊,那总之进程,进程之间是隔离的,刚才我们也强调了,甚至每个进程都不知道别的进程的存在。他因为主机里面就运行了,他和超一动自身就他俩人啊,就这个意思。但是县城和县城之间就没那么强的隔离性了。所以那由此就有这样的问题,就是当如果有些软件运行的时候,它是多进程方式运行的。注意有些程序它是以多进程方式运行的啊,你看在这我们是可以有的时候是可以看到多进程的程序的。
27:07
那看有没有多进程的程序啊。啊,暂时这两面没有啊,不过六上面应该有啊,六上面我找一个,哎,你看这些件是多进程。大家看这是不是有一个负进程,它是不是开了三个子进程,这不是线程吗?不是线程啊,但实际上你要说里面有没有线程,有,因为一个进程里面至少得有一个线程,因为它就一个线程,所以他就不说了。啊,如果是多个的话,有花括号对吧。这就是多进程,多进程当然这里面请问大家一个问题,这个进程死了会影响他吗?不影响,因为进程和进程之间是隔离的,隔离的非常好啊,当然你要说这个进程死了,影响不影响他,那肯定是影响的,对不对,那父进程嘛,对不对,它是依附在附近程这个树上的,它要完了,他没数了,没有着落点了,那就完蛋了啊。
28:05
好,那这是咱们给大家讲的啊,这样的一些概念啊,啊这个概念呢,比较抽象啊,那么事实上咱们里面还有一种叫携程啊,携程呢,这个和开发语言有关啊,它甚至比线程还要小,这个概念呢,将来如果你们深入的想学习一些别的开发语言,比方Python里面有携程啊,有的语言里面可能不怎么提这个携程啊,所以这个开开发有关携程的这个控制是由程序员负责,程序员可以有权利控制它什么时候运行这个携程,什么时候运行那个携程,而进程和线程的执行,程序员控制不住,是操一统来进行调度的啊,记住这一点就形式啊,操作系统负责。那刚才我们说过这个了,我怎么知道查看一个进程里面有多少个线程,这是刚才我说过的,这呢,就是它那个进程的编号,知道吗?进程的编号。
29:06
那么每一个进程在内存中都要占用空间。占用资源,在操纵里面,它会有一个数据结构,描述了进程的原数据,就是它的属性信息,那么这个每个进程它的数据结构描述是靠这样的一个结构,叫任务列表,叫task list,这是个双向列表。双向列表就是我指向下一个,下一个指向我,我们俩之间挨着,哎,所以它这有两个小指针,看到没有,你指向我,我指向你,咱们挨着。就写一个书一样是吧,把它们连起来了啊,有那个挂钩把它们勾起来了,那么其中每一页就是这个每一个方框,这个每一页它记录的就是一个进程的,那么另一页就是另外一个进程,这是四篇纸,四个页那就存放了四个进程的信息。
30:02
那么每一个进程它描述了它的属性信息,都放在这个页里面啊,这里面包括什么呢?包括比方说它的优先级,包括它的进程,包括他的副进程,包括它占用的资源等等等,都在这个页里面存着,那这里面呢,就详细的描述了每一个进程它的信息,当然他描述一些信息有的可能还不足以描述的很清楚,所以他通过指针指向到它的另外一个区域空间。啊,比方说它的进程的基本信息。啊,进程的这个内存情况,包括进程的绘画,包括当前的使用的资源目录,包括还有其他资源,啊,所以它实际上是组成了一个复杂的数据结构,来描述一个进程的信息。那么这个完整的这个整个整体呢,咱们就称为PCB啊,叫进程控制块。啊,这一大块就叫PCB。
31:01
这里面就描述了很多和进程相关的属性。啊。那什么每个进程都有状态,它有进程编号,有优先级,他这样的内存,它使用的文件有什么等等等吧,这都在记录在里面,那事实上咱们要看一个进程的信息,实际上也比较简单,都在哪呢?都在PC关于这个进程的里面,它有每个进程都有一个自己的文件夹。啊,大家看这个每个进程它都是以数字。来表示的,比方说一一不就是那个CNB吗?那么这个一呢,它里面有一个文件夹,这里面放的就是和这个进程相关的所有信息都在里面。都在里面。啊,那么其中这一个点EE,这个EE呢,是个软链接,就是记录了该进程对应的程序的名称。
32:03
对应的程序名称啊,所以实际上呢,比方说突然你在电脑上发现了一个程序啊,很占CPU。占用了大量的CPU,那么这时候你的电脑可能被人啊,植入了什么挖矿软件了,是吧?啊,你的电脑被人挖矿了。他占用了很多CPU,现在你能看到这个程序的名称。但是不知道他在磁盘在哪,那你要找到这个磁盘文件,是不是才能把它删了是吧?那这时候怎么办呢?看PID啊,这不有个PI吗?这个PID不就那比方说7724724,我不知道到底是谁,那怎么办呢?刚才说了PLC724EE好了,找到它的磁盘文件了,把这个文件删了或者怎么样的就行了,不过有的时候你删也不不一定能删,因为什么呢?你即使删了。
33:05
他这个程序并不是说删了就完了,他有别的程序你没发现,他有一会会自动创建。所以呢,有一个方法可以彻底的把它删掉,不是删啊怎么做啊,你给它把它清零。你把它清空了以后知道吧,你把它清空了以后,这个文件不是大小为零,但是他一看这个文件在它就不会重新生成,那之间是零了,它也就执行不了什么东西了。啊,当然这是一个临时性的手段啊,至少他不会占用你的CPU了。对吧,当然最终的解决方案你还是要找你的系统为什么被人植入木马对吧,你肯定是有漏洞的啊,比如说密码是不是简单了啊,最好的方法最好重装嘛。另外说不定在里面除了你看到的东西,还有你看不到的东西藏在后面是吧,木马程序,木马程序。所以以前也面试出过这样的题目。就是问你说有一个CPU利用率很高的进程。
34:02
请你找到它,把它处理掉。刚才已经说了方法了,看吧。嗯,啊,这些实际上都是面试里面动不动就出这种啊,很简单的题目,大家知道了就觉得很简单,没什么难的。好了,这是刚才给大家讲的。那当然进程呢,实际上存放在内存中,那么内存分配空间给进程它是怎么分配的呢?是通过一个叫页的单位来分配的,这个页呢有点像我们磁盘给文件分配空间的概念,磁盘里面给文件分配空间叫什么?磁盘空间给一个文件,新创建的文件要分配空间,最小单位叫叫块。啊,比方说4K一般用4K嘛,啊,那也就是说我们说过块是给文件分配的,最小的是基本人权,你得给4K啊,不能少于4K,你不能说俩文件共用4K,这是没有人权的表现,必须给至少4K。
35:14
啊,用不了也要给4K啊,这不说过的事吗?那么在内存中它也叫4K,不过他不叫这个块,它叫页,它叫配置,叫叶,换了个名字。也是4K一般都是4K,这个呢,你要想确认,你就用这个命令看,这个命令能看到这个叫配。啊,这是可以看的啊,你要是想了解这个页到底有多大,那这就能看到叫page size。比赛。那我刚才用的这个命令啊,它里面记录的就是你当前系统中的各种指标或者宏定义,宏定义。那这里面有很多。像很多。
36:01
好。现在每个程序运行,他认为自己拥有所有的内存空间。但实际上操系统肯定会只会分配它其中一小部分内存空间,所以这就产生了两个概念,一个叫虚拟内存,一个叫物理内存。所谓虚拟内存,指的就是应用程序眼里面,他自己认为自己的内存空间。刚才我们也提到了,每个应用程序认为自己拥有整个主机。假设32位的操一桶来说,32位的操一桶,理论上最大的内存空间就是二的32次方多大呀?32位的测绘桶,它支持的最大内存就是二的32次方。多大呀,四个G的内存,四个G的内存。
37:00
而四个G里面有一个G给超系统自身留着,就是超系统内核留了一个G3个G给应用程序用,而每个应用程序运行的时候,他以为拥有三个G的所有空间。这就叫虚拟内存。那么它运行的时候,我就认为是这三个G都是我的,哎,从000开始到什么三个G,这都是我的。当然,他。客观的乐观的认为拥有三个G,总当然不会傻乎的给他分配三个G,操总给他分配一个你现在急需要马上用的空间,你现在用一个用一兆,哎,我就给你分配一兆,剩下三个G让你看到三个G而已,并不是真会给你,他会把真正内存中取出一块你现在急需要用到的空间,比方说就一兆,我就给你了。然后你去运行就行了。那这就是物理内存了啊,物理内存。
38:01
但是物理内存和虚拟内存肯定应该有一个对应关系啊,因为我们应用程序运行它是不是往自己认为的三个G空间中有一些地方要写数据,比方说他写到那个000那个位置要写数据,他写的话,那么对于我们的特用来讲,肯定最终还要落实到物理内存里面。那物理内存。对应的肯定不是000那个位置啊,肯定是我们物理内存中某一块地址空间,所以这就存在一个映射关系的问题。实际上我们平时打电话或者做一些事都是这种逻辑,你平时打电话打110,这个110实际上就是表示一个地地址。对吧,然后这个110是不是电信那边就给你接通到当地的电话局了,但是我在北京打幺零和在咱们这打幺零应该就不是同一个地方。是不是啊,你看到的是110,你看到是虚拟的电话,不是真实电话啊,你打110的时候,你在北京打就打北京的,你在上海打就上海的,你在河南哪就是河南是吧?那就是中间有人帮你转化成真正的物理的电话了。
39:10
那这就是背后有个转换关系,那这个转换谁来负责,我们叫MMU。这个MU就是当我们的CPU需要把数据发送给虚拟内存。啊,这个比方说有一个程序要在虚拟存里面写数据,我要写一兆的数据,那么这个写一兆数据最终要落实到物理内存里,那么这时候CPU就发了一个指令给虚拟内存,说我要写数据,这写数据呢,这个虚拟内存就到达了MMUMMU要做计算,说这个虚拟内存映射的是存内存中的哪块空间,把它做一下转换,转换成真正的物理内存,把它发送到啊系统总线,然后最终找到你的物理内存写进去。啊。这个是MU来实现的,那MU呢叫内存管理单元,这个是个硬件,这是个硬件,这个硬件就在CPU里面,它属于CPU的一部分,你知道吧,CPU实际上是个很复杂的一个东西。
40:15
它里面就集成了MU,不过呢,这个MU在把虚拟存转换成物理内存的时候,它是要做计算的,是要做一些计算才能得到的。所以这个每次计算是不是要花点时间?所以为了加速,我能不能把刚才曾经计算过的东西,哎,把它存成存起来,下次就省得再算了,诶有一个东西可以做叫TLBTLB呢叫翻译后备缓冲区,说白了就是缓存就是缓存啊,就是我把刚才那个映射关系那做计算结果,它放到那CPU里面缓存一小块空间给它缓存下来,下次我就省了算了,不是提高效率吗?提高效率,当然了,你也不能永久保存是吧,你只能是临时保存,因为说实在这个程序中有停止的时候,程序停了,那这个计算结果是不是,这块空间说不定内存空间将来给谁别的程序用了是不是?所以虚拟存和物理内存的映射关系都是临时性的。
41:17
那不是永久性的啊。好,这个就是MMU和TLB这些大家作为一个了解啊。尤其等你们将来走到架构师这个级别的时候,越来越多的会关注底层的东西,现在这个级别说实在你们还实际上根本就不需要关心啊,就拿1万块钱,哪关心这么多东西啊,要要求没那么高,没那么高,但是你要将来去大厂,人家给你面试的时候还就爱问这些东西,越是大厂越爱问原理,越是大厂越问底层的东西。啊,所以你们如果想大有志趣大厂的话,哎,你们就多研究点深入的东西,但是如果大部分同学应该说还没那么高的要求的话,可以这块就听一听就行啊,听一听实际上我这也是粗略讲啊,你们要真正下来有时间看的话,可以翻一些,比方说操一种Linux的内核工作原理啊,这样类似的书,它里边写的会更加深入,因为时间所限啊,我们在这不可能展开给大家讲啊。
42:17
好,那当然我们现在来看一下用户和内核空间,那么用户和内容空间是这样,就是刚才我强调的,大家记得我刚才说了一个,说我整个四个G内存大,这是四个G内存,这四个G内存呢,它实际上是分成两块,一块呢是给内核用啊,这是内核,内核用了多大呢?用了三个G啊,这是用了三个G到4G之间,也就是占了一个G的空间。这个就是它把那个零到4G,它占了高位的空间啊,如果从零导往上走,那这是把高位空间给占了啊,留下了零到3G是留着给应用程序用的,也就是说每个应用程序运行的时候,他认为自己拥有的是这三个G的空间,在每个应用程序运行的时候,他认为自己拥有的是三个G的所有空间啊,所以他这个叫虚拟存啊,虚拟存。
43:22
这三个G的空间又可以再分,分成什么呢?分成其中最下面有存放程序本身的代码段啊,比方说那个点页义程序啊,比方说Linux里的那个磁盘文件,那个二进制的东西,它加掉这块空间了啊,那么加掉空间以后,接着有数据段,还有BSS,还有堆,还有站。那占用了整个映射到三个G的空间啊,那其中这些数据段BSS对应是什么意思啊,那我们大体来做一个介绍。代码段刚才说过了,就是那个程序二进制嘛,啊,每个程序不都有一个磁盘上的二进制文件吗?然后数据段表示的是已经被初始化的全局变量。
44:12
啊。呃,大家如果如果有C语言基础这个东西,这段代码是很容易看懂的啊,虽然不一定有C语言基础,但是大家有深厚的share编程基础对吧,我们都学完进阶了啊,你们应该是老司机了,所以呢,这段代码大概也能猜到什么意思。这个include是包含的,意思就是有的时候我们并不是一个文件就能搞定的,我要依赖于别的文件,包含别的文件。这个就是变量赋值,这个呢是声明变量,但是它没赋值,这个变量不仅声明了,而且变量赋值了,这个呢,就是那个初始化的全局变量,听到吗?哎。那么它这块空间就放在哪了,就放在数据段里了啊,所以大家可以看一下,你看这有个小箭头是不是放在这个初始数据段里了,看懂了吧啊。
45:09
啊,那除了他。还有就是BSSBSS呢,这个名字翻译过来有点不好翻译啊,叫什么呢?叫以符号分开始的块啊,以符号开始的块,所以咱就别翻译了,就翻译过来感觉不伦不类啊,就BSS得了,BSS存的是什么呢?存的是程序中未初始化的变量,啥叫未初始化?你看这个变量是不是就没有初始化,它没赋值啊,光说哎,它是个整数,啥也没说,所以这种呢,它就放在这个BSS里了,听了吧,就放在这个BSS里了。那这个是高位地址,比方说这是3G的内存,这是零位的00G的零的内存吗?这不是我们刚才说的那个啊,那么再往上叫堆,堆存放的是对象啊,对象比方说典型代表就是数组,咱们刚学过数组。
46:12
哎,那将来你们将来可能还要学一些开发语言,比方说将来学Python啊,将来可能会接触Java呀,知道Java里面有对象,哎,这就对象放在这。对。它的存放机制是存放大数据的。他的数据存放的空间。可大可小,可以动态的扩张,也可以动态地缩减。还有一个呢叫站,站在最上面,看到没有站。这个这的英文单词是。看。在他和对的工作逻辑不一样。
47:00
这样它是有数据性的。这存放的是什么呢?是程序中临时局部变量啊,什么叫局部变量?大家看这是一个函数,这函数里面是不是有一个局部变量,那么局部变量就放在这个占领去了啊。放到站里去。好,那么这它的存放机制是基于后进先出机制,后进先出机制,哎,它和队列相反。战和队列这两种机制是不一样,队列就是排队嘛,站呢是后进先出,而战呢是先进先出,形象的形容一下。战是喝多了,喝多了你知道啥意思吧,队列呢,是吃多了,知道结果不一样吧,喝多了你喝酒喝多了你会怎么办?是不是吐啊,但是你吐的时候是不是后吃的先出来,是不是就是先吃的那后吐出来,虽然有点不好听吧,就这个道理对吧,队列,队列吃多了,你吃多了你会怎么样,吃坏了肚子了,你跑厕所先出吃的是不是就先出来是道理吧,一个从上面出,一个从下面出,这就是两个不同的术语啊,所以你就记住了,是吧,一个站一个队列,这工作逻辑不一样,好,这是刚才给大家讲的啊。
48:53
是的。啊,这就是站先后进先出,这叫压债,所以为什么叫压债,把这些压进来,再从上面这原来地方再出去压站,压站就是进来,它就出站,就是再出来,哎。
49:17
而这叫last in first out,近战出战,近战出战啊,有点像一个一个这个啊,一个袋子里面放东西,或者一个箱子里面放盘子之类的啊,你先进去的就后拿出来,嗯。啊。这是刚才说过的是吧啊。那么内存在自在系统中最容易出现的问题就是可能会出现以下的这些现象,这些现象概念上实际上并不一样,不过好多人在描述的时候,他们混为一谈了。
50:07
第一个叫内存泄露,第二个叫内存溢出。这个内存泄露,内存溢出,在不同的开发语言里面,他们不同的程序员对同样的称呼,它的含义不一样。这些概念实际上最早是来自于C语言开发。后来加了程序。也用到了这些概念,但是含义不一样。所以你将来和C语言开发人员和Java成员说这两个概念,他实际上说的都是可能不是同一回事。所以你在网上看这些概念的时候,你可能就会产生混乱啊,有时候有人这么说,有人这么说就是他语言不一样,他的称呼上实际上说的不是同一回事,我这个说法呢,是基于C语言,因为最早这个概念是从C语言来的啊,内存泄露说的是什么呢?内存泄露是当咱们应用程序分配了,给这个资源分配一块空间啊,像C源用这个来分配内存空间,在Java里面是用new来分配空间。
51:14
结果不释放。不释放就导致程序大占的这个内存,你想这个内存永远不释放。那他不就一直占着吗?那如果这种现象,每次运行程序它都这样,每次运行程序它都这样占用内存时间,一日积月累,所有的程序内存是不是都用光了,每个运行都不释放内存。造成内存资源用光,那在二年前我曾经就见过有程序员这么写啊,我们单位有一个程序员,他写了一个网站的访问程序啊,我当时一看,他那程序写的就是连接数据库,连接数据库要创建一个对象,他必然就会申请资源。
52:04
申请完数据库,他要访问数据库,从数据库里面读取数据,写入数据,那么这个数据用完了,正常应该把这个资源释放掉,结果他没有释放,当时那个服务器那时候还没有Linux,不是说没有Linux,就是那时候Linux还不流行呢,因为那时候还是家里玩的。不能在生产中用,20年前你想2000000年,所以当时我们用的什么服务器,是微软的NT,微软的NT4.0,那时候啊,NT4.0啊,所以那个服务器我们跑到一个月的时候。内存就不够了,好像不止一个,不到一个月就俩礼拜吧,好像俩礼拜的时候内存就满了,内存就满了。后来就当时就很多人就抱怨这个Windows不行啊是吧,很多人的意概念里面不就说Windows老崩溃嘛,动不动就慢了这了那了,实际上是程序员干的,和人家Windows没关系。
53:04
啊,后来我看到他的代码以后,就反馈了我给我们那个。开发的总监啊,那时候我是也是个小小的程序员啊,后来把这个代码改了以后,就不是一个礼拜俩礼拜重启了,一个月重启了时间延长了好一些嘛,当然可能还有别的地方我没看到,那反正我身边有一个程序员就这么写。啊,所以这就是内存泄露啊,内存泄露。但是内存泄露这个东西也好观察,那你就观察你的内存,正常情况下咱们系统内存可用空间应该不会说,哎慢慢的个越越越慢,越来越慢,是不是达到一定的阶段就稳定了不变了,如果你发现内存诶每天都涨一点,每天都涨一点,可用内存越来越少,越来越少,那你就有理由怀疑发生了内存泄露是吧?哎,终究有一天内存满了嘛,内存满了不就那只能重启了啊,你得找到那个程序是谁。
54:04
找到那个程序啊。当然,那么找到内存怎么找,那事实上刚才我们看这个东西就可以看这个文件里面就记录了这个进程占用的资源,那这里面记录了他使用的各种资源,那其中也包括他将来内存分配的一些信息,我们后面呢,会给大家介绍,就是如何来观察一个进程占用了哪些内存资源,哪个地址段到哪个地址,它占你将来就可以观察它了,说它占用内存有多大,然后你过一段时间你再看看它是不是又加了一些,过一段再看看它老在这涨不到一个维持稳定状态,那说明他肯定就发生了这样的现象。啊,还有就是内存溢出,内存溢出这是尤其C语言程序员经常发生的事,C语言它最大的好处就是它知识指针非常灵活。
55:05
它的缺点也是指针太灵活了,导致很多程序员无法很好的控制。那么造成内存申请了十兆,结果呢?他在这个数据空间中写入了更大的数据,比方说我申请了十兆,结果存了20兆的数据,那么多出20兆来,多出20兆来,他生要往十兆里写,他写不进去啊,写不进去只好把旁边的空间。战。啊,那你想旁边是不是别的程序占的地方,你是不是相当于把别人的空间给写了,你自己的数据是不是就干扰到了别的程序的运行。造成程序崩溃。溢出这种攻击也是一种黑客喜欢用的攻击方式,如果我们的程序控制的不好,他没有安全的去做内存空间的检查,很有可能内存溢出。把旁边的程序的空间占用了。
56:00
这样的话,是不是间接的让你自己写的程序运行在别的进进程使用的内存空间里面去了?如果别的内存空间恰恰是以入的身份运行的,那是不是就意味着你就间接的获取了root的权限?这就是内存一出就可以攻击你的系统啊,骗取你的系统的最高控制权啊。当然这个内存溢出呢,是程序员他没有做安全编辑的检查啊,没有控制空间的大小造成的,这是编程的漏洞。好多早期的程序,包括现在仍然还有一些程序,可能会带有内存泄露的溢出的这种漏洞。是黑客特别喜欢的一个缺点。那么在Java程序员里面,一般来讲是不存在这种内存溢出的。为什么呢?因为加了内存分配。它分配多少就是多少,你也超出不了,因为它加了程序里面自身有这个功能,但是加了程序是容易造成这种内存泄露的。
57:06
就是呃,但是这个Java程序啊,Java程序这个内存泄露这个问题啊,是这样的,他申请了个内存,它不释放,不释放的话,这个倒也还行,为什么?因为在Java里面它有一个自动回收垃圾机制。它可以自动的去发现说有一块内存没人用了,没人用了他就给你回收了,所以这个问题实际上在Java里面也不会出现。Java程序里面一般也不会出现。但是Java里面会出现这种情况,就是内存不足,叫OM啊叫OMOM说的是什么呢?就是这个程序把所有内存全用光了。所有的程序用光了,因为Java是特别占内存的。尤其Java程序员,他对内存的控制来讲,不像C语言那么敏感,C员一般做程序员的C语言的都是开发高手,他会精确的把控占用内存空间,因为分配内存他是在负责的,而Java里面呢,通常来讲不太关注这个事,是由Java虚拟机来负责的。
58:12
所以就容易造成它大量的身体内存,结果内存不够了,把内存用光了,造成o mom呢,就是我们说的超出那个这个大家见过这个界面。是不是前两演示什么东西来着造成的,是不是我们编了一个嵌套死循环的脚本对吧?啊,那个那个那个脚本叫什么来着,叫什么来着啊,就是自己调自己吗?啊自己调自己,那那个那个小程序叫什么名字来着,Fork炸弹就是fork炸弹,就是不断的申成申请内存,不断的申请内存,直到把内存消耗带进OM。
59:01
这个是程序C语言容易出现的啊,这个不是C语言,就是Java程序员容易出现的。出现这种情况那怎么办?出现这种情况呢,在linu内核里面会自动发现内存不够了,那内存不够了,那那有些程序要运行啊,那怎么办呀,那总得总得有内存空间吧,那他这就会会找人杀啊,找一个进程杀了它,杀出空,杀了他不就省空间了吗?就可以腾出点空间来杀谁呀,不知道,呃,随机杀当然不是随机杀,对我们人来讲觉得是随机杀,对于苍勇来讲,他有背后的算法,那他会选择一个合适的人干掉他,但是对于我们人来讲不可控,我也不知道他干啥。啊,他背后有一套数学算法来杀掉,所以这时候呢,你会发现有个进程被杀了啊,当然杀掉的进程也许恰恰就是你正好工作中非常重要的进程,比方说数据库。
60:03
数据库特别占内存,按照内核的计算公式,越占内存他被杀的几率越高,所以他就会可能会真的把你数据库干掉了,啊,数据库干掉了,那你这重要的服务那也停了。所以这个就是容易出现的问题,越重要,越占内存,他越傻。阿志就是O。所以实际上在Java程序员里面,他们有的时候说内存溢出,实际上不是内存溢出,真正的内存溢出是把内存用光了,用超出了他该有的空间,这个不是Java程序负责的。Java程序员口里的溢出实际上是OM,是内存不足。啊,所以Java程序员再给你说内存溢出,你就跟他说了,在C源里面不叫内存溢溢出,这顶多叫OM,这叫OO和内存溢出不是同一回事,Java不存在内存溢出的情况啊。
61:09
你存在的是我。当然,那么之所以Java程序员会这么说啊,就是因为他想申请。比方说你这个物理服务器是八个G内存,他想生成十个G啊没有啊啊没有那么多,所以就感觉好像是内存溢出了,因为他申请是是是申请十个G,我这只有八个G,他要非得要把这个内存不够的这块八个G的空间非要生成写十个G能写进去吗?写不进去最终就导致OM了吗?啊,所以程序员就加了,程序员以为是内存溢出了,根本啥叫溢出,它是内存不足了,明白了吧,所以加了程序员误认为这叫内存溢出,实际上不叫无损内存溢出,这叫内存不足。
62:05
啊,所以以后你跟Java程序员就可以聊天了,是吧,所以你不要说这个内存溢出,你是不专业的表现,你那个叫OM不叫Java不叫内存溢出啊。纠正一下他的错误观念,我觉得好多程序员是这么认为,这么认为。两个小时。有的时候你需要表现一下你的专业性,要不他会经常欺负你啊,Java程序员他们做程序开发,他们更懂得一些程序的底层逻辑,我们认为呢,更多的是关心的是面一些工具的使用,所以有的时候可能深度上确实有些地方是不如他们强的啊。啊,但是有些地方你比他要强,至少对整个架构的理解你要比他全面啊,各有所长,但是好多程序员对运维来讲,肯定还是心存鄙视的,不,有一个鄙视链啊,鄙视链对,就Java c员的程序员鄙视Java的程序员,Java的程序员鄙是谁呀?比鄙是PP的程序员是吧?PP的程序员鄙是咱们做运维的吗?
63:23
那咱们运维鄙视他们所有有啥鄙视的呀啊,大家都是给老板打工的嘛,有啥鄙视的呀,谁工资高你就鄙视你工资低的这行是不是。啊,话这么说啊,咱们实际上都是分工不同啊,协作的也谈不上鄙视啊,咱们互相尊重是吧?岗位没有尊高低贵贱之分啊,我们各负责一摊就好了。
64:06
好,这是刚才给大家讲的啊,给大家讲的啊,当然这个出现这种问题啊,尤其这个OM,那么怎么解决OM呢?在Java里面实际上出现这种问题,最大的问题呢,就是。最大问题,那有可能他程序开发的不不对,占用了比较大的内存,当然也有可能是内存真的不够,那他的数据量真的大,它真的要需要这么大内存,但结果呢,你的内存不够啊。啊,所以出现这种问题要综合分析,那么解决方案呢,就是我们要优化内存的使用。这个OM它并不一定是真正的整个物理内存不够。因为程序Java运行的时候,它在虚拟机里运行,虚拟机给每一个Java程序运行,它是分配了其中一块内存空间,这个内存空间如果不够,它就会出现OM,而并并不意味着你整个物理内存真的不够。
65:10
啊,这就是贫富差距。我们都知道,生活中很多人穷的要死,饭都吃不上,有的人富得流油。那实际上整体全世界来讲,均匀的看这个资源应该是够的,但是为什么有人饿死,就是因为分配不均是吧,在他这真的一点没有啊,那OM说的就是这个情况,那Java程序他恰恰他使用那个空间真的不够,那怎么办?那我给他这块空间给他扩大一点不就行了吗?那这个就涉及到Java虚拟机的调优,我们后面讲他们看的时候会讲啊,这个要调优的情况。当然确实也可能是真的内存真的不够用啊,你分配再大他也不够啊,那是物理内存不够了,你就多分点,那这里面呢,有一些内核参数,他可以来控制内存的申请情况。
66:04
那么出现OM的情况就是他去尝试申请更多的内存,那么操系统呢,有的时候会用尽可能给你分配,操系统有一个特性,就是你申请多少,他尽可能于答应你,比方说你申请我的物理内存是一个G,你申请一个G。我也答应你,当然我所谓的申请并不意味着你马上需要啊,有的时候大家都知道,生活中有时候我们想买个房子是吧,买房子,你买房子之前,你肯定得提前跟别人打打声招呼,说我要买房,我可能过一段时间想跟你借钱。那这个时候呢,实际上就是一种申请请求的过程,这个申请,哎,你说我要买到100万的房子,这个100万的房子很便宜了已经是吧,哎,我借个10万块钱,跟好朋友借个10万块钱。
67:01
那借10万块钱,你就提前跟人打招呼,你不能说现借现要是吧,提前打招呼借10万,当然这个如果是好朋友的话,他可能会答应你是吧,10万块钱没问题,答应你。结果过了两天,你真申请的时候,真跟他要的时候,哎呀,这现在真没有那么多,当时答应你的时候是有的,现在过了两天不一样了,我这个现在我也买房了,或者手上正好有一个支出,把这钱花出去了,当时答应你的真的拿不出来。这是有可能的,对不对啊,这有可能。啊,所以呢,这就是曹一总工作的逻辑,曹一总当时会答应你,但是真的你申请真要了,他没这么多了,就造成OM啊,造成了M。那么这个内核参数呢,有这几个是和咱们这个密切相关的,那其中我们看到这有一个叫over commit memory。
68:01
啊,还有就是over。VI还有个panic on OM,那么这些值,这些都是变量值啊,这些变量值都是什么意思?那下面有介绍。啊,比方说这个vm panic2mo这个值是多少,咱们可以看一下它的值,这是内核里面的一个参数啊。大家看它现在值是零。它的值是零,那值零什么意思呢?就是当出现OM的时候,会触发O的ker。啊,啥意思啊,就杀人呗,杀进程嘛,这是默认值啊。但是如果你把它设成一,那就意味着。在有一些条件的情况下。他不考虑。Panic,而启动ker在某些其他情况下就会触发内核的panic什么意思?Panic就是系统崩溃,重启就是如果发现内存不足,在有些情况下他直接内存机器就重启了,你想电脑都重启了,那自然内存不也就释放了吗?
69:18
当然这时候那你都重启了,不就整个系统就崩了吗?相当于对吧,当然崩了,那重启之后它不就恢复了吗?是吧。数据肯定就没了。那所以呢,这就看你考虑了,你是愿意插发现杀进程啊,还是愿意触发内存重启重启啊。但是第二种呢,就是不管什么情况下直接重启了,只要发现内存不足八直接重启。这更彻底啊,第二,它的值如果是一的话,它是部分条件下OM触发杀杀进程,部分情况下去重启,而零和二一个是杀进程,一个是重启,就这意思。
70:01
当然,你觉得哪个好啊?零的话呢,就是杀掉一个进程咱们。最起码不会重启,因为重启就全没了啊,那杀一个先试试,万一杀了一个能缓解一下,这不就也行嘛,是吧,那这拆东墙补砌墙嘛,是吧?哎,先先能顶过去就先顶过去嘛,哎,你实在是没内存了,那我们就挪出一块空间来,杀一个杀一个,腾出一点内存来。来,顶住顶住,如果实在顶不住了再说呗啊。那这个还有一个over commit memory over commit memory呢,它的值我们也看一下,它的值是默认值是多少,默认值也是零。那这个零说说的是什么意思呢?说的就是如果发现内存不足。
71:00
啊,那么,但过于明目张胆的over commit会被拒绝,什么意思啊,就是说你当我你向我申请内存,你申请内存可以超分,比方说我的内存是一个G,结果你向我申请了,呃,1.5个G,我的内存没那么大,但是只要在一定的范围内,我还是允许你的。比方说你申请1.5个G,我也不会拒绝你,因为我有swap分区对吧,我SW分区还有两个G呢,我SW分区两个G加物理存一个G,是不是我对外可以宣称三个G啊。对吧,所以这时候我们也可以接受,也可以忍受。啊,但是你要太超,太过于超明目张胆,比方说我内存才一个G,包括两个G,你给我申请十个G,我哪有那么多,那直接就把你拒绝了,那只能这么拒绝你了,对吧?哎,那一的话是什么意思呢?一个就是允许超分,来者不拒,啥意思,我物理内存一个g swa32个G加起来三个G,你申请十个G,我也答应你。
72:05
反正是答应了,答应没有了再说呗,你向我借钱没问题呀,借多少我都有,真申请这要了我没有嘛,对不对,是不是,你身边好多朋友是不是就这么干的,当初答应了你满满口答应,真让他做的时候做不了,是不是好多人确实就是这种这种做事风格,是吧?啊啊,对外好像挺豪爽,真让他干事干不了。我就不是这样的人,我真的就会拒绝你,对等西有限干不了,省得别在这耽误时间,你知道吧,因为你耽误时间,说不定人家可能还找别人,是不是能解决这问题,那你解决不了,你就直接告诉人家,别让人家心心存幻想啊,这实际上是不好不好。而二的话呢,就是禁止超分,禁止超分就是我的内存就这么大,你申请不让你申,我没不不不答应你啊,咱就别商量了,没那么多能力直接拒绝你。
73:09
我内存就一个G,你就一个G没那么大,申请不了。但是他这个地方有一个叫over commit的计算公式啊,那我怎么知段位超分,它这有一个计算公式,这个计算公式你们下来有时间可以看一眼啊,怎么计算,它这里面有一个数学公式,这这我就不去强调计算了啊,大家有时间看看它怎么算超分。啊,它有一个物理内存和SW分区的一个综合公式来算。好了,那么到此呢,咱们对这个Linux里面内存分配呀,包括进程的一些概念呢,就做了介绍,那稍后呢,我们来看一下内存的状态,那咱们休息一会,待会再来给大家说。
我来说两句