00:00
各位同学大家好,接下来给大家介绍我们最后一节艾多罗妇幼,也是我们最难的来,咱们一步一步的学,一步一步的走,终于来到了埃欧多罗妇幼。那么从我们之前讲的。两个各有利弊,慢慢的推出了这那么在开始讲解之前,由于它涉及到底层操作系统和C语言的一些编码的知识,对于部分同学而言,如果你大学本科是非算专业,没有学过操作系统这门课的话,这个听可能会稍微有点吃力,甚至第一次听你会懵逼,是听不懂的。如果愿意。建议你听第二遍,或者你自行去补一下网络编程和操作系统相关的知识,这是第一点,第二个,那么在开始讲IO多的复用之前,咱们回顾一下咱们之前是怎么走到这一步的,来快快的过一遍,为了帮助我们更好的理解IO多路复用,Bio不说了,阻塞肯定不好NIO呢?
01:09
用轮询替代了一支阻塞,但是呢,我们的核心代码就是这一段,上一讲介绍过,好处不用太多的阻塞,比bio要强,坏处有两个,第一个这个。Socket list把产生的连接通通放在这儿,我们这儿是不是会用轮巡替代的阻塞,这是好事。那么另外一面坏事就是如果轮询的东西这个例子里面越来越多,假设有1万个,但是这1万个里面检查了以后,真真真正有动作有信号需要处理的只有两个。我不管三七二十一,青红皂白,反正你现在里面有1万个,那我要变列为了这两个。
02:02
要有1万个便利,那么换句话说,是不是情愿错杀1000也不放过一个,导致这两个确实被揪出来了,但是那9998个就是陪跑空撞的轮询,不必要的操作,这是第一点,第二个你不管怎么说,我们这个是杨哥所写的Java代码,还是在用户这个层面,我们需要跟操作系统内核进行交换,所以我们现在。想一下能不能把这段代码妈直接打进Linux内核里面,不要让我来进行编写,是搞用户态内核态,用户态内核态的切换,所以简而言之,咱们现在从NIO爬到IO,多路复右就干两个,第一个尽量不要这么多的轮巡空转循环,有这么多无用功和陪跑的,谁有数据我找谁精确打击。第二个这段涉及到数据交换的代码,能不能交给Linux内核操作系统去写,咱们神不要写了,这个就是艾欧多罗夫幼出身的思想,好,那么这个前提知识说完了以后,咱们呢,先说标准版的。
03:24
学术范的东东,然后咱们再说人话,大家要清楚啊,杨哥喜欢把一些非常晦涩难懂的专业的东东用人话给你说清楚,然后咱们再一点点来抠这些其他的涉及到的函数。那么来,朋友们先看磁盘,我们现在要聊的是IOIO好说,就网络IO嘛,那么重要是个多了复用。那么按照百度百科的解释,请你读一下数据通信系统或计算机网络中,传输媒体的带宽或容量往往大于单一信号的需求,为了有效的利用通信线路,希望一个信道同时传输多路信号,这就是所谓的多路复用技术。
04:07
Oking,采用多路弗隆技术,能够把多个信号组合在一起,在一条物理信道上进行传输,巴拉巴拉,我就不赖多废话,嗯,我认为你读完以后会发现,也许每个中国字啊你都了解,合在一块有点懵逼。好吧,这是我们的第一个学术发展,只是哎,就是大学里面那样的,对吧,我们呢?了解一下,但是我相信读完以后你是听不懂的。第二个模型来IO多罗夫幼,这个就叫IO multiing,那么来吧,同学们请看,这边是多个梭,请求连接,中间只有一条管道,你就像从岸边到对岸只有一艘船,一个摆渡人,那么多个苏ET,他呢干的活呢是复用一根网线。
05:03
这个功能是在内核加驱动层实现的,哎,注意前面我们是不是说过,希望把这一大段代码人不要写了,不要在用户态出现,直接干进内核态,然后呢,这个里面的多路复用指的就是在单个线程通过记录跟踪每一个soet这么一个IO流的状态来同时。管理多个L0,你要是有读写数据了,我吧嗒吧到这儿来处理,你没事不打扰,那么目的就是尽量多的提高服务器的吞吐能力。那么弟兄们还记不得之前我们有过一个动态的这么一个图,谁有读写的信号发过来了,中间这个摆渡人耷拉到这儿,那么就是复用嘛,只有一个进程可以监控多个数据的连接,所以要明白,那么大家都用过NXN底层也是使用这种E跑接受请求,我前面说过IO多路妇幼是一种规范思想,接口有点类似于杨哥经常讲那句话,天上飞的理念必然会有落地的实现,那么这种埃欧多路复用的思想。
06:13
那么折合成我们这儿就会有select po和E3个函数,就像Java集合类里面list接口有vector I list和link list这样的落地实现内那么一样,Engine跟redist一样,底子都是使用埃欧多罗夫用的思想,用E跑这个最牛逼的底层内核函数来接受请求。NG会有很多链接刷进来,那么一跑就会统一的把这链接监控起来,然后像扒拿这个开关一样,谁有数据就拨向谁,然后调用相应的代码处理red类似同理,OK,好,这是我们的第二个模型,一定要记住这个啊。第三一个我们后面会说一个名词啊,我会简写,我们我会叫它叫FD,这个FD就叫filescript文件标识符,OK。
07:11
那么它呢?是这么一个情况,首先先看代码,几JDK1.0里面专门有个class,有这么一个文件描述符,文件标识符,然后它这有个int fd,就它的缩写,明白你么?来同学们漏一下,这个文件描述符是计算机科学中的一个术语,是一个用于表述指向文件引用的抽象化的概念。两个事,第一个你可以把它近似的理解,就是搭拉上了以后,一个数据的连接过来,会在Linux的服务器这块开通一个FD,因为我们说过Java里面一切接对象,Linux系统是不是一切皆文件啊?哎,所以说文件描述符形式上是一个什么非负整数,实际上它是一个索引时指向内核,为每一个进程所维护的该进程打开文件的记录表。
08:05
OK,当程序打开一个现有文件或者创建一个新文件的时候,内核向进程返回一个文件描述符合,哎,就有点类似于我连站操作系统了,操作系统给我一个返回,比如说这个就是你的连接号信号,程序设计当中呢,一些设计底层的程序编写完,我会围绕着这个文件FD来展开,你就给我记着,这种文件描述符一般只适用于unnux Linux这样的底层操作系统,你可把它理解为就是一个soet连接,它是一种抽象化的概念。好,那么最终同学们,我们呢,来说一下我们的IO多路复右这块重点请听好。
我来说两句