00:00
来,同学们一跑,开工。首先什么时候?2002年,哎,距离此也是21年前的事儿了,被大神戴维德立本知道所发明的,那么它的原理和方法又是什么呢?首先啊,兄弟们慢一。明摆着说了,Ins都和他有很大的渊源呀,杨哥变了。请看IO事件通知相关的模型一来吧,它不再是某个具体的函数了,大家有没有发现?他把它一分为三。E create e CL e wait。功能更强大,思路都跟以前不一样了,所以呢,各位同学撸一遍来吧。
01:00
我们呢一步步来,它首先呢是由三段所构成,第一个epocrite int size,哎,这个就是我们创建这么一个一跑,它申请空间的一个建议值是多少有点类似于啊,接近类似啊,我们呢,写了个什么,你list,那么是不是就是一个object数组初始值为十,OK,类似于这样啊,那么第二个我们大家请看这个叫E跑ctl。那么这有12344个值,其中这又有一个叫一抛,你问他来吧,那么这个一抛你问他又是一些什么鬼,我们挨个挨个先说啊,这个ru呢,是结构体。事件和数据,那么在这这个疑问就是以下几个宏的集合,这种红是也是一种结构体的一种说明啊,我们就不再展开了,你就记着in。
02:08
干嘛是读out,是写好,那么相当于说在这块我们呢,这个呢,Control有点类似于啊,倒着可以看一下这个一泡1EVENT,就是要告诉内核要监听一个什么样的事件,这个事件是什么,有哪些数据,说白了这个事件就是两个,要么是读,要么是写,你读哪些操作,写哪些操作,读哪些数据,写哪些数据好。那么这个呢,就是我们这个ctl中间这个创建了以后开始监听排列控制,那么这个叫E跑FD是epo create的返回值啊,多少个FDA我们说过它是不是有个int类型对吧?O操作用三个宏来表示添加。CT lad,删除是delete,修改是MOD3操作对FD的写的写操作的监听FD,这个就是你需要监听的FD文件描述符,OK,什么事件在发生在哪个上面?好,你接下来这时你创建了什么,我给你打包弄过来,那么对它们进行哪些细化的操作?接下来这个是为来吧。
03:26
EPFD同刹,这个呢,是结构器E这么一个世界封装,那么max events和timeout超时等等和最大的事件接受器来给你写好再看这啊,这个size并不是限制了E所能监听数据符的最大个数,只是对内核初始分配内部数据的一个建议,OK,好,第二个见上图,我们已经说的很清楚了。最后一个是wait,等待EP1跑FD上面的IO事件最多返回这么多个事件参数疑问词,用来从内合得到事件的集合,这个告诉内核这个事件有多少个,有多大,好了解一下这个我们来看一下它的三步调用,那么1CREATE。
04:20
Control wait来,首先这个create就是创建了一个一柄,那他的活就干这货好一个建议值,准备要干多大一票,这个呢是向内核。增删感写操作对应要监控的文件描述符来兄弟们就是这个最后这个1WAIT,我们干嘛呢,我们呢老。他类似发起了slack调用,哎,监考老师来了。等着。好,那么这三个完成以后,我们的C语言代码是这的,请看一跑是非阻塞非阻塞啊。
05:09
首先当有数据的时候,会把相应文件描述符置位,但是一跑没有事件标志位,所以并不是真正的知位,这个时候他会把数据的文件描述放到什么对手?第二个一会返回有数据文件描述符的个数,第三一个根据返回的个数读取前N个文件描述符就行了,什么意思?那是不是就不用变历了?最后读取和处理,来,兄弟们请看。这个呢,事件在内核开辟一块空间,按照建议用来存放一中。FD的数据结构啊,EPFD,假设这是十个,那么来还是模拟五个顾客一号装FD数据结构中呢,和破中差不多,只是没有这个世件好,那么来。
06:09
一圈except这些不再多说了。那么这。Ctl e ctl把每一个缩的FD数据放到我们这个,它串进了内存空间当当中来,注意啊,下面精彩的就在这。一这wait n f DS就说阻塞只有当1CREATE中创建的内存空间中有。各种事情发生,读写操作了,才会把这些FD放到就绪列表当中,返回就学FD的各所,我一个老师监考30个考生,有四个考生举手了,那么有几个有信号,我就监控几个,请看好,这有个关键,以前我们玩slack的时候,C源代码。
07:00
我我我便列好一跑。五五变列好,而这个时候,同学们请看,还是五吗?不一定啊。我不用全部变列,我只是遍历就绪的链表来读取数据就行了,OK,好,那么这个时候我们呢,通过上面。对应的调换,创建、控制,加载,有事件的装进来,然后为套干嘛得到?NFDSF便利就绪的读取数据,有事情打扰,无事情不打扰。所以最终我们的结论。来吧。多路复用right engines,它高效快的原因就在于操作系统提供了这样的底层内核函数的支持和调度,使得原来的外要循环里面的多次调用系统变成了几次调用,一次调用,就在那等着内核成便利这些文件描述符。
08:09
好,那么一跑是现在最先进的IO多的复用器,不是这一圈都用,那么这里的多落就是多个网络所给的连接客户端,复用是指复用同一个主的线程,也就我们刚刚之前所说的那个主线程是不是同一个进程嘛,OK,一个监考老师监考多个学生讲完了,所以一个数据的生命周期中只有一次是从用户态拷贝到任核,他的过程开销极小。第二个使用事件的通知机制,每次soet当中有数据会主动通知内核,并加入到就学列表当中,不再需要便利所有的soet举手才去找你。所以弟兄们在多路复用的模型当中会有一个内核线程,不断的去轮寻多个缩的状态,只有当真正的读写事件发生的时候,它会调用实际的读写操作,因为在多落复用IO模型当中,只需要使用一个线程就可以管理多个so系统,不需要建立新的进程或者是线程也不用维护,并且只有真正的有读写事件进行的时候才会使用IO资源,所以它大大减少了资源的占用,OK,那么。
09:21
这个也就是我们的结论,所以蓝色这段大家看一下,我就不再照本宣科那么一句话一跑,只允许那些真正发出的事件流有数据要处理的我。挨个做听到,那么在这样的话,我们呢,就尽量减少了网络IO的时间消耗,那么。并且在内存当中也比较快,那么内核弹处理了内存中也比较快,所以说。这样的我们的ready才会得到了我们的高性能,那么最终同学们三个方法给大家进行一下对比,来,现在咱们都是用这个。
10:06
第一个它是靠变列,它是靠变列,它靠什么回调,哎,它不是全部都找一遍,谁有事拉回去,数据结构这个是用bit map,这个是用数组,这个是用什么红黑数,当然啊,在这块我们就不再过多的展开了,好最大的连接这个是1024,这个无上限。那么来最大支持的文件描述符合一般有最大限制,而这个就是6553符啊,你也一般不会把它连满,那么所以说我们大家呢,来看看FT的拷贝,每次调select都需要把FD集合从用户态拷贝到内核台,而这个是每次调都需要对吧,每一跑直接干FD,首次调用字T了拷贝,每次调用这个位就不拷贝了。所以最终的话呢,我们用一跑事件通知的方式,每当FD有就绪的,系统注册的回调函数就会被调用,将旧绪的FD放到我们的那个容器里面,时间复杂度只是O1,而这两个都是OOK,好,那么同学们,这个就是我们对于三大C元函数的一个简单介绍。
我来说两句