00:00
好,那么同学们一开篇讲到这儿,大致理解了艾欧多鲁妇幼它的来龙去脉。浅谈了一下,那么接下来继续结合我们的red red呢?它单一线程是如何处理那么多并发客户端连接的?它为什么是单线程?或者说right为什么这么快啊?它的单还是多线程,我们前面介绍过了,为什么这么快?你可说啊,埃多罗复用用了离内部包含的一函数,仅这么答是不够的,弟兄们,大家还记不记得啊,你在上硅谷学过杨哥讲解过的一门课,叫GVM。那个时候。一定会有一道面试题会问问你,你说一下GM的结构,巴拉巴拉啊,什么堆啊,帐啊,PC寄存器啊。圆空间啊什么什么之类的,对吧,这个就不多啰嗦了,一样结合我们的艾欧多罗复用,它也有对应的架构图,请同学们跟着我一探究竟来。
01:12
Red呢,它快是用了Linux内部封装的一函数,也即实用的是埃欧多路复用这种思想,那么它呢是利用一函数,至于说这个是什么,我们后面聊啊,你现在就混个耳熟,第一次听,听不懂很正常,这个涉及到操作系统和unix的网络编程,但是现在请同学们硬听下来你就知道好有个东西叫一函数,是操作系统相关的就行了,其他的咱们再说,那么用它来实现了L多的复用,它是将连接信息和事件放到什么通道队列里面,一次放到文件的事件派发器,事件派发器将。这个你的请求和命令又给事件处理器,杨哥听不懂,下面意图胜千言。
02:07
同学请跟着来客户端张三,我write client。我建立连接李四SK1为一,ONE5GETK1是不是三个不同的请求,那么这就产生了三个socket连接,哎,至于说绑定什么ae read able,这些是一些操作系统相关的一些底层,我们就不展开,在这有点类似于我还有多罗夫佑这一个进程,同时管理多个缩的连接,哪一个先举手了,就是三个学生前后一秒钟间隔了要交卷,那么他们三个。我不管你谁先谁后,到我这儿听我的一个总的调度,然后。这块有个事件。
03:02
队列,OK。那么全部排好队。调度过去事间派发器,这个要连接,这个是命令写操作,这个是命令读操作,所以从连接到后面底层的处理,Right有三个,一左周右一,最左边这块lo多路复用的思想,多个索的连接,由同一个进程来进行管理。第二个中,那么它为什么是单线程的,那么这个命令你说到底是K1V1张三连的这个还是玩5GETK1或者get k2,这个命令谁先执行呢?那么为了保证red的快,它每一个命令。放在一个事件队列里面,队列队列是不是fio先进先出啊,Red的命令执行是不涉及到什么洛克安洛克加索的同意吧,那么在这个中就是事件队列排好了,最后右边第三步有一个事件排发器,根据你排的我挨个挨个就像什么快递包分拣包一样来给你进行对应的,这块是连接,这块是写操作,这块是读操作。所以底层的机理是这么一种模式,而这种模式也就是我们的react反应堆应模式,后面我们聊,所以基于此,同学们请看。
04:38
Red是跑在单线程当中,我们前面说过对吧?所有的操作都是按照什么顺序的线性执行的,但是由于读写操作等待用户输入和输出都是什么东东阻塞的,那么所以IO操作在一般情况下是往往不会立刻马上直接返回,这就会导致某一文件的IO阻塞,导致整个进程无法对其他客户提供服务。I要多了,复用就为了解决这个问题啊,也就是我们刚才所说的一个监考老师可以同时监控多个学生,好了,那么你这儿阻塞我不能陪你阻塞啊。
05:13
老师,我想交卷,突然又把手缩过去,我不交,哎,你别烦了你们,你你收拾干净再说话,所以谁OK了,我先响应谁好,第二个这个呢,它通过一种机制啊,可以监控。一个进程可以监视监控多个描述符,一旦某个描述符就续,一般就是读或写操作就绪了,能够通知程序进行相应的读写操作,你这边OK了,马上安排给你尽快的响应甩过去。好吧,你干脆我也不含糊这种机制啊,就需要使用select po和E来配合,那杨哥你不说一吗?听好改进,你把它这个叫什么?苹果十啊,这个叫苹果11,这个叫苹果13手机一个都是苹果系列,它们都是L欧多罗复用,对吧?比如说我们说Java集合类里面list接口是不是有什么vector a list和link list OK,就这个意思。那么注意多个连接共用一个阻塞对象,应用程序只需在一个阻塞对象上等待,无需阻塞所有的等待,当某条连接有新的数据可以处理时,操作系统通知应用程序线程从阻塞状态返回,开始进行对应的业务处理好。
06:27
那么下面你低头写着卷子的时候,监考老师不打扰。这个时候只要你举手,老师我写完了要交卷,那么这个学生是不是从伏案写卷子的这个状态,阻塞状态返回开始对应的交卷写操作,所以呢,各位同学,上面这张图也就采用了react的方式来实现文件事件处理器每一个网络连接,其实就是对应一个fd fair script,我们后面会量俗称文件描述符,那么也就是我们说Linux。所说的一切接文件,那么write是基于react模式开发的网络事件模型处理器,这个处理器就被称为文件事件处理器,四部分构成整套模型,第一个多个连接的索KI的套接字啊,第二个L欧多路复用监考老师,第三个文件分派,第四个文件处理。所以因为文件事件分派器对列的消息是单线程的,Red的这些执线的命令也才是单线程模型,不用lock,按lock加锁。基于此我们会得到我们参考write设计实现这本书上面也说的很清楚,文件事件的write是基于这个开发的网络事件处理器,好,那么它使用的是L欧多罗复幼关联好事件处理器,然后进行高性能的网络通信模型,这就保持了red内部单线程设计的简单性。
07:56
OK,哎,就说之前不敢给大家讲深了,到这儿咱们一步步的往下弄,在开始完成之前,请同学们跟我读一遍这个单倍监听的套接字,准备好执行应答。
08:11
Accept和读取。写入、关闭等操作时。与操作相对应的文件,事件就会产生,那么在这块啊来这是不是有事件处理器去对应的来完成,那么一句话什么意思呢?这是理论,理论实操,这是不是有实操,最后是小总结,也就是说我们到最后杨哥用Java代码来给大家证明这些的时候,我会说弟兄们,前面杨哥是不是说过一个这么一个东西,什么叫等待介绍,哎。准备读取等等啊,它为什么会阻塞的,这段话就会给大家呢,说一下,好,那我们的结论请同学们看一眼。从六开始,那么当然到七啊,也就我们前面所说过的,为什么快,为什么单线程。将网络数据的读写、请求、协议、解析通过多个IO线程来进行处理,那么也就是一个进程可以监控多个TCP连接,那么对于真正的执行命令,你们在K1 V1get ke1等等,它仍然是单线权的这种操作,它是不是有放到一个队列里面,有一个事件分派器,挨个挨个的拿,不用在这加个lock,按lock,反正一次出一个,在队列里面取命令,那么这样干嘛?连接问题解决,执行命令解决,又不用加锁,又是在内存里面,所以一举两得,占尽便宜,这个享受了多线程红利,这个享受了单线程红利,OK,好,那么同学们,这个我们就会明白了,Write为什么这么快。
我来说两句