00:00
各位同学大家好,接下来我们为大家介绍高阶篇的最后一章,也是我们本次课程中难度最大、知识最复杂、要求最高的一个章节,Red为什么这么快?高性能设计之一底层函数和艾欧多罗复用深度解析。说起这个。那么在前面高级篇的第一章,我们或多或少给大家呢打开过也记它,实质而言,这小节算是一个药引子,我们当时做好铺垫说过,最后给大家进行深度解析,这只算是个入门,那么接下来我们就要对学习本章的要求做一个前置性的说明。那么下面请听好第一个,这章很难。如果你是非科班出身,也即假设你没有操作系统。即unix网络IO编程的知识,你听这章第一次听是很懵逼的,很正常,就说听第一遍听不懂很正常,所以呢,希望你不要写麻烦。
01:12
如果你真想搞懂,希望你能够听第二遍,也记本章,你学得懂的地方请你仔细学,学不懂的地方请你硬着头皮学。总之,给我把面试过程要答的东西,请你能够按照杨哥的口语化的解释跟面试官聊聊一因为这个时候他会问你是单线多线程啊?Write为什么这么快?那么首先第一个。是一种内存数据库,不像MYSQL那样的是装在硬盘上面,它是硬件上的磁盘IO和内存级别的,那么当然内存要比硬盘快。第二个基于我们前面讲过它的五大数据类型的源码底层。做了各种优化,不是哈,Table,就是什么高性能的一些数据类型,压缩列表,Quick list等等等等,那么第三一个就是我们底层。
02:10
Unix操作系统的一跑,函数的复用以及lo多落,那么这个时候请同学们要注意在这块啊,它就不是编码这个问题。对人的理解能力要求非常高,很多人说不清楚什么叫艾欧多罗妇幼,可是面试官想听到就是这么一个东道,甚至在官网上你会看到,为什么一再的跟你强调REDX100%绝对一定必须要装在Linux相关的操作系统服务器上面,你Windows装red可以用,但是100%发挥不出来red最佳的性能,那么这是为什么呢?所以在这请同学们耐着性子听杨哥认认真真的介绍这章我们会花很大的篇幅来给同学们说清楚,好,最后一次再说一遍。第一次啊,你听不懂很正常,但是希望同学们能够咬牙坚持啊,你别听到一半了,根本没有完整的听下来。哎,从理论到编码到总结,三板斧都过了,整张完整的过一遍了,以后请你再说话,你别听到一半以后说什么。周扬讲。
03:22
切什么呀,算了,关机走人。做难事才必有所得,可以这么讲,这张就是用来淘汰的。好,那么同学们,咱们来开工来吧,老规矩,杨哥,我要学一个技术。咱们呢,是不是强调这种东西叫AB法则对吧?哎,杨哥,你先别那么多废话,不要跟我讲什么叫艾欧多路负幼,你先告诉我这个技术拿来解决什么问题的,它能解决什么问题,有什么好处,我有什么收益,那么这样我才明白到底这个技术是如何诞生的,它解决了我们哪些痛点,那么老规矩,这个呢是after,那么有这个技术之前和有这个技术之后,好吧,那么假设我们先before。
04:14
没有埃多罗妇药,那么他这个要干一个什么事呢?那么同学们都清楚啊,咱们在这开一个red啊,比如说red server my red,我相信各位同学没有任何问题,那么我大家请看我这是不是就连接并set k11,我一说到这当然没有任何问题,假设我这个网络地址公开了,你可以从外网访问,那么同一瞬间可能有十个用户给我连上来,没错吧,所以这种情况下就会100%要给他强调一个东西,在多线程高并发下面的客户端跟网络服务器的。多机连接这个你是怎么解决的?
05:02
好一句话多了妇幼,他要解决什么问题,同学们请老眼。现在杨哥这有一台服务器启动了,多个客户端连上了,那么请问并发的多客户端连接,那么我们在多路复用之前就没有,你现在就不要考虑IO多路复用,杨哥你先别给我说那么深的,先讲人话给我讲懂,那么我们最简单和典型的方案是不是叫同步阻塞网络IO模型?注意什么叫同步,什么叫阻塞?说人话先老板点杯奶茶,好的,请稍等,那么这个时候我就在奶茶。柜台前面一直等着。傻逼逼的看着菜单,然后呢,奶茶的师傅,奶茶小姐姐在后台呢,厨房呢,给我做,他不给我,我不走,我在等待过程当中啥也不做好,这是第一点,此极外,请看这种模式的特点就是用几个一个进程来处理一个网络请求,一个用户一个请求。
06:13
那么现在杨哥去奶茶店点一杯奶茶,我们去星巴克点一杯咖啡,一个顾客一个咖啡师傅,没问题吧,那么好,这样的一个代码,相当于说直接调用C语言,底下有个receive函数,后面我们聊啊接受就是说我现在客户端跑去星巴克点咖啡,跑去奶茶店点奶茶,是不是跟服务器发生一段so上的连接,师傅点杯咖啡,小姐姐来杯奶茶,那么这个时候很简单,函数调用。Receive,我等着接受,接受什么呀,哪个奶茶店哎,比如说北京王府井星巴克咖啡厅,那么IP地址,端口号,用户名密码啊等等啊,后面这个省略号这么一个意思,给我咖啡点餐完毕,好,我们从用户的角度来看,非常简单一个receive。
07:03
一个用,那么要接收的数据,那么一个receive函数一用,那么要接收的数据是不是到我们这了?好,可是我们来总结一下这种方式,注意没有L多路复用啊,复用复用是什么意思啊,是不是重复的意思啊,现在没有重复啊,那么意思就是说每次都是全新的。那么讲到这儿你就会有一种感觉,我靠,我每用一个要拗一个,我每用一个要拗一个,不是不可以,弟兄们,你们觉得这好不好?如果你觉得OK的话,那你为什么要学数据库连接池或者是线程池这种技术呢?所以这种优点就是让人很理解,写代码起来非常自然,符合大家的直线性思维,反正来一个你有一个一个进程来处理一个网络连接,缺点谁能看每个用户请求到来都要占用一个进程来连接来处理,来一个请求就要分配一个进程跟他处理,各位亲。你来上硅谷学习,100%是不是一个老师是复用的?我讲完这个班,讲下一个班,讲完第二个班,讲完第三个班,讲完第三个班,讲完第四个班,我不可能来一个学生配一个老师,我去北京协和医院来一个患者就要配一个医生,可不可能?
08:17
绝对不可能,那么所以说这个进程在socket网络连接服务器这个层面,它是个很笨重的东西,一台服务器上面创建不了多少个进程,所以这种是最简单来一个单独一为一对一的VIP服务啊,可是患者多还是医生多,对吧?所以说呢,这种动作我们需要优化,那么艾欧多洛妇幼它要解决的问题就是这样的。进程在link上面是一个开销不小的动作,先不要说换减,光是上下文切换一次就要几个微秒,所以为了高效的解决高并发海量的用户,这样连接并提供服务,必须要让一个进程能同时处理很多个TCP连接才可以。咱们去星巴克咖啡厅点餐的时候,来了四个顾客,只有一个咖啡师傅,这个没问题吧,挨个叫嘛,对不对?所以说现在假设一个进程保持了1万条连接,那么你如何发现哪条连接上有数据可读,哪条连接可写呢?这个就是IO多的复用所要解决的问题的痛点和它诞生的前身。那么可以这样我们来看啊,现在假设某个星巴克咖啡厅保持了,比如说1万吧,就十个顾客,那么都坐在星巴克咖啡厅,我怎么知道哪个人?
09:46
看。他先甜咖啡,他再说白一点,现在一个老师监考了一个考场,这个考场有100个学生,我怎么知道哪个学生想交卷,哪个学生要去上厕所?当然我可以采用循环便利的方式来发现IO事件,什么叫循环便利?假设现在。
10:08
星巴克咖啡厅的这个咖啡师,一号顾客点什么咖啡,二号你想喝点什么?三号你想喝点什么?四号你想喝点什么?兄弟们,这个时候要采用循环便利的方式啊,来发现IO事件不是不可以。我估计这个。进场会被累死,这种方法太low太低级,接下来我们希望得到一种更高效的机制啊,在很多链接当中,某某一条链接上面有IO事件发生的时候,直接快速的可以定位得到,那么这种情况下,我们Linux系统就给我们做好了,这就是我们所熟知的IO多路复用,一句话,这块的复用指的是对进程的复用,谁就是这个咖啡师傅,每一个顾客就是这条连接。再说直白一点,兄弟们,现在一个老师监考100个学生,我怎么知道哪个学生要去交卷,哪个学生要上厕所,来吧,干嘛?这种机制就是最好让这100个学生谁准备好交卷了,请你举手。
11:15
那么这个时候监考老师啊,就是这一个进程是不是可以同时处理同一个考场里面多个参加TCP连接参加考试的学生,他们的请求处理啊,所以这个复用就是指对这个监考老师的复用,兄弟们,这个就是我们在IO多路服用之前,我们所要解决的问题的痛点,它到底是干什么的?一句话,一个进程。来一个网络连接不是不可以,但是这个太耗费Linux的系统分配,所以我们最好是用一个进程可以来处理多个网络连接,可以复用这一个进程,这个就是我们多路复用所诞生的前提和前身出现的背景。
12:11
通过前面的结论,我们已经明白了最终我们艾欧多罗复用要产生的原因和要解决的痛点是能够让一个进程能够同时处理多个TCP连接,不能来一个请求分配一个进程,来一个请求分配一个进程,这是第一个,第二个。多个TCP连接,我怎么知道哪一条连接上有数据需要进行读写操作?第一种比较low的方法就是采用循环变列,那假设这有1万个或者100个,我循环1万次,那如果是10万呢,我要循环10万次啊,我循环到第9000次的时候,们第一个告诉我,哎,我这儿有那个了,数据连接了,请过来处理,那不好意思啊,我还在便利当中,你先给我等着,那这样确实倒是一个进程也可以同时处理多个TCP连接了,可是它采用的方法是轮巡,这种方法是不是太low了?那么最好就是我们刚刚所说的。
13:04
一个老师监考100个学生,谁有事谁举手,谁先举手,我先响应谁,那么这样是不是有一种更高效的机上,我们需要在某条电路上连接上有IO事件发生了,直接快速定位,把它找到,那么这个时候告诉我,我们这个进程是不是一可以复用一对多,第二个你有事请主动报告,让我发现,我来及时响应和处理,这才是最高效的。那么这个就是IO多路复幼这种思想的雏形和前身,那么这个复用就是指对进程的复用,那么Linux操作系统已经替我们做好了,那杨哥他做了些什么?就是我们后面要给大家介绍的大名鼎鼎的E函数,可以这么讲,Right engine为什么牛逼,为什么快,底子还是它。
14:02
真真正正的作用,所以面试时候人家问你为什么ins这么牛逼,这么快,艾欧多罗夫用主要是LINUX1函数给我们搞定的,讲完了兄弟们好,那们接下来说清楚这些以后直接杀过来,下面我们就明白了一句话,让一个进程可以被复用,同时管理多条TCP连接第一点。第二点,在这些纳入管理的多条TCP连接当中,我不能挨个的去轮询,太low了,太耗费时间了,反过来一个进程在连接,在监控下面,你们那么多TCP连接,谁有事请主动通知我,让我感应到,我马上第一时间下来响应,这个就是我们的多路妇幼相关的思想。所以。
15:00
我们来看。所谓IO多路复用,这个IO主要是指网络连接。IO何为多落,多个客户端连接?连接就是套接字描述符,也就是我们所说的socketit或者是channel,那么这个呢,不再解释啊,也即我们在宋康老师的网络编程当中给大家介绍过,那么多落就是指多条TCPSO连接复用,用几个一个进程来处理多条连接,使用单进程就能够实现同时处理多个客户端相关的连接请求管理,那么一句话。实现了用一个进程来处理大量的用户连接,实现了用一个监考老师来处理考场上大量的考试学生。那么埃欧多路复用类似于一套规范和接口,这种思想有落地的实践。注意,请看这句话一开始的。
16:06
这个事情Linux操作系统已经替我们都做好了,为什么?因为天上飞的理念必然要有落地的实现,那么这个实现就是分为Linux底层内部内核里面的操作系统里面的三大方法。从低到高分别是select po和E,那么现在最牛逼的就是这个一,这就是解释了为什么牛逼,为什么快。那么接下来请看我们动画演示啊,再读一遍这句话实现了用一个进程来处理大量的用户的TCP连接,完成我们的。客户端的连接套接子的管理请看,同学们请看,现在艾欧多路复用abcde,你就把它当做干嘛?
17:01
就是准备参加考试的学生,那么下面我呢,监考老师就这一个,如果C这个考生举手了,我在这条连接上马上将会产生对应的读写操作,那么监考老师就这同一个进程,这个。IO它内部的进程马上监控到OK,现在谁举手谁报告,我就响应谁的诉求,那么这样是不是就实现了一个监考老师监考多个学生,这个就是我们的IO多路妇幼之前的前身和思想,OK。
我来说两句