00:00
好,同学们,上一讲我们解释了red为什么是单线程,单线程有哪些好处,但是为什么从4.0以后到现在的七,它慢慢的背叛了自己单纯的选择,所以呢,同学们答案还是多看red版本,第一个问题过第二个。既然单线程如你所说的这么好,它为什么要逐渐的又加入了多线程的特性呢?那么请问单线程有哪些痛点是red所不能接受和忍受的呢?OK,好,那么下面我们来看这么一个啊,第一个是什么硬件的发展,前面已经说了,在这儿。干嘛?Mar CPU course什么动不懂就说CPU都是多核时代了,那么你只有一个单线程对吧?是不是对硬件的使用不是特别的充分和牛逼啊?虽然说right的瓶颈无视CPU,这是第一个,那么第二个,那么自然而然单线程的痛点是什么?那么不得不修改。
01:22
对吧,从单。到我们的多好同学们,第一个单线程,也有单线程的痛点和苦恼。举个例子,那么弟兄们。我们大家都清楚啊。对于而言,丽塔K1,我相信这个命令大家肯定不陌生。所有的命令。工作线程的这些命令都是原子的,一回车伤干净了好,那这个时候没什么呀,可是问题是我这是在教学DEMO。
02:04
简解简单的情况下,那么同学们如果啊,我这个delete塔,比如说K2啊,这个K它其实是个什么USER002,它是一个非常复杂的哈希结构,里面可能干得出80多个字段啊,比如说ID是实间,那么这个时候user name是张三,然后A是23等等等等等等,也即这是一个复杂的大T1比例它的时候。他可能要删半天。明白吗?所以这个时候请看我们正常情况下使用比例,它是可以很快的删除数据的,而当被删除的这个K是个非常大的对象的时候,例如包含。成千上万个元素的哈希集合的时候,那么体力它指定会造成的主线程什么东东卡顿?哎,这个时候就坑爹了,哥们,我现在连着呢,我要去找red去工作,你别忘了,不是只有你一个人连我这也连着呢。
03:06
对不对?那假设张三现在再扇着这个大的,这个铁,它又是个原子类的,相当于加了把锁,那么李四管我孙七,我们这假设啊,我这还要push,那么要操作个什么东东?哎,一回车下去怎么会卡顿一下?或者发现连的人越来越多,操作命令越来越多,删的改的写的都挤在一块,慢慢的也就越来越慢。所以这个时候,这就是什么red单线程时代的最经典的故障,大K删除的头疼问题,那么由于red单线程的1DELETE这么一干,那么等待很久,这个线程才会被释放掉,类似加了个SYNCH的锁。你可以想象一下高并发这种情况下,这个程序会读成什么鬼样,所以这个时候你没有办法来很好的处理这个问题,如果只是个单线程的话,那么怎怎么看,怎么解决呢?只能是什么。
04:03
回到这种模式,是不是如果是主线程,尽量不要卡顿和中断,有什么费时耗尽的,另起一个后台线程去完成?所以我们使用惰性删除可以有效的避免卡顿这问题,那么来看一下我们的案例,同学们走。比如当我啊需要删除一个很大的数据的时候,因为是单线程的原子操作命令,那么。被卡了,我怎么在不卡呢?从4.0以后就增加了多线程模块,当然此版本中的多线程主要是为了解决删除数据效率比较低这个问题啊,也就是说可以这么讲,90%啊,4.0这个版本还是什么单线程加一点百分之十的新特性。那么这个时候同学们请看,我们呢,一般就不能够用直接delete上大key,我们用哪个,前面是不是介绍过a link key,那么同学们来请看好按link什么K。
05:07
一回戳get k,哎,那么现在一删完了,所以查不到,那杨哥这不跟底例上一样吗?面上是一样,底面子是一样,呃,底子它是不同的,所以说同学们请先看这,这是第一个命令,第二个命令,还记不这个flash DB。好,同学们请看那杨哥这会我我说哎,Flash,哎,它有什么异步和什么鬼同步,那么只要是异步,那2%什么叫俗称叫异步多线程呢?所以说它可以加这样的一个参数,可以把整个库清空,但是它是用异步,其他的线程不用在这卡顿和等着,那么所以说我们可以看得出。把删除工作交给了后台的小D子线程异步来删除数据,那么在4.0以上它慢慢的加些好的功能,因为RA是个单个主线程处理,那么之负安特雷斯一直强调懒得才是最好的。所以。
06:12
Lazy free的本质就是把某些耗时较高的成本操作从的主线程剥离,让bio非阻塞线程来处理,那么是不是就极大的减少了阻线程的阻塞时间,从而减少删除导致性能和稳定性的问题?那么阻线程继续干费时耗力的删除或者其他的工作?后台新起的线程,这个就是red为什么要慢慢的引入多线程的原因之一。OK,好,那么可以看得出形式比人强,它不得不在现实条件下面做出最佳的选择,让自己保持单线程最佳性能的前提下,增加一些多线程的特性,所以慢慢的开始支持多线程。
07:00
通过前面的讲解,我们回答了这么几个问题,第一个是单还是多,第二个他为什么要用单线程这种架构作为一开始的。初始架构,第三,一个好端端的,为什么到最后不得不引入了多线程的特性,那么说白了都是与时俱进技术。框架也不得不适者生存好,那么接下来我们就要回答第二个问题,Red为什么这么快来?RED6和七的多线程特性和IO多的复用入门篇来吧,同学们。通过前面的讲解,我们已经非常清晰的知道了,对于red的主要性能瓶颈是内存或者网络带宽,而并非CPU,何以见得?大家请看啊官网说话,人家说的很明确,CPU。不大可能会成为你的瓶颈,那么一般而言,Red要么是内存,要么是网络IO,也就是网络绑定相关的内容,所以影响red性能的这个呢,也是一个面试题,没那么多,就3CPU,内存、网络IO,这是影响red性能的最主要的三大因素,那么这已经说了,CPU它不是主要的。
08:26
内存,说白了,现在哪一位同学不都是土豪?1016G内存,32G内存。不是什么天方夜谭了吧,标配16G内存了,所以内存广告。基于此,我们会清楚,最重要的就是这个网络IO是red的性能瓶颈,OK,这是第一个问题,所以同学们,我们接下来就要唠了。网络IO相关的知识,从red的连接到最后这些命令的使用,它的整个后台的过程和原理是什么样的?为什么red快,所以呢?同学们听好接下来内容,大家听不懂没关系。
09:17
故意的先让大家混个耳熟,后续大招再给大家说明白,因为这个呢,不拿源码和网络unix网络编程中的五种IO模型的话是讲不清楚的,但是如果第一题第一天一开始给大家讲那么难的,我怕大家受不了啊,但是由于高阶篇我不会因为说大家听不懂我就故意放水啊,然后呢啊,讲一点简单的,你一听就会,一学就懂,那不可能。所以呢,各位同学,接下来能你能听懂懂多少就听懂多少,最终把你的疑问给我留着,我们在第12章咱们再见分晓。好,同学们刷回来,接下来我们可以发现red最后的瓶颈初步定位就是网络IO,那么下面RED6和七真正的多线程登场来吧。
10:15
六开始非常受关注,这个特性就是开始全面支持多线程,也即从六开始,你可以肯定的说是支持多线程的。因为。大家一直被熟知的,它是个单线程架构,虽然有些命令操作可以用后台线程或子进程执行啊,比如说我们写个什么BGZ对不对,还记得吧,然后呢,比如说数据执行的这些快照啊,AF重写,但是从网络处理到实际的读写命令还是有单个线程完成啊,它的主体架构还是单,但是随着网络硬件的提升,我们说过了,现在CPU是不是都多核的,如子性能瓶颈有时候出现在网络IO上面。也就是单个主线程的处理网络请求的速度是跟不上底层网络硬件的速度了,也就是说硬件比你的软件还要快了,那么你就是不是没有办法充分的压榨这个硬件的性能,那么为了对应这个问题,它采用多个IO线程来处理网络请求,提高网络请求的处理速度,从六开始到七一直用这个方法,我相信以后也这样啊,它的大的主体架构应该不会变,所以它是这么干的。
11:22
的多IO线程只是用来处理是吗?网络请求?那杨哥,什么叫网络请求?也即这的so连接?好,待会我们会说啊,对于读写操作命令,就是set k1 get k1这样的,仍然使用单线程来处理。哎,这是因为处理请求的时候,网络处理经常是瓶颈,我们前面刚才说过三大特性,CPU、内存、网络IO,所以CPU和内存不是主要矛盾了,主要矛盾就是网络IO,所以我们通过多个IO线程并行的处理网络操作,就可以提升实力的整体处理性能,而后我继续使用单线程命令来操作,哎,这样是不是变成了既要又要啊?
12:09
哎,我该多线程的部分,我多线程我们用。多个IO线程来并行的处理网络操作,就这一块是多线程的,但是呢,每个连上来了以后,我自己使用单线程命令来进行操作,为什么这样?是不是就不用去管加锁这些处理,没有听说过命令要加锁的吧?那么这样一来red模型就简单了,所以它的真真真正多线程,我们这儿先提一组,也即那个IO。网络的那块它是多线程,但是真真正正干活的这些命令还是单线程好,这是我们的第一步,继续。在于我们的在这块,回到刚才所说的。处理请求时,网络处理经常是瓶颈,所以通过多个IO线程并行处理网络操作可以提升实例的整体性能,那么也就是说,这个多IO线程只是用来处理网络什么请求的。因为你只要给我连同一个。
13:13
Red主机,不废话,这段client的密码端口号是不是都一样?如果我每次连接的话,好像你有一个新的,是不是有点大费周章?所以同学们red来了,那么在这跟着我来,他是怎么办的呢?分为四个阶段。第一个。接收建立连接请求,获取socket,我这是不是先所有red的执行命令,我要去操作red,我客服他不要先连上red主机,那么是不是这一行red client密码端口号几乎是标配,所以第一步我这有一个东洞叫主线程,它获得so的连接,将so放入全局等待队列,你别忘了,这在连,这儿也在连,这可以嘟嘟嘟嘟嘟嘟嘟,Red是个高并发的内存服务器,一瞬间可能有七八个,十多20个请求,或者是客户端连接上来,这个不奇怪,所以呢,我们在这儿它呢。
14:22
默认将会放入一个全局等待队列,不见得你申先申请先到,以允许的方式将搜的连接分派给IO线程,那么主线程阻塞,等待IO线程完成请求读取和解析,就比如说我要先验验第一个网络通不通,第二个这个IP是不是在合法的防火墙范围以内,第三个端口正不正确,第四一个是否达到最大连接等等吧,它内部有一套的读取和解析的规矩,然后这边。IO线程开始执行,那么将soet和线程绑定来了,那么这个时候就好比什么,你现在呢,要准备去看大夫,但是你现在是不是先去分诊台挂号,挂了号了以后,那么有很多病人去找这个专家看大夫,那么明白了,比如说17号是张三这个。
15:12
病人线程绑定了,坐着等去吧,我们读取索当中的请求并解析,分诊台挂完号以后拿着这个去分诊台去解析,行,没错,没跑错科室啊,在这等着吧,那么请求解析完成,主线程就开始执行,那么执行。请求的命令操作啥意思呢?就是OK,没问题,轮到你了,连接解析密码、端口号都成功,也轮到你干了,开始工作,那么这个时候主线程将请求的命令操作执行完成,比如说SK1 V1完了以后再请看。不是马上写回给ready,是先将数据写进了一个缓冲区,主线程写完了,比如说我下K1倍接一回车,我完了,那么我就等着,等待L线程完成数据回血soet,因为我现在还是连着,我作为客服端,你连上了好什么毛病,哎,我大夫我哑了嗓子疼,然后呢,咳嗽发烧,开点药好塞着K1胃一来个布洛芬走啊,那么这个时候是不是要回血so给行了,写个方子给你,你要干嘛?又回去连接了,将结火回血索给药方拿药,然后索ET回血完成主线程开始执行,等待队列清空,这个病人已经完了,这条命令已经完成了,等待后续请求,啥意思啊?我这儿是不是SK1V移完了回血soet,这个只要存到了内存里面,并且告诉客户端此次操作成功,OK,行,你这个表毛病没关系,给你病例写满。
16:46
啊,看完了,领着药方去拿药吧,OK,领到了两盒布洛芬完成,那么告诉我我现在没有断开吧,这个苏给的连接是不是还有,因为我可能还有set k2VR这样的一个操作,对吧?每一步操作不一样的是一些命令,但是从连接到你退出这个socket的这条链路,连上主机的这个是不是每一次都是一样的呀,明白了吗?所以说这个是red的主线程,它主要接收建立连接的请求,获得这个soet。另外这边这有个外包出来的,分出来的专门负责的这个IO线程,有点类似于我们前面的这些和屁股后面这块,听懂了吧?所以我们把它分为四阶段,第一个服务端和客户端建立缩的连接,并分派处理线程。首先啊,主线程负责接收建立连接请求,我write server成功了,那我肯定要开个socket端口给人家连嘛,我write client连上了。
17:46
连接成功,当有客户端请求和实例建立so连接的时候,主线程会突然结合客户端的连接,并把socket放入全局等待队列当中,紧接着线程通过轮旋的方法把索塔连接分配给L线程。好了,那么大夫这儿跟连接,我来看病,我先挂号,挂号好了以后你去对应科室三楼找呼吸科,然后呢,分配给IO线场分诊台过去,那们分诊台读取,也就是说每个病人来了以后,不可能每个病人都新建一个分诊台,分诊台是不是就是应该是IO线程复用的一个地方,那么分诊台读取并解析请求,主线程一旦把so分配给了IO线程,那么就进入了什么阻塞状态?哎,我得验验。
18:35
等待IO线程完成客户端的请求读取和解析,因为有多个IO线程在什么并行处理,那大家都在这等着呢,对吧?大夫很忙,那么分诊他看了以后行17号做去候诊室等着吧,所以这个过程很快就可以完成,对吧?第三主线程持续请求操作,第三步它是写那些命令,等到L线程解析完成了,符合去看吧,那么主线程还是会以单线程的方式,你注意就是set k1为一这种的方式,原子类的命令执行全命令操作,那么最后IO线程回血,So和主线程清空全局队列,你看完病了,药方给你写好,去药房拿药吧,走人,离开三号楼这个科室,离开分诊台。那么当。
19:19
主线程执行完请求操作之后,会把需要返回的结果写回我们这个缓冲区在这儿,好吧,这个时候它真真正正写进red内存里面,然后主线程会阻塞等待IO把这些结果回写到缩写当中,返回客户端。那么和之前的一样,IO读取和解析呢?一回事,IO线程注意刚才是什么?建立socket连接,现在是不是要写回写soet,那么也就是说你是不是给回该一个OK,所以有时候也是多个线程在并发的执行,哎。回血缩的快速度呢,也很快,因为本身red就非常快,等到IO回血完缩完毕,主线程清空,那么这个请求这一波完了,等着下一个命令,那么等待客户端的什么后续请求,所以这个就是它一个完整的主线程和IO线程怎么来完成这样的一个请求处理,那么底噪也就是用的一种IO复用的技术,结合Linux的底子叫一函数。
20:31
上一讲我们详细给大家说明了主线程和IO线程是怎么协作完成请求的,那么对于我们这一波,有一个IO线程非常的重要。将soet和线程绑定,读取、解析,解析完了以后才允许主线程干活,最后还会回写进缩给。那么这个IO线程到底是何方神圣,具体是个什么样的东东呢?那么我们就要依赖于unix网络编程当中的五种IO模型来给大家说一下,这也就是引出一道最经典的面试题,Red为什么这么快?那么一般的同学会去答啊,因为red它是呃,单线成大啊,它装在内存里面,内存比装在硬盘里面要快,所以呢,Ready快,我不能说你达到不对,但是达到这这个程度是不够的。那么你一定要和面试官说,主要是IO多路复用和一跑函数的使用。
21:29
好,那么同学们开工,所以unix网络编程中的五种L模型啊,我们呢,或多或少接触一些,后两种偏C,咱们先放下不表,前三个大家必须要搞明白,所谓的阻塞型IO,你不给我,结果我不走。第二个非阻塞就是我们的NIO对吧?那么大家都清楚,你来了请求我服务器端暂时没有处理完成,那么你先回去,然后我们是不是说过什么异步非阻塞,OK,那么接下来跟咱们这个red相关的就是IO多路复用,好,那么同学们首次听,请大家认真,后续我们再进一步强化下面。
22:11
你跟着杨格兰耐心的理解走,首先先回答一句,Linux世界里面一切皆文件,那么Java的世界里面一切接对象,说人话就是在对于我们Java而言,大家都清楚啊,是不是object,那么对于我们的Linux而言的话,大家清楚啊,Fair。所以我们为了讲清楚IO,多了复右先要复习的概念,那么也就是我们的文件描述符。FD,或者也叫距比,俗称fairscript,那这个是个什么东东呢?我们先了解一些概念啊,扫平这些障碍,咱们再进一步的理解,走,首先请大家先看代码,它直接告诉你了,在JDK1.0里面就有个filescript这么一个类,注意这有个int fd fd,它的缩写俗称文件描述符。那么请大家看,这说的很清楚,应用should not create their owner fair,也就说不能够自己创建的。
23:16
所以来这文件描述符script是计算机科学中的一个数据啊,它用于表述指向文件引用的一种抽象化概念,一般多见于unnux和Linux编程。那么文件描述符在形式上是一个非负整数,实际上就是一个索引值啊,指向内核为每一个进程所维护的该进程打开文件的记录表,那么当程序打开一个现有文件或者创建一个新文件的时候。内核向该进程返回一个文件描述符,那杨哥听不懂,说人话,我现在连上了我的readya,这个命令大家都见过吧,那么这个时候用我们的Java IO网络编程那张来说,就相当于说发起了一个socket的访问请求,调用服务器监听到了,那么这个时候会给我内核向用户进程返回一个文件描述符务就这个FD,你有点类似于你现在去医院去挂号,好,我现在养了,我现在要去呼吸科发热门诊,给了我一个17号,那么好,我去分诊坛就坐这等着,那么这个时候相当于说你产生一个连接,它就会给你返回一个文件描述符,代表你跟远程的red服务器进行了搜ET连接,连接成功有个标识,你到底连接的是第几号,对吧?好,所以在程序设计当中,文件描述符这个概念往往只适用于这样的操作。
24:47
系统啊,那么大家先了解一句话,这有这么一个东西,好,那么接下来我们呢,就来说说什么是IO多路负右。那么首次浅谈埃欧多罗妇幼这个东东到底是什么?来,先回到我们这,大家呢,都写过这样的命令,你们听好,在这个框框里面以内,相当于我们就是服务器端的一个socket OK,那么你每次连接一个人过来,我都会给你一个FD,叫文件句柄,相当于医院挂号,你挂上了,那么好,每个FD它有命令了,那么。
25:26
触发服务器的识别,然后进行后续的操作,那么搁到我们这儿,回到我们的脑图笔记,大家请看。这儿是不是?获取这个so连接,相当于返回给你一个FD啊,一个GB,你连上了,那么好放入全局,等待队列走。分诊台去候客室等着大夫叫号了,轮到你了再来,什么方式啊?是不是轮巡的方式?那么将soet和线程绑定好,17号患者张三在吗?过来吧先。
26:01
做个检查等等,那么所以说搁到这儿啊,我们呢,就要明白,你每次来了以后,这都会给你FD,那么对于这个FD这种连接的管理就来了走,那么什么叫L多路复用呢?请看啊。它是一种同步的IO模型,实现几个一个线程监视几个多个文件聚柄,你告诉我分诊台的维护秩序的这个大夫是不是只有一个,但是监视来我们发热门诊来看病的病人是不是多个,那么一旦某个文件去病就哎17号患者张三请去四号就诊室去找大夫看吧,那么就给那个通知到对应的应用程序进行相应的读写操作,没有文件句柄就绪时候就会阻塞应用程序,没叫到你的号呢,麻烦你坐在座位上先刷刷你的手机,看看抖音对吧,看看上硅谷视频,待会叫到你号了再去找医生,那么从而就释放出干活的这个医生和CPU资源。所以同学们对应的理解第二次就记这句话,先一个线程监视了多个文件句柄,多个FD,那么来吧,所谓的IO多路复右是这样的。
27:19
分开。I2就是指网络I2,尤其是在操作系统层面,就是指数据在内核态和用户态之间的读写操作,这个跟我们讲GUUC是一样的,咱们讲size是一个什么重量级的,什你加锁呀,或者这些线程用的多了以后,是不是牵扯到内核态和用户态的转换,那么请告诉我内核态和用户态的转换。是不是一种耗时的操作少没问题,那么多了以后会不会影响性能,这是第一个问题,第二个何为多落?是多个客户端连接,那么大家请看现在我们这儿,现在杨哥写了这么一个假设,这是A客户端,我说过是不是可以有一堆客户端连上来,那么下面多个客户端连接,连接就是套这次的这个描述符及soet或者是channel,那么所谓的复用就是复用一个或多个线程,那么把这些综合拼起来,意思就是一个或一组线程就可以处理多个TCP的连接,使用单进程就能够实现同时处理多个客户端的连接啊,和这句话是不是异曲同工之妙,所以无需创建或者维护过多的进程和线程,那么也就是说多个患者。
28:41
进到了候客室,我分诊台只需要一个大夫就能够给你进行分诊指导秩序的维护和说明,轮到谁就是谁,OK,所以一句话,一个服务端的进程可以同时处理多个套接子的描述符,实现埃欧多罗复用底子有三大函数,分别是select po和E3个阶段来描述,这三个各有特点。那么。
29:09
强调一是我们的重点,好,那么同学们,下面我们就来会一会这个东东,放心,上面是学说法的概念,你先注入下面这个案例,一说说人话,你马上秒懂。场景体验说人话,我们来了解一下什么叫一跑。来吧,我们先来一个真实的案例场景,帮助同学们更好的理解。首先我们模拟一个TCP服务器啊,这就是我们一个某台主机。现在有30个red client要发起连接的操作,那么这个每个连接是一个cket连接,那么下面red服务器端它的那个比如说啊,我们学过网络编程这个socketit对吧?第二比如说read这么一个方法他就明白,哦,哇,靠,一到30号学生连上来了,那么假设你是个监考老师,一句话我这有三神要连到我们的red服务器,那么你告诉我该不该有一个类似于大管家这么一个角色来处理客户端的连接和的响应,这个没问题吧?好,那么同学们走起,那么下面我们呢,让30个学生来做个题,然后负责验收学生的答案,那么你有以下几种收卷的方法,第一个同学们请看一下。
30:28
轮询,挨个收好同学们考试时间一个小时时间到,请交卷,那么我就挨个ABCDEFG,这中间假设有一个学生卡了,那么全班都会被耽搁,那么假设17号。学生他呢,在那跟监考老师掰扯啊,再给我延缓时还没写完怎么怎么的,那后面收卷是不是被影响了?如果你用循环挨个处理种索给,那么这个服务器根本就不具备并发能力,不多说了,过第二种咋办?我为了提高这个并发能力,我为了让提高它的吞吐量更快,那么最爽的是不是30个学生谁交卷?
31:09
我呢,一对一服务咋整来一个六一个,你来一个请求,我就六一个请求,来一个请求我就六一个请求,一对一你创建30个分身线程,这个考场有30个监考老师,一对一,一个老师定一张桌子,定一个学生,那么每个分身线程检查一个学生答案是否正确,哎,这个有没有写好准考证,写好姓名,班级考试科目有没有进错考场,对吧,验一下准考证等等,那么这样类似于为每一个用户创建一个进程,或者是线程一对一的对接处理,OK,那么好,有点类似于我们这儿来一个FD,我一个来一个FD,我留一个好少的时候没问题,那我想请问多的时候呢?如果这么来,他妈10万个,你觉得资源会不会榨干好?这是我们的第二种情况,第三种。响应式处理一对什么多老师站在讲台上,谁解答完了谁举手,假设CD同学完了,答卷完成举手,老师我要交卷,这个时候谁叫你,你就响应谁的请求,不叫不打扰,继续回到讲台上,后续一和A又举手了,类似于red客户端又有发出了什么命令,那么然后你去处理E和A,这个就叫IO复用模型,那Linux下select和E函数就是干这个的,OK,那把上面这个啊三大场景轮许拿一个,另一个和响应式的,那么。
32:43
呼叫型的处理一对多,那么这个时候我们呢,把L多路副模型通过这个场景简单明了的给同学们展现,就是这样的。将用户所对应的文件描述符注册进急跑函数。将每一个患者拿到的。
33:03
排号的叫号单注册进分诊台,然后。分诊台就把你监听哪些患者。来看病被叫导了,那么这样就避免了大量无用的操作,大夫我什么时候可以看啊,大夫这个这个专家在不在啊,大夫我想加个塞插个对我发热特别严重等等等等,那么所以说大家按顺序,那么此时的so就采用什么非阻塞,那么这样整个过程只有在调这些函数的时候才会阻塞一下,收发客户的消息是不会阻塞的,那么整个进程或者线程就被充分的利用起来,这个就叫事件驱动所有的react反应模型,我们来看abcde几个连接,你可把它当做五个连接,那么换以前如果是我们啊这种模式好说哪一个FD来一个so连接来一个文件描述符,FD分配来一个我六一个,来一个我六一个,那这个时候弟兄们很恐怖,来的越多,六的越多,那么现在就好比是什么?我们去机场坐大巴,不可能每个乘客从候机厅到飞机上每人派一个车吧?那是不是来一趟百渡大巴?
34:13
他一次性带走,那么是不是就出现了一对多,一个百度大巴就对应着多个乘飞机的乘客,那么基于此也一样,如果这么多客户端连接,我每个人都要应付一个,我受不了,这种资源占用太大了,我能不能就用一个?线程来监控所有连接,谁有消息我响应谁,所以在单个线程就它假设B有消息了,吧嗒就吧嗒到这儿,然后传递你的用完了马上断开,然后你再去负责去别的,这块就是个公用的,那么在单个线程通过记录和跟踪每一个索连接。它的状态来同时管理多个IO。一对多,那么一个服务端进程可以同时处理多个缩套切字的描述FD,目的就是尽量多的提高服务器的吞吐能力,大家都用过NX,那么NX的使用呢,也是一函数请求来处理这样的高并发高吞吐的,那么NX也会有很多链路进来,那么一号就会把它们统一的,你们进来了,统一注册到我这儿,我把这个监控起来,然后像扒拉开关一样,像百度车一样,谁有数据我就拨向谁,谁响应我就去找谁,那么然后调用相应的代码来对应的处理。RA的原理跟N底层原理都一样,都是用L。
35:33
多路复用这个技术调用Linux的一函数,那么所以说这个就是我们的L多路复用,它有请求就响应,没请求它就不打扰,所以我们总结就是只使用。一个服务端进程,哎,可以同时处理多个套接子的索的FD连接辅描述,这个就是L多路复右提升了它的吞吐量,那么搁到我们这儿,大家请看最经典的,我们这儿写了这么一句话,你叭吧,连上去了。它内部的处理是繁琐和复杂的,客户端在请求服务端的时候,实际上就是在服务端的搜文件当中写入客户端对应的文件描述服务,谁来挂这个专家号了?如果有多个客户端同时请求服务端,为每次请求分配一个线程,为每一个患者分配一个医学专家,这不可能对吧?一定是病人比医生多,那么这个时候就你不可能每次来一个病人都给你留一个专家过来,这样呢就非常耗费医院的资源,所以我们只能使用一个线程来监听多个文件描述服FD,这个就叫IO多的复用。采用IO多的复用的技术可以。
36:49
按单个线程高效的处理多个连接请求,一个服务端进程就可以同时处理多个套接子描述服务,这个就是red为什么快的实际原因和根本,也即兄弟们,I欧多罗复用加一函数的使用才是red为什么这么快的直接原因,而不仅仅是因为它是在这儿啊,这个命令就是原子的,都是单线程的,或或者说它装在内存当中。所以要回答这两个才能够说一下va为什么这么快。
37:21
OK,好,那么同学们对于L多路复用的浅谈,我们呢,首次讲解就说这么多,至于说这三大函数,后续我们再进行深一步的了解。通过上两小章节的讲解,我们对为什么快?为什么它的瓶颈是在网络IO?以及艾欧多路复用的入门知识做了一个粗浅的了解,那么接下来要给同学们做一下小总结来,首先大家要清楚啊。Red的工作线程是单线程的啊,但是就整个red来说,从6.0包括到现在的七,它肯定是多线程的了,这是第一个知识点,第二个精简完了以后,下面我们来说一下精简,那么也就是对它的减简做减法,结合我们这个知识的理解,你现在来看这个,你会觉得合情合理,很自然,像大自然一样自然,来,同学们跟着来第一个。
38:24
IO的读和写本身是堵塞的,比如当so当中有数据的时候,对吧?比如说我们写了个set k1,我们现在是跟red服务器做着so连接的,那么这个时候两步,第一个要把客户端你的值写进内存,第二个是不是要给你返回一个OK对吧?比如说像这我要查询要给你返回一个操作命令的OK,比如说SK3 V3是不是返回OK或者你。查询的时候是要给你反馈个结果,这些都是需要通过连接以后对应的该写进内存的写进内存,该反馈给客户端的反馈客户端,所以说在这块的时候,兄弟们他呢是这么处理,Red会通过调用先将数据从什么内核空间拷贝到用户台,哎,我是不是传回给去给你嘛,从内存给客户再交给red调用,那么这个拷贝过程是个阻塞的,OK,行,你等着啊,你这个执行操作,呃,你现在呢是要LRA减list遍历一下,那么这是不是有五条记录啊,那我这个时候是不是要把它从内存通过搜ET搬到客户端发送给你啊,那好,当这个数据量越大的时候,拷贝所需要的时间就越多,而这些操作都是基于单线程完成,人们害怕阻塞,那么这个时候我们前面所所说过的red从零到斜到最后写回,那么整个过程是这样,那么尽量的精简把这些耗时IO操作我们这么干。那么下面。
39:52
从RED6开始啊,就新增了多线程的功能来提高IO的读写,它的主要实验思路就像主线程的IO读写任务拆分给一组独立的线程去执行,这样就可以使多个缩的读写并行化,哎,那么采用多路的IO复用技术可以让几个单个线程高效的处理几个多个连接请求,那么就是尽量减少网络IO的时间消耗,哎,将最耗使的缩的读取与解析,这样的话呢?
40:21
类似于用我们的那个I欧多罗妇幼外包出去,你就专心的干这个活,有点类似于现在大家应该明不明白,主线程干活,IO连接专门有一个耗时费劲的单开的这么一个它去处理,所以呢,搁到这儿我们就会明白,剩下的命令仍然有主线程串行的执行,和内存数据进行交互,所以我们把这些涉及到网络IO的单独来了一个IO,那么这儿它就是什么,用一个去监控多个IO线程,哎,然后完了以后的话呢,这有个大管家,你们谁有数据我就扒拉谁,对不对,那么这我们之前说过这么一个东洞来。
41:04
现在我们只有一条线这样一个摆渡车,谁有数据我就耷拉到谁尽量的来给你们呢满足我们就不要拿一个又一个,拿一个溜一个,耗不起这样的资源,所以呢,搁到这儿我们呢,就可以得到我们的结论,综合上面就可以知道网络L的操作就可以有一个。监控来监控多个,它就被优化了,那么所以说其他部分呢,仍然是单线程的,该干嘛干嘛,它呢就是个不错的折中方法,所以RED6开始它用这个多线程架构,甚至到七,它的结论是想这么干,将网络的数据读写、请求、协议解析通过多个IO线程来处理,对于真正的执行命令就是set k1ve来说,仍然是使用主线程,单线程这样的操作一举两得,便宜占尽。那么所以red从六开始就是鱼和熊掌都要兼得,既要还要,首先L多路复幼,它就解决了网络L的问题,是多线程的红焰,第二个单个工作线程,那么保障了线程的安全,又获得了高性能,这样就占尽了单线程的红叶。
42:10
所以这个就是为什么我们red这么快,以及它的多线程特性和L多用相关的讲解,哎,你面试的时候要这样去跟面试官说一下,可能呢。才会有更好的面试机会。好,我们同学们对于粗浅版的艾欧多罗妇幼入门篇就给大家介绍到这儿。
我来说两句