我们写客户端:
-----------------------------------------------------31-------------------------------------------------
写启动代码。
总结:看文档。
select是阻塞的。
--------------------------------------------------------------32--------------------------------------------------------------
零拷贝:
传统的IO经过四次拷贝和三次切换。
read方法:
零拷贝:https://blog.csdn.net/keil_wang/article/details/86688271
第零步:拷贝到硬盘上去。
第一步:硬盘上的数据通过DMA拷贝到内核。
第二步:内核数据用cpu拷贝到用户的buffer。
第三步:数据在用户buffer修改,然后cpu拷贝到socketBuffer。
第四步:DMA拷贝到协议栈。
传统的IO拷贝的次数是非常多的。
-----------------
内存映射:https://blog.csdn.net/paxhujing/article/details/80255526
零拷贝:https://www.jianshu.com/p/7863667d5fa7
-----------------------------------------
三次拷贝两次切换,取消用户态。
---------------
零拷贝是没有cpu的拷贝的,这个是实质。
-----------------------------------------------------33-------------------------------------------------
NIO里面的0拷贝:
解释:
----------------------------------------------------34--------------------------------------------------
有效请求才启动线程。
总结对比:
-------------------------------------------------35---------------------------------------------------------
------------------------------------------------------------------------------
netty
异步的基于事件驱动的网络框架。
4.1.2版本我们去讲。
-------------------------------------------------36---------------------------------------------------------
netty得线程模型。
netty是主从的reactor模型。
-------------------------------------------------37---------------------------------------------------------
多个连接共用一个阻塞对象,这个是经典,就是select方法。
reactor的三种实现:
每个线程在handler的read方法是注册的。
这个只要一个serviceHandler进行阻塞。
我的理解:就是开始serverSocketChannel注册一个accept事件,然后selector开始select这个事件(这个是阻塞的),有连接,创建一个socketChannet,注册到selector一个read事件,这样就有两个听到了,继续轮询,拿到read事件,会去找channel,在channel里找到缓冲区,去取出数据。
传统的NIO到这里是阻塞的:
并且没有分配线程去执行。
-------------------------------------------------38---------------------------------------------------------
单Reactor单线程。
这个就是传统的模型。
参照聊天系统。
统一封装为handler:
这个模型也就是传统的NIO模型是有问题的,可能会有阻塞的。
一个线程处理多个请求,其实就是减少了线程,但是效率很低了。
验证单reactor单线程的缺点。00:06:14 一个阻塞了 其它的就都完了。
-------------------------------------------------39---------------------------------------------------------
其实多线程是按照请求进行线程,就是事件来了才会创建线程,而不是像之前那样的一个连接是一个线程。
单Reactor多线程。
是连接请求就创建一个handler相当于一个socketchannel。
费时的逻辑 放在线程里面。
-------------------------------------------------40---------------------------------------------------------