技术编程|NIO-非阻塞的IO
上一篇介绍了BIO , 我们知道 , 阻塞的根本原因是内核系统中处理方法是阻塞的
一.NIO相对于BIO来说 , 是新IO , 或者非阻塞IO , 是内核系统升级后产物
本文插图
上面代码我们看到 , serverSocketChannel.accept()设置成非阻塞后 , 如果没有客户端连接 , 代码会不停地死循环运行 。 同理 , socketChannel.configureBlocking(false); socketChannel.read方法和socketChannel.write方法也是非阻塞的 , 有需要读写的数据 , 直接读写 , 没有的话代码直接往下执行 , 空循环 , 然后再进行下一次循环看看有没有要读写的数据 。
有没有发现一个问题 , 一旦代码不阻塞了 , 方法accept、read、write等就要放在循环体中 , 条件不满足时 , 只能不停的空轮循 。 这种方式显然不好 , 怎么解决呢?可不可以统一交给一个对象来处理 , 让它来负责监控对象serverSocketChannel、socketChannel中有没有需要处理的事情
二.select和poll
(1)select==>时间复杂度O(n)
select()的机制中提供一种fd_set的数据结构 , long类型的数组 , 每一个数组元素都能与已打开的文件句柄(不管是Socket句柄,还是其他文件或命名管道或设备句柄)建立联系 , 当调用select()时 , 由内核根据IO状态修改fd_set的内容 , 由此来通知执行了select()的进程哪一Socket或文件可读 , 无差别轮询所有句柄 , 找出需要处理的 , 对他们进行操作 。 select无差别轮询复杂度 , 同时处理的流越多 , 无差别轮询时间就越长
(2)poll==>时间复杂度O(n)
poll本质上和select没有区别 , 管理多个描述符也是进行轮询 ,但是它没有最大连接数的限制 , 基于链表来存储的
三.epoll和多路复用器
epoll可以理解为event poll , epoll会把哪个流发生了怎样的I/O事件通知我们 , 复杂度降低到了O(1) , 不再是盲目的轮循所有打开的流
不知道大家有没有想到监听器 , 将一堆观察者、被观察者注册到广播器上面 , 当被观察者有事件发生时 , 利用广播器通知特定的观察者 , epoll类似于观察者模式
select , poll , epoll都是IO多路复用的机制 , I/O多路复用就通过一种机制 , 可以监视多个描述符 , 一旦某个描述符就绪(一般是读就绪或者写就绪) , 能够通知程序进行相应的读写操作 。 多路复用 , 说白了 , 就是指一个对象可以反复监控着多个链路通道流上面的事件情况 , selector
四.byteBuffer
缓冲区(Buffer)就是在内存中(堆内或堆外)预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储数据的缓冲区 , 好处:
1、减少实际的物理读写次数
2、缓冲区在创建时就被分配内存 , 这块内存区域一直被重用 , 可以减少动态分配和回收内存的次数
【技术编程|NIO-非阻塞的IO】缓冲区直接为通道(Channel)服务 , 写入数据到通道或从通道读取数据 , 面向可读可写的缓冲区而不是字节流 , 大大提高传递的效率 , 底层本质上是一个数组结构
推荐阅读
- 摄像头|小米截胡中兴屏下摄像头技术,小米研发还是供应链技术?
- 马斯克|马斯克用活猪演示脑机接口技术:实时读取猪脑信息 心灵感应成真了
- 三防|带你了解三防手持终端的秘密
- 第三|原创 小米发布第三代屏下相机技术,或将在Mix 4上首秀?
- 海信|首个新兴显示技术分标委成立 海信牵头制定国标
- 中年|Python编程语言有什么独特的优势呢?
- |马斯克用活猪演示脑机技术,他希望今年年底前能在人体内植入
- 互联网的放大镜|小米截胡中兴屏下摄像头技术,小米研发还是供应链技术?
- 新机发布|原创 小米发布第三代屏下相机技术,或将在Mix 4上首秀?
- 技术|最新《中国禁止出口限制出口技术目录》发布,新增操作系统、密码芯片安全技术