非阻塞式 I/O 模型 【NIO】补充内容

NIO是一种同步非阻塞IO, 基于Reactor模型来实现的。其实相当于就是一个线程处理大量的客户端的请求,通过一个线程轮询大量的channel,每次就获取一批有事件的channel,然后对每个请求启动一个线程处理即可。这里的核心就是非阻塞,就那个selector一个线程就可以不停轮询channel,所有客户端请求都不会阻塞,直接就会进来,大不了就是等待一下排着队而已。这里面优化BIO的核心就是,一个客户端并不是时时刻刻都有数据进行交互,没有必要死耗着一个线程不放,所以客户端选择了让线程歇一歇,只有客户端有相应的操作的时候才发起通知,创建一个线程来处理请求。

NIO模式下,系统调用read,如果发现没数据已经到达,就会立刻返回-1。使用轮询的方式,不断的尝试有没有数据到达。没有得到数据就等一小会再试继续轮询。

NIO解决了线程阻塞的问题 ,但是会带来两个新问题:

  1. 如果有IO连接都要检查,那么就得一个一个的read。这会带来大量的线程上下文切换(read是系统调用,每调用一次就得在用户态和核心态切换一次)
  2. 轮询的休息等待时间无法确定。这里是要猜多久之后数据才能到。等待时间设的太长,程序响应延迟就过大;设的太短,就会造成过于频繁的重试,干耗CPU而已。

相关推荐

  1. 阻塞 I/O 模型NIO补充内容

    2024-07-12 11:00:05       23 阅读
  2. NIO阻塞模式

    2024-07-12 11:00:05       33 阅读
  3. 阻塞IO

    2024-07-12 11:00:05       31 阅读
  4. 高级IO——阻塞IO和select

    2024-07-12 11:00:05       37 阅读
  5. TCP Server工具类,BIO阻塞阻塞NIO

    2024-07-12 11:00:05       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 11:00:05       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 11:00:05       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 11:00:05       57 阅读
  4. Python语言-面向对象

    2024-07-12 11:00:05       68 阅读

热门阅读

  1. 常用的Web前端框架:深入探索与实用指南

    2024-07-12 11:00:05       18 阅读
  2. 使用Python自动识别和合并PDF中的跨页表格

    2024-07-12 11:00:05       19 阅读
  3. 如何用CSS3画一个三角形?

    2024-07-12 11:00:05       23 阅读
  4. Spring Boot实战:无缝对接OpenAI

    2024-07-12 11:00:05       20 阅读
  5. MVVM和MVC的原理以及它们的区别

    2024-07-12 11:00:05       24 阅读
  6. stopSelf 会走ondestory吗? 怎么关闭server

    2024-07-12 11:00:05       24 阅读
  7. YOLOv10单独推理的封装

    2024-07-12 11:00:05       16 阅读
  8. c#的几种通信

    2024-07-12 11:00:05       18 阅读
  9. 前端代码规范

    2024-07-12 11:00:05       19 阅读