基础_各类IO

1. 各类IO

2. NIO相比传统I/O优势:非阻塞IO、面向块读取、支持直接内存访问

(1) 支持按照块的方式读取数据,而不是字节方式,速度快,即用channel读入buffer

(1) 引入buffer,减少磁盘访问次数

(2) 支持内存映射的方式,即将文件直接映射到内存中;

(2) 支持直接内存访问:DirectBuffer, 相比于传统的物理磁盘->内核缓存->JVM缓存->read, 省去了内核到用户缓存的数据复制

(3) 支持非阻塞操作,如SocketChannel,支持连接、读、写操作

(3) 支持Selector,实现非阻塞和控制总线程数,详见《疯狂Java讲义》17.3.7

传统的socket IO中,每个连接创建一个线程,当并发大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大。 NIO,使用Selector,不再需要为每个线程创建单独的线程,可以用一个含有限数量线程的线程池。

总结:

BIO:同步阻塞IO

NIO:同步非阻塞IO

AIO:异步非阻塞IO

注:关于BIO和NIO的理解 http://www.cnblogs.com/zedosu/p/6666984.html

3. Netty: 基于NIO的Selector实现多路复用的异步非阻塞NIO的基础通信组件

Netty是最流行的NIO框架,它的健壮性、功能、性能、可定制性和可扩展性在同类框架都是首屈一指的。它已经得到成百上千的商业/商用项目验证,如Hadoop的RPC框架Avro、RocketMQ以及主流的分布式通信框架Dubbox等等

有了Netty,你可以实现自己的HTTP服务器(HTTPClient&HTTPServer),FTP服务器,UDP服务器,RPC服务器,WebSocket服务器,Redis的Proxy服务器,MySQL的Proxy服务器等等。

ZXB总结:Netty是为了简化高性能网络应用程序的开发,普通网络处理是将接受请求和读写处理放在一个线程处理,NIO默认的Selector是在一个线程池里每个线程处理接受请求和读写操作,而在Netty里面是将Accept连接使用单独的线程池去处理,读写操作又是另外的线程池来处理,现在很多网络通信框架都是基于Netty,如HTTPClient、DUBBO、redis、RocketMQ、tomcat、Nginx等

详见:https://www.zhihu.com/question/24322387 通俗地讲,Netty 能做什么?

猜你喜欢

转载自blog.csdn.net/zxb448126/article/details/81208481