浅谈IO模型

18 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值