00:00
各位同学大家好,我们继续,接下来我们要用Java代码的形式来给大家证明一下我们前面这些理论,什么阻塞呀,什么监听啊,什么读取啊,以及对应的五种网络模型,OK,主要是前三种结合我们的知识。理解,深入学习以及我们的面试,哦,那么需要大家辛苦一点点,是这么干的。你解释一下ready为什么这么快,为什么是单线程,100%你会被问到艾欧多罗夫用相关的东西,好,你马上就说啊,因为它底层呢,是用的Linux内核级的封装好的函数一行。那么请问为什么要用EE又是什么?没有E之前他用的是什么?那这个时候你想纯粹靠背题。
01:01
很难,所以他要求的是什么?你对网络IO编程以及Linux网络编程相关的知识是否有一定的了解?注意,如果你真的干满了个三五年啊,你想应聘一些大厂的工作岗位,你千万不要是一种很屌丝的形象出现,说啊,我就想。找个地方,你给我个两几万,我录个代码,做点在线改查就行了,对不起,真没有这些岗位了,如果了解的话,大家也知道,Chart gpt都已经出来了,嘴巴上动动一堆代码自动给你写好了。可以这么讲,如果你还是一些比较低端比较普通的技术,几乎在2023年你不会有任何生存的价值了。各位亲,这个学习能力他要求是这样,我们的讲解爬楼梯。那假如说这个是bio一级,好,一开始没有这个什么埃欧多罗夫用这种思想,那你给面试官解释一下,一步一步怎么来的,对吧,就是一开始也不会有美贝提斯哈ber尼特这些倒层的框架。
02:15
我们都是用GDBC,那有哪些不好一步步给我推出来,那么从bio,然后到了NIO,然后才后到我们的IO,多路妇幼等等等等,那么请简单的说一下,谈谈你的理解,你是针对于这个知识点做了详细深入专业的了解,还只是说哎。背一大堆八股文,反正面试官呢也不懂,那你要搞清楚,五年左右你100%要进大厂。而这个时候,一大堆阿里P7P8的可能会来面试你。这群人基本上都是当年。考研408专业课的佼佼者,他们就会被你这些底层操作系统以及网络通信相关的知识,那么在这儿提前说一嘴,默认讲这块弟兄们已经懂了Java SE知识的socket网络编程,也就是说你看过宋风康老师的这套东东了啊,假设我跟你说一下socket和server socket这这种类或者这种关键字,你不应该就说陌生了,OK,好了,那么弟兄们开勾,首先。
03:34
我们回到我们的Java的IO,验证下面这些思想和理论,来,我们来找一个write server和两个client,一句话,我们模拟呢,在我们这。有了一个。Socket server啊,它就相当于我们的red的服务器,那么过来了两个client要连接上它,一般我们这套是怎么做的呢?其实底子啊,就是我们的socket网络编程,大部分的网络通信都要依靠它。
04:10
那接下来这个问题,Right是如何通过L多路浮幼搞定的呢?抬高咱们先说第一组bio,这个几乎是所有程序员直线思维学的第一个的最经典,就跟hello word1加一等于二一样,那我来找你,你什么时候完成了,什么时候给我?一来一去两条线,符合大多数人的直线思维,所以弟兄们,咱们呢?先看图再说笔记。这先了解一个C语言底层的receive from,那么这个呢,来自于百度百科啊,这个函数用于从已连接的什么东东socket套接口上面干嘛?Receive是不是接收的意思啊?并捕获数据发送源的地址,说难听点就是接受一个数据并保存源地址。你可以把它理解为这样的一个东道。首先介绍阻塞是IO bio进程阻塞于谁用receive的调用好,我现在连上去了。
05:23
服务员,给我点杯奶茶,OK,我去后台给你准备,大家请看这个应用程序,就是我们常说的用户态系统调用,我点了一杯奶茶,奶茶系统这边就是Linux系统的内核态,我莫名其妙的我怎么知道,比如说今天下午三点有个人回来点一杯。柠檬奶茶,当然是没有数据准备好对吧?那OK,现在他收到消息了,我给你去准备,等待期间应用程序让出CPU,进入等待队列等等,那么在这后台去准备啊,数据报准备好开始复制数据报,那么请看第一次。
06:04
第二次啊,有几次啊,有两次啊,一次是准备第二个内核唤醒进程读取数据,哎,准备好了,你过来拿吧,啊我在这儿呢,一直耗着,那么所以说将数据从内核就从后台厨茶做好的柠檬红茶,柠檬冰红茶给你复制到用户空间,复制完成返回成功指示,OK,一句话客户端。点奶茶,这耗着后台去准备,这也需要时间,咱们就一直什么时候你给我,我什么时候返回成功处理数据,OK,所以在这同学们请看啊,当用户进程调用receive from这个系统函数,Linux内核K就开始了IO的第一个阶段。准备数据,对于网络IO来说,很多时候数据在一开始是还没有到达的,比如收到还没有收到一个完整的udp的包,这个时候Carl叫等待足够的数据到来。这句话翻译过来,前半段啊,某个用户,比如杨哥想去喝杯奶茶,那么我是不是找一家奶茶店,那么这个奶茶店呢,就开始了IO的第一个阶段,准备数据,给我来杯奶茶吧,那么可能他给我介绍啊,如果连点两杯的话,第二杯半价,而且他现在还不知道我想喝的是红豆奶茶还是柠檬奶茶,那么对于这个网络IO来说,很多时候数据在一开始还没有到达,比如说您。
07:32
要不点两杯,我第二杯可以给你半价,对吧?还没有得到一个完整的UT,你到底是一杯还是两杯,那么这个时候后台的奶茶店的师傅就要等待足够的数据到来,他需要等着我最终确定点哪个品种,点几杯,这个过程需要等待,也就说数据被拷贝到操作系统内核的缓冲区需要有个过程,也就是说杨哥从看菜单,点餐下单,到最后微信支付了以后,到他的系统内核到后台确认订单正式开做的话,它是需要一个过程的。而在用户进程这边,杨哥这边,我呢由于用的是阻塞式IO,最原始的bio,我呢傻叉叉的。
08:18
等待我就会阻塞,当然这是我自己选择的,对吧,我就在前台等着吧,你什么时候做好,什么时候给我,那么但内核一直等到数据准备好了,后台厨房一直把奶茶做好了,他就会将数据从厨房拷贝到前台收银区点餐那块,然后。内核返回结果,你把你手上的取餐单子给我,那么OK,这个时候你的奶茶好了,清站用户进程解除阻塞的状态,我呢喝着奶茶走人了。所以BIIO的特点是在IO执行的两个阶段都被lock,第一个收需求,我要从你的诉求过来,因为我后面也忙着呢,对吧,我要把你等待让出来,这个队列后台做,然后后前台在等两次IO,这要搞明白。所以在这块我们的bio我们就会清楚,它从头到尾是效率最低的,但是是最简单最直观的。那么这个就是我们阻塞式L相关的一个理论介绍。
09:24
Bio理论说完,那么接下来就要给大家看一下它阻塞是阻塞在哪来吧,在开始我们的代码编写之前。允许我往回翻一下,还记不得这说过一句话,文件事件处理器使用闪耀多罗浮佑来同时监听多个套接字啊。这是第一段,后面我们就会说单倍监听的套接字,准备好执行连接什么。Except应答、读取、写入、关闭等操作时,巴拉巴拉这一堆会调用套接字之前关联好的事件处理器来处理这个。那么接下来我们呢,结合我们之前讲过的索ET网络编程就给大家来演示一下,请看第一组accept监听,那么来我们的案例就两个,一个server,我们写好一个soiretit server模拟是red server,然后两个客户端模拟是两个red client,那么在这块程序非常简单,杨哥呢,提前写好,因为在这块啊,我们节约时间不让大家看着我编代码了。这个代码很简单,我们在搜的网络编程上讲解过来两个客服端,一号二号,同学们请看。
10:43
够够简单吧。OK,好,我们这所给的套接字,这是客户端,就是我要告诉你哪个地址上面有这么一个端口号,开放服务,我要去连接,好,那么同学们再直白的说一句,还记不得我们说过一个东西叫解I这个东东,然后尿可以这么讲啊,这个解S底层也就是封装了一个soet,说白了我们在这用的这些API底子啊,都逃离不了这些最基本的技术,好提一嘴,那么所以说这个是CLIENT1号,这是二号,相当于在杨哥这个本机地址上,我自己启动一个6379的服务,那么来给大家看一眼,那么这个呢,是我们的server,很简单。
11:35
基本上这两行代码,这个是杨哥写的server socket socket server端在6379开放服务。我要处,那么这是不是就一直监听,一直在等待着有谁来连接,因为我是个开放的服务器,好,那么搁到这儿,咱们请看一号,如果说111等待。我这旋转着,这请看server socket server socket.accept大家请看在这块是不是接受监听单招,那么如果程序能够顺利执行下来,一启动这个2222,第二步是不是应该直接打出我们对应连接成功的UUI电,那么来老规矩,对于这样数据的网络编程,为了避免服务不存在,那么一般我们先启动server,同学们跑一下,很简单哈,程序只是为了说清楚这个B加是个什么情况来,我们呢,节约时间,程序呢就不再写了。
12:41
等它跑跑起来,大家请看。啥啥意思,这个是不是已经成功的启动,弟兄们没问题吧,Server。OK吧,请告诉我222第二步有没有立刻打印出来,没有吧,说明在哪阻塞了,在哪卡着了,当然是在accept最经典的服务器这边,是不是要一直等待着,一直监听着,没有人来点奶茶的话,这个服务员不可能自己去做一杯,对吧?好,接下来请看现在一号过来了啊。
13:21
我点一下一号服务启动,告诉你,请看这个灯是不是灭了,就说我碰一下,然后告诉你。完了,OK,但这边请看啥意思啊,又回到server,刚才是只有这一行,那么现在一号客服一号顾客来了,点了杯奶茶,他的订单流水号DA,七八点完奶茶人家走了,我也做完成功连接告诉你没问题,然后打出一个空格,现在。第一次在这转着呢,在这等着,一号客户端连接过来,成功连接打出我的订单流水号,马上又回来,请大家看是不是又在连接,等待继续监听,好各位同学,我们现在执行一下我们的二号red client,二号二号start,二号连接结束也就走了,服务端这边呢,请看啥意思啊,我这儿等待着,只要有人来了,8569,是不是第二笔单子或者第二个顾客又来了,搞定,所以我这继续等待,所以说弟兄们,我们的第一步干嘛,这个bio阻塞也好,或者等待也罢,卡在哪了?卡在第一步,我是不是就像一个收银台。
14:36
点餐的服务员一样,我得等着顾客来点我,对吧,所以我在这儿就一直转着,即便我现在再来第三次一号顾客又回来点了杯,同学们请看,完成我们搞到这儿OK吧,每一次啊,由于ID是不一样的,所以第一笔我们会得到结论,那就是我们的什么except监听等待这块会有阻塞。
15:00
第一波演示结束,我们晓得了我们的搜程序server端启动以后。EXCEPT100%是一个必不可少的耗时等待操作,因为我得在这等着监听嘛,对吧,那接下来那你监听了得有效果吧,有人下单,有人往服务器上set k1V1刷个命令给我打出来,你要读取来自客户端的消息参数回收并处理,所以接下来我们来看第二步。读取来吧,我们呢分两次啊,在这块让大家知道它为什么会阻塞,请看我们呢,和刚才一样。进入到这一步,那么现在我们先有bio,然后我们再启动register client1,那么大家呢,看一下啊,也不难,很简单,首先socket,一个客户端连接,套接字过来,IP地址,端口号,然后socket get output stream。那么。
16:14
输入流是读取出来,输出流是不是要写入,我干嘛呢?在控制台等着你,如果你控制台打出QQ it,那么证明我有点类似于说客户端连接中断,我走了。我点完奶茶走人了,然后把我们这些全部close,否则就是你一号机器上控制台上输写了什么,我在服务器端,我呢就打出什么,OK,好,那么同学们。这边也一样在这块。本机上6379SERVER socket启动服务,那么老规矩,我们这呢会阻塞了,我要处这个服务,63791启动一直转着干嘛呀,第一步等待着连接,然后到这,那么就跟我们刚才所说的。
17:10
阻塞,等待客户端连接,它不会马上打出来我们的第二波,好,然后呢,Input。读取出来,那么这一块呢,不再废话,最基本最简单的IO读取,这是第三步,等待连接是第一步成功连接第二步,第三步等待读取连上来了,人家没输呢,对吧,还没点餐呢,我不可能给人家出单据,那组册二就是等待客户端发送数据,所以这个就是我们的什么read来。搁到这了以后,第四步我成功读取到了客户端,给我写了个啥,然后这次操作打印出一个流水号,OK,相当于这个客户第一个客户连接长高点了两杯奶茶。
18:02
苹果的柠檬的,OK,好,同学们请看啊。直接write bio启动第一步,等待连接。第二步没有马上打出来吧。对吧,所以说在这儿就会发生阻塞,等待着客户端的连接。OK,没往下走,222成功连接,没有马上立刻打出来,那么同学们请看现在。直接来到我的客户端运行,连上去什么也没有输出,那么来我这儿没有吧,其实呢,它是在这等着呢,你客户端能不能输点什么东西,OK,好了,同学们请看回到我们的server端,Bio的server啥情况啥情况,这个时候对应的代码刚才是accept在这阻塞着对吧?然后第一个顾客过来了,连接成功,你好想点点什么,你先看看菜单对吧,这是不是等待读取,所以现在弄到这。
19:12
我们呢,不等于负一,咱们这说明什么,需要它读取数据,等待客户端发送来。同学们回到我们的一号顾客,现在比如说一号顾客依次请看,对吧?我第一次点餐,现在克莱团一号input,那么就说打出这个说明是什么概念?我这句话26行写完成,那么如果你打出q it代表你自动退出,那么下面请看我们的server端啥意思啊?刚才是不是等待读取,现在终于来了,成功读取一号顾客第一次点单,你的流水号5BF0没问题吧?好,同学们再请看,我现在又来了一号顾客第二次,那么继续一号顾客第三次,我可不可以现在就一个顾客点了三杯奶茶,没问题吧?那么弟兄们请看5BF0。
20:15
不废话,是不是三波流水号没有任何问题啊?OK,这不挺好的吗?哎,挺和谐。但下面的问题是弟兄们,我们要看为什么这个技术是不断演化的,接下来请看server bio client1验证后再启动二号客户端啊,看着现在呢?一号顾客三次没有任何问题,二号顾客也来了,那么现在二号顾客相应的也要准备点餐启动好了,好,那么同学们请看,刚刚处理完了一号顾客的第三次点餐,第三次点餐对吧,那么现在我们这儿呢过来。
21:02
二号顾客一次一回车,好。我已经写完了,这两个代码都一样啊,现在来告诉我,二号的话出来了,一样的,你打出qit,我可以退出。下面我就要考考大家基本功,你们觉得这个red server bio后面会不会出现二号顾客第一次点餐对应的流水号?请大家思考一秒钟,揭开谜底。啥情况?啥情况?我是不是成功读取了一号顾客三次啊,我二号顾客也开始点餐了,我这有吗?根本就没有那啥意思啊,说人话就像是点餐系统一样的啊,我有一个收银台,我这儿有一个顾客,我这儿是一个收银的人员,现在咱们两个聊着呢,我后面二号顾客来了啊,我想点个餐,有人理我吗?
22:07
所以这个时候,同学们请看,我又来了。二号顾客第二次点餐啊,听到没发了?一号顾客什么都没说,但是server端这块有反应吗?哎,那要不这样?一号顾客,第四次是不是坏了程序,你们觉得我现在一回车客户端肯定是发送了,那么大家觉得这个server端有吗?哎,一号顾客四次,绝对有说明什么概念,对于这种情况,知道bio的故障,问故障点和痛点在哪了吧?哥哥,我又给你发了一次啊,点点东西根本就不理人家指瞒着伺候一号呢,听到也就这个人,如果没结束啊。
23:05
恐怕二号顾客是没人理的,那杨哥我之前点的这两笔单子怎么办呢?那是不是形成了阻塞,好同学们,下面啊,我们呢,直接呢,不妨呢来试试QQ it,那这个时候是不是我们的一号顾客走人了,准备好一号顾客灯灭了吧,没这个人了,下面请看。哎,这个时候有点类似于什么哥们我走了什么情况,是不是又出现了111等连接,等待222连接成功,333等待读取,请看。成功读取二号顾客一次,二号顾客两次,诶,二号顾客积压的两次点单居然被合并成一次了,然后唰的一下读出来了。
24:01
听懂了吗?所以在这种情况下而言,那么大家呢,请思考一下,我们存在着一些什么样的问题,你们觉得这个模型好吗?如果后面又来了个三号顾客呢?也是需要的话,根本不理,那么这边就排长队了。越来越长是不是让你深刻体会到什么叫龙的传人越来越长,而这个迟迟不放开,那么你能不能理解同步阻塞有多么恐怖了?我只应付一个顾客,那后面排长队百二把你系统打爆压垮,那么下面请同学们思考,存在的问题有哪些?你准备怎么修改?感谢各位同学们的讨论。接下来我们复盘一下,请看上面的模型,存在很大的问题,如果客户端与服务端进来的连接,如果这个连接的客户端迟迟不发数据,哎,刚才你也看到了,也就是第一个他没有结束呢,那么进程就会一直堵塞在瑞的方法上面,对吧?这样其他客户端也不能进行连接,也就是说一次啊只能处理一个客户端,对客户很不友好,那么知道问题所在了。
25:14
弟兄们,你们准备如何解决呢?请大家思考一下,我们在下一节给他揭晓谜底。通过上一个案例,我们知道了阻塞型IO,它存在的有一个非常可怕的问题,我一次只能伺候一个我后面二号、三号顾客的话,他过来的我无法接受,以及这个阻塞非常严重。第二个。大家请看这儿啊,可怕的情况。二号顾客一次,二号顾客两次,那说明什么?也就是说,我第一个走了以后,二号顾客也许在这儿,哎呀,怎么就像打电话一样的,怎么还是没有人理我,对吧?现在大家请看二号顾客第三次点餐有了吧,可是这两次属于什么?是不是有点像集火攻击我们的服务器?
26:14
哎,一下子是不是会把我们这个服务器给打爆啊,如果二号顾客在这儿发疯批在这儿干了他妈的20次,哎,到最后一号顾客走了,哐当一下子,他现在是把两次合并成了一次,有流水号作为证明,对吧,那他现在告诉你我一口气点。20杯奶茶,那麻烦了,别的顾客点餐又倒霉了,对吧,所以说他会把我集火攻击我们的服务器,把他打爆,那么弟兄们,故障现象我们了解了,请问怎么解决?来我们第二种情况,我们思考一下,你这儿。卡在这儿。读取的时候,大家都等着你这个三角形,那我们是不是会想到我们一步步的延伸。
27:05
弟兄们,人手不够了,过来再来一个三角形收银员,那么再来一个,就跟银行一样,一个窗口在办理这业务,那其他人没法加二三打断吧,那这个时候是不是您办什么业务啊,您办什么业务啊,是不是多开几个窗口,能理解吗?同学们,所以第二种情况你自然而然就应该想到是不是我们的多线程模型。OK,好,那么来兄弟们只要连接了一个soetit,那么操作系统会分配一个线程来处理,那么这样RA的方法堵塞在每个具体线程上,而不堵塞我们的主线程,听懂了吗?那么就这样的话,是不是就实现可以操作多个缩多个so的连接?你可以把它理解为这个瑞的方法,刚才就是只有一一那么大个银行只有一个窗口办理业务,他在瑞着,他在读着一号,顾客二三,那么等着是不是就开始骂人了?所以现在要求哪个行程中的so有数据了,我们就读哪个so,各取所需,灵活统一。哎,程序服务端只负责监听except是否有客户端连接我们,这个没什么好说是吧?开店就能等着,你也不能擅离职守吧,这张就阻塞,那么客户端线连接过来了,就开辟一个线程。
28:24
来执行你专属的业务,二号连进来了,开辟一个线程来执行对应的read方法,那么前面我们演示了这个要读一次啊,这个要读一次啊,那么现在是不是只需要这个读,而这个就不用读大大的就比我们上一层次的方法要好了很多,所以来一个连一个,来一个连一个,来一个连一个。连上了以后,我们呢,单独来处理,那么任何一个线程上的搜有素据发过来,Read就能立刻读到CPU马上处理好,那么同学们,那么在这块呢,我们在这块我们的程序就在变成了我们的多线程这样的一种模式,OK。
29:03
给大家要讲清楚它是怎么一步步进化过来的,好,那么同学们全部拿掉。然后呢?回到我们的读取的多线程这个模式。同学们,先看两个客户端,现在跟前面的一模一样,IP端口号开始写数据,从控制台写数据给服务端,你没有打出q it的话,我就一直在客户端等待着你输入命令,好两个都一样,那么这边呢,那么弟兄们。这一行还是在本机6379端口启动一个server socket,然后我要错一直监听,请看我干嘛了。第一个和前面对比,这个你躲不掉,躲不掉第一步等待连接,我服务器启动以后,我就在这accept等着,然后只要连接成功了,请看干什么。
30:10
New thread,那么这个时候是不是刚才我们所说的一号顾客来了就去一号窗口,二号去二号窗口,三号去三号窗口,那么这样是不是来一个我用一个线程,来一个我利用一个线程1:1的来分门别类的处理啊?所以说弟兄们请看代码吗?和前面一样,还是读取其他客户端输给我的。相关的内容,这个呢是等待读取,这个呢是读出来的数据,然后完了以后该关闭关闭,那么这个呢,就是我们线程好,那么同学们如法炮制,我们呢,直接启动我们的多线程版的bio,弟兄们第一步这个类。我说等待连接,我没有马上打出来第二步,所以阻塞基等待客户端连接没问题吧,好,现在一号顾客来喽,弟兄们走起,那么现在。
31:09
一号顾客,第一次没问题吧,我还没敲回车啊,请看,先回到我们的这,大家请看。只要你一号顾客你连上来了,我马上打出第二步没问题吧,但是我新起了这么一个线程,这个就是给一号顾客办理业务的弟兄们,这个没问题吧,所以说给一号顾客办理业务的等待读取是这个流水号,OK,然后请看我马上又干嘛等待连接,哎。我又回到了except这块,听懂了吧,所以呢,在这儿同学们,娄爷回到这一号顾客依次好,同学们请看现在在这块是不是三三,三三是灵异4D这块没错吧。
32:01
成功读取一号顾客一次,OK,那么来吧,和之前的一样,一号顾客二次,那么一号顾客三次没问题吧,弟兄们请看一眼,我们这儿是不是在这块这个线程啊,就是一号顾客专属窗口的,这这这个一号没问题吧,来一号顾客一次,一号顾客二次,一号顾客三次没有任何问题,这个顾客办了三个业务,好,这个和前面差不多,下面的问题是现在一号肯定是连到服务器上面。那么下面我启动我们的二号楼沿,弟兄们好,那么这个就是二号顾客依次好,我没跳回车,同学们请看啥情况,现在是不是?刚才是111等待连接,就是第二个窗口等待着二号顾客没来,所以我没打出来,但是现在成功连接,然后干嘛,三号窗口等待连接,但是二号窗口这个是不是第七。
33:09
C6第二批业务窗口在等待着,那么所以说同学们请看二号顾客依次。二号顾客二次,弟兄们有没有,是不是二号顾客一次,二号顾客二次完全符合我们的设想,比第一种方法好了很多,我只是在accept accept监听等待,这需要被阻塞一下,这个你逃不了,对吧?你总要接受到诉求,你才能去做奶茶,才能去办业务,但是客户端过来,那就是各连各的了。那么现在我们再来看一号顾客四次,然后再来看我们这儿的二号顾客三次,请看后台程序,一号顾客四次,二号顾客三次,成功打印出。两个线程,两个窗口,各办各的业务,互不干扰,弟兄们,这个是不是就比之前的只能伺候一个顾客,形成长长的阻塞队列要好了很多呀,明白了吧?哎,所以说他是一步步这么优化过来的,那么。
34:20
接下来请大家思考,这种模式当然要比上面的第一种要好了很多,对吧?那么下面请思考,我现在杨哥这儿解决了很大的问题,对吧?各自独立,每个窗口各办各的业务,你是还信用卡,我是申请房贷,他是要去开卡,OK,他是要去查账,互不打扰。那么下面我们的问题是,这不挺好的吗?那么搁到这就结束了呗,还搞那么大飞机,还有什么BI多夫右,那么下面我的问题是思考弟兄们,你们觉得这种多线程的模式又存在着哪些问题呢?请思考一下。那么感谢各位同学的回复,那么接下来lawyer。
35:05
弟兄们,我们这儿是不是拿一个请求就六一个。坦白讲。百级千级也就认了,就是小规模以内,那多了呢,比如说现在1万个请求过来了,你1万个线程。那么弟兄们都清楚,线程对操作系统而言也是一种宝贵的资源,尤其是它要涉及到上下文的切换。你这种方式。请求少的时候,数据量小的时候没有任何问题,而且还挺好,小巧精干,但是数据量一多,他架不住啊,所以呢,弟兄们,每来一个客户端,我就要开辟一个线程,如果来1万个,我要开辟1万个,在操作系统中用户他是不能直接开辟线程的,它需要调用Linux操作系统内核来创建一个线程。
36:00
能理解吧,这个时候也就是我们原来聊过的,给答案对吧?New thad.start我们看过这个方法的原代码,你这对外叫start design而言,其实是调的0START,零是个什么鬼?是个native,你看native的意思就是调用操作系统的,也即调用我们的内核态,你用户调用了内核态的一个函数去干,所以说这个动作是非常耗费资源的,如果多了的话,涉及到第二个,还涉及到了各种切换,那么直到这种多线程模型的。弊端了以后,你请问你该怎么解决。所以一般而言有两种方法,第一个先乘池二,哎,你能想到这个就说明你跟杨哥学勾UC没有白学,还是那句话,你最多就是不在new了,存有线程池里面可以复用,客户端连接少的情况下可以用,但是用户量又大的情况下,我也不知道线程池要有多大,这个内存可能也不够,够那些什么线程池的参数设置是吧,要阻塞系数啊,乱七八糟那一大堆,这个要评估的话,再向县城生产上跑一下,也挺啰嗦,大了不行,小了又不够,所以不大好使。第二个这条赛道极限了,BIIO不玩了,咱们玩NIO新奇讨方式。
37:27
安卓不给我用了,我用鸿蒙对吧?算盘不给我用了,我用电脑一样,所以这卡是卡在什么RA的方法堵塞了,要开辟多个线程,那么如果什么方法能够使瑞的方法不堵塞,那么这样是不是就不用开辟多个线程了?我们这样呢,就会用到另外第二个模型,俗称NIO,这个就是它问题的解决和由来,所以说总结我们就会清楚了,Bio卡。是卡在哪,然后我们在瑞的方法,我们要怎么优化,那么提一嘴他们看它答Java程序员最熟悉,那么他们开的七之前,它就是用B多线程来解决多连接,来一个请求利用一个,来一个请求利用一个,七之前就容易把他们开内存给打满,那么目前我们的两个痛点,第一个在阻塞式IO当中。
38:24
我们的accept和read都会导致阻塞,所以应用程序再从调用receive flow,也就我们的抽象化给我数据,我先点餐拿奶茶,就这么干一个事,从我开始调用这个函数开始,到它返回有数据报准备好,这段时间都是阻塞的,我从点餐到后台奶茶师傅给我做,一直到我前台一直耗着等着,没拿到奶茶我就不走,所以说这种情况下都是阻塞的。只有。你的奶茶好了,请取餐,我的应用程序才能开始处理后面,所以阻塞是IO的小总结,我们一张图给你搞定来,其他不相干的我先给你删掉。左侧十二幺从发起。
39:12
就开始阻塞,Receive from底层,一直到客户端给我完成,你没处理我不走,傻逼逼的在这等着,所以从头到尾都有阻塞,哎,什么时候给我,我什么时候找好处。直观简单,坏处不用我多说了。所以。他们呢,第一阶段。处理不同,它是指后面的啊,一句话,第二阶段处理相同阻塞与,也就说内核他要把数据给克普图案,那么你克普图案别在这傻傻的这等着,也就说你怎么都可以审,那么。奶茶店的师傅去做这杯奶茶,就是内核肽要干活,这个事儿你省不了吧,对吧?所以说呢,在这块要明白阻塞是IO,从发起到完成一路都是阻塞,这是bio的弊端。所以我们每个假设,我们现在优化就是每个线程分配了一个连接,必然会产生多个,那么既然是多个数据连接,必然放入到什么容器里面,纳入统一管理。基于这个思想,我们来研究一下NIO。
我来说两句