00:00
好吧,那么接下来呢,咱们继续往下讲,叫做NNAO,对吧?我们说NNANA和传统的IO呢,还有一个很大的一个区别,那就是说传统的这个IO它是阻塞式的,而AO它是非阻塞式的,而且我们说这个阻塞与非阻塞,那是相较于这个网络通信,也就是网络IO而言的,那人们到底什么叫做阻塞,什么叫做非阻塞,也说传统IO和七个O对反络空气到底有什么区别呢?那么过来呢,我们首先了解了解什么是阻塞与非阻塞,我们画幅图对它进行一个理解,那么首先说比如说我们说要进行网络通信的话,那是不是就是网络的两端,一个是客户端,一个是服务端之间进行通信呢?对吧?那比如说这边是我的客户端,这边呢是我们的服务端,对吧,这个这边是客户端,比如说这个叫做client,那相应的呢,这。
01:00
边呢,是服务端知道做server对吧,那么还是我们说讲这个网络玩意话,它实际上整体我们说它完成这个,呃,文件的复制,它是不是也得有这个,就是在我们本地的系统系统上,或者说在我们服务端这个系统上,它也得有数据从内核空间拷回到网络,呃,Copy回到用户空间的这个一个过程,对吧?所以说这个呢,我们也给它画上得了,说一面在服务端这里边呢,肯定会有一个叫做叫做用户地址空间,对吧,用户地址空间就把这个画画的全一点,嗯,字体来个啥可以,然后呢,相应的那是不是也得有个叫做内核地址空间呢?对吧,我们说你只要想完完成这个数据的传输,是不是一定得通过这几个过程啊,对吧,还有一个叫做内核地址。
02:00
空间,那么我们说,那如果用传统的这个IO,它是阻塞式,说什么是阻塞式呢?我们当客户端发送一个请求给服务端以后,当客户端发送一个请求给服务端以后,那么如果说服务端不能确定负这个客户端发过来的这个读写请求的数据真实有限时,对吧?那么这个时候该线程它会一直处于一个阻塞状态对吧?说如果客户端发送一个读写请求,比如说这是一个读写请求read对吧?或者是right对吧?当客户端发送的读写请求点服务端时,那么服务端如果不能够判断客户端发送的这些读写请求里边的数据真实有效时,对吧?或者不能完全确定这里边有数据的时候,那么这个时候呢,这个线程会一直处于阻塞状态对吧?也就。
03:00
服务端会等待,客户端什么时候发送过来有数据了,服务端是才开始进行工作呀,但是此时在此期间在等待的这个过程当中,那么服务端的这个线程,它此时是任何事情都做不了的,我们说这个服务端中到底如何判断说客户端发过来的数据有没有效,有没有有效数据呢?说白了我发当你从网络客户端网络发送一些数据,那实际上是不是先到内核地址空间呢,对吧?说白了服务端呢,它就是判断在这个内和地的空间这里有没有数据,如果没有数据,那么服务端就等待,也就是该线程就处于阻塞状态,那就是说什么时候就内核地址空间涌数据了,什么时候把内核地址空间中的这个数据copy到用户地址空间,然后说读到我们程序中来啊,那我说在阻塞期间,服务端的这个线程此时是不会做任何的其他事情的,将一直等待,那么我们说。
04:00
啊,那这就意味着什么呀,那什么说呢?占用的资源,此时这个资源这个线条它从客端任何事情,那也就意味着那当我们客户端有大量的请求发送过来以时,那么前面那个完成不了,那后边呢,能完成吗?那是不是就形形成一个就是队列呀,就是出现了这种排队现象了,因此我们说CPU的资源我们说没有很好的去利用了,最终造成的结果呢,是性能会急剧的下降的,那么我们说,那原来我们是怎么解决这个问题的呢?谁能想到,哎,那说的多线程啊,现在某一个线程组错了,那原来我们怎么解决这个问题,那就是多个线程怎么都同程呢?我们说我们的服务端为每一个客户端发送过来的请求是单独给他分配一个线程,对吧?所为每一个客户端发送过来的请求呢,都给他分配一个独立的线程用于完成任务,那么我们说哪怕是一个线程处于了阻织的状态,其他的线程是不是可能还正在运行啊,那这样的好处就相较于原来,那这也就是多线程的一个好处,那是不是就能尽可能的去利用CPU的资源了呀,对吧?某一个线程如果处于阻塞状态的时候,那么其他的线程还会在工作呢?我是不是多线程解决原来这种IO阻塞问题?
05:34
这不吧,但是啊,我们说那即便是用了多线程,我说那你一个应用服务器上它的线程数量它总是有限的吧,那也就说那一旦没几个线程处于了阻塞状态,那后边的这些请求的是依然过不去呢,它依然有一些线程处于阻塞状态,那么处于阻塞状态就意味着那此时当服务端在等待客户端那个数据的时候,那这个时候这几个线程是不是就做不了其他的事情,那含义就是说,虽然相较于原来CPU的利用率变好了,但是这个C此时CPU的利用率并没有完全的体现出来吧,也就是说在阻塞期间,我这线程还是不能做任何的其他事情。
06:21
所以得到的结论就是线程还是没有100%合理的进行一个利用,那这就是传统IO阻塞式的一个缺陷就是吗?那么因此我们说现在的new IO它是不是叫非阻塞式啊,那么说非阻塞式又是怎么回事呢?对吧,我把这个呢,我再拷背一份这主塞明白没有,那我说什么是非阻色式呢?我们说那还是对吧,一面是服务端,一面说还是客户端呢,对吧,一面是还是客户端,比如说这叫做client,对吧,In。
07:02
那么我说这个是n noo的对不对,非阻塞模式对吧,说什么是非阻塞式,那么大家这个时候呢,要牵合一个新的概念,我们说NNAO,他完成非组塞模式,他提出了一个比较核心的一个东西,叫做什么呢?叫做选择器,叫做一个叫做选择器也是selector,这叫做选择器的东西,说这个选择器是干什么的呢?我们说当然我们说用了这个NL,不要忘了我们现在传输句是不是用通道加缓冲区呢?以及现在的这个核心是不是叫选择器呀,那么选择器它主要是用来干什么的呢?我们说选择器它会把每一个通道对吧,每一个通道都注册到该选择器上,我说你把每一个用于传输数据的通道呢,客户端服务。
08:03
之间,每一个用于传输数据的通道呢,都会注册到该选择器上,而这个选择器的作用是监控这些通道的IO状况,是不是,那我说监控这些通道的什么状况呢?那无非那是这些通道,那数据什么读啊写呀,连接呀,接收数据的情况啊,就等等这么几种情况啊,所以说我们说大家客户端与服务端之间的这些建立的这些通道呢,都会注册到这个选择器上,我这一个个的横线表示一个个通道,听明白吧,我们说了这些通道呢,都会注册到这个选择器上,然后用选择器去实时监控我们这些通道上的一个状况,监控你这个通道上的状况,那么也就是说,如果说当某一个通道上,某一。
09:03
一个请求的试件准备完全准备继续学,那么选择去才会将这个任务分配到服务端的一个画多个的线程上再去运行,比如说什么意思呢?比如说当客户端发送了一些数据,是不是给服务端呢?对吧,那这个时候,此时这个通道是不是在这个选择器上注册着呢?这个选择是负责时时刻刻的去监控这个通道吧,监控可以说监控几种状态,其中那是不是就是一种就是读数据的状态啊,对吧?说当客户端发送过来这个这个通道他的这个数据完全准备就绪了以后,完全准备就绪了以后,那么这个时候选择器才会将这个任务分配到服。
10:03
末端的一个或多个线程上,这能听懂吗?对吧,也就是说当准备就绪对吧?准备就绪后,那么这个时候选择器才会将这些这个任务分配到服务端的一个或者是多个线程上再去运行。那么这就意味着什么呢?就意味着如果客户端的这些请求他没有准备就绪时,那意味着我们服务端怎么样?哎,这个时候服务端的是能够是想干什么就干什么呀,他依然可以完成各自的任务啊,对吧,依然可以完成其他任务,直到什么时候各端的任务完全准备就绪以后,那这个时候是不是才把这个任务分配到服务端的某一个线情上啊,对吧,分配到服务端的一个或者是多特线形上,那也就意味着现在这种非组算是相较于我们刚才那种主线式的话,它是不是更能进一步的利用你CPU的资源呢?对吧,也就说你这个数据不准备正确的时候,我是什么,就是不管你的,我依然可以完成其他的事情,是这个意思吧,那就如同什么意思呢?组分分析测试说怎么去理解对吧,举个简单的例子,比如说呢,大家去这个。
11:28
大家收个快递吧,对吧,比如说收快递,收快递的时候呢,比如说你呀,呃,预测到了对吧,比如说预测到这个快递呢,大概今天下午一点的时候到,然后呢,你差不多这个12:50的时候,你是不是就就跑到大门口去等着人家快递啊,对吧?那在这这个期间,人家快递他没来,你是不是就一直在那等着,那这个时候呢,你就在那一直等,一直等,那可能你也做不了其他的什么事情吧,对吧,你可能也做不了其他的什么事情,那这个时候呢,你的资源是不是就被占用了呀?那么通常我们说一般的情况,我们是怎么做的呢?
12:03
我是不是在家等啊,对吧,什么时候朱证给我来电话了,说他已经完全到达我的大门口了,那这个时候我是不财会一起把快递取过来啊,那这样的话,那么就是在他打电话以前,你说该干什么干什么,那这就是资源的一个利用的问题,对,也就是阻塞和非阻塞模式的一个区别,非阻塞模式指的就是当注册在该选择器上,是的所有的任务完全准备就绪以后,才把这些任务分配到服务端的一个或者是多个线程上再开始运行,那就相较于来更能进一步的利用你CPU的资源,那这就是阻塞源,非阻塞好了,那这个些知道了以后呢,那接下来呢,我们就使用A完成一个网络统信。
我来说两句