浅谈IO模型

IO是(input/output)
有内存IO、磁盘IO、和网络IO
两组关键词
同步/异步 :同步是当前工作线程主动的接受IO操作完成返回结果,异步是当前工作线程被动的
获取到IO操作结果,通过状态、通知、回调等方法
阻塞/非阻塞 :是指当前是否“持续”等待这IO操作结果的返回

UNIX环境下有五种IO模型
同步阻塞IO、同步非阻塞IO、IO多路复用、信号驱动IO、异步非阻塞IO
java基于这五种IO模型,设计了三种常用的网络IO模型
BIO、NIO、AIO

BIO:每一个请求到达,都创建一个新的线程来处理这个套接字,完成对客户的响应
缺点是:并发性差,无法处理大量连接

NIO
主要是依赖于selector选择器,他会轮询每个连接,是否准备好了,然后进行处理
创建ServerSocketChannel,绑定端口号,设置为非阻塞的
开启选择器
将ServersocketChannel注册到Selector中
Selector遍历准备就绪的channel
编程复杂
并发性高

// 创建通道和选择器
            ServerSocketChannel socketChannel = ServerSocketChannel.open();
            Selector selector = Selector.open();
            InetSocketAddress inetSocketAddress = new InetSocketAddress(
                    InetAddress.getLocalHost(), 4700);
            System.out.println(InetAddress.getLocalHost());
            socketChannel.socket().bind(inetSocketAddress);
            // 设置通道非阻塞 绑定选择器
            socketChannel.configureBlocking(false);
            socketChannel.register(selector, SelectionKey.OP_ACCEPT).attach(
                    id++);

注意register()方法的第二个参数。这是一个“interest集合”,意思是在通过Selector监听Channel时对什么事件感兴趣。可以监听四种不同类型的事件:

Connect
Accept
Read
Write
通道触发了一个事件意思是该事件已经就绪。所以,某个channel成功连接到另一个服务器称为“连接就绪”。一个server socket channel准备好接收新进入的连接称为“接收就绪”。一个有数据可读的通道可以说是“读就绪”。等待写数据的通道可以说是“写就绪”。

AIO
future/promise + callback 的异步模型
future是一个结果的占位符,promise则是基于future,添加了主动设置结果成功失败的方法

借鉴:
http://www.importnew.com/22019.html

猜你喜欢

转载自blog.csdn.net/qq_32635069/article/details/80216311
今日推荐