00:00
接下来看一下我们艾欧多路妇幼,它跟unix网络通信接口这块来,各位亲,老规矩先看图,咱们再说上面的笔记和文字请大家看,进程受阻于s select调用,哎,我现在这个s select。就像是一个监听程序,就像一个监考老师,啊,我呢,等待可能多个套接字周任意一个变为可读。这个监考老师正襟危坐,坐在教室的讲台上。下面可能多个考生当中的任意一个老师,我要交卷,一举手好,我这个select是不是立刻从阻塞状态就收到某一个分支,某一个链路,某一个考生,它需要交卷了,所以系统调用这个时候到内核啊,无数据准备好,那么自然而然相当于说这个套节字他要交卷,那么这边我要把它送去批改了,我现在呢是等待数据内核是一个阅卷老师,这个呢,你把它理解为是监考老师好吧,那么调用这哎有一个学生交卷了,你赶快改一下好。
01:18
内核呢,现在还不知道有人交卷呢,对吧?当然是不知道怎么批改,突然有这个select调用,告诉你有了数据上报,返回可读条件等等,好,那么处理了以后,最终将你的分数复制到用户空间放到下面,所以这个就是IO多路复用的模型。那么在这。上面。既没有允许,也没有,所有人都要变。列一句话,等着谁发信号,我就像摆渡车一样去找谁,谁举手,我去收他的卷子,交给后面的阅卷老师。没有太多的陪跑、空转、轮询。
02:01
而且select函数就把这堆代码写进来。那么下面请看一下我们的笔记,IO多了复用,这是一种理念,就是我们说的内核中的这三大函数,在有些技术数据当中也称这种IO方式为event driver IO俗称事件驱动模型,他呢就是通过一种机制,一个进程可以监设多个描述符,一个老师是不是可以监考多个考生,一旦某个描述符就绪,一般是读或者是写就绪了,就能够通知程序进行相应的读写操作,可以基于一个阻塞对象,并同时在多个描述符上等待就绪,而不是使用多线程。那么我们前面是不是说过一种小范围内最优,大范围内无法用的,就是来一个我拗一个我,每次溜一个线程。好理解,好说,但是频繁的尿,频繁的上下文切换,数值量一大也就挂了,那么现在我们就是基于几个一个阻塞对象,并同时在多个描述符上等待就绪,好吧,那么这样大大的节省系统资源。所以埃多罗费用的特点是通过一种机制,一个进程就能够同时等待多个文件描述符,那一个老师就可以监考多个考生,而这些文件描述符也就是套接字,那么在我们Java这边叫soet,你勾上勾了,打到里面了,这个就是我们前面所说的什么鬼。
03:32
简称就是这个什么fd file script,好,那么来,弟兄们他呢,这些文件描述服务器中的任意一个进入读就绪状态,那么这些就可以返回起作用了,好,那么弟兄们把这个说人话的意思是这样的,来。我们模拟啊,现在呢,一个red,或者说某一种TCP服务器,它可以处理30个客服的做的连接,那么类似于一个监考老师监考多个考生。
04:10
我也不下去乱打扰,静静的就在讲台上监考谁举手究竟打谁。那么现在假设这个就是一个监考老师,你要让30个学生解答一道竞赛题,然后负责收卷。监考和收卷子,你有下面几个选择。第一种。按顺序逐个验收,便列负循环ABCDEFG,这中间如果有一个学生卡了,全班都会被耽搁,你用循环变列挨个处理,这个soet根本不具有并发能力,还记不得以前我们说过这张。卡在这后面的二号根本就找不到好不合适,第二种,你创建30个分身线程,每个分身线程检查一个学生答案是否正确,那么这种类似于为每个用户创建一个进程或者线程处理,说过了吧,来一个你一个,来一个你一个可以,但是量大了扛不住。第三种老师呢,就站在长。
05:12
讲台上等着谁解答完成了,请先举手,这个时候CD举手表示答题完成,那么说明是不是在C和D这两个连接套接资产有信号了,要么是读,要么是写A,那这个时候监考老师有应答就下去处理。你下去检查CD的考卷或者答案,哎,看看他们有没有写。联系手机号、准考证号等等,然后继续回到讲台上的EA,又举手又去处理这个,这种就是IO负右模型,Linux下面的这三个函数就是干这个的,所以弟兄们请看。将用户的socket对应的FD注册进我们的一跑,然后底层的一跑,帮你监听哪些socket上面有消息到达了,哎,客户端,比如说我写了个set k位一,那这个时候他说不定这个信号波动了,有数据要进来,我马上就去响应,那么这样就避免了大量的无用操作,精准打击,你也别在这空转了,OK,所以此时的soet应该采用非阻塞的模式,那么这样整个过程只是在调用这三大函数才会阻塞一下,收发客服消息是不会阻塞的,整个进程或者线程就被充分的利用起来,这个就叫事件驱动,也就是说所谓的react反应模式啊。那么弟兄们把这段人话结合我们这个程序,杨哥呢,再给大家做一下笔记。
06:40
也就是说它是这么干的,Linux内核的埃欧多罗复右就是这三大函数select啊,其中一个就是把ni中的用户,它要便利的FD数组,我们现在这个是不是叫我们的要便利的这个数组,也就是我们每一个数据的连接,最后是不是安装进了一个list里面,就这货。
07:03
把它要便利的用户,它要便利的这个数组拷贝到了什么态,内核态,让内核来便利。系统给你完成,因为用户态判断socket是否有数据,还是要调用内核态的。所以拷贝到内核态之后,这样便利判断的时候就不用一直在用户态和内核态之间频繁切换了,我们要做的事就是这个意思,OK,好,那么这个就是我们IO多罗妇幼,从操作系统到我们说人话相关的理解,最终就是我们把这点小心思不要人写了,打进我们的Linux内核方法里面,让他来完成。
我来说两句