我们试想一下这样的现实场景:

一个餐厅同时有100 位客人到店,当然到店后第一件要做的事情就是点菜。但是问题来了,餐厅老板为了节约人力成本目前只有一位大堂服务员拿着唯一的一本菜单等待客人进行服务。

那么最笨(但是最简单)的方法是(方法A),无论有多少客人等待点餐,服务员都把仅有的一份菜单递给其中一位客人,然后站在客人身旁等待这个客人完成点菜过程。在记录客人点菜内容后,把点菜记录交给后堂厨师。然后是第二位客人。。。。然后是第三位客人。很明显,只有脑袋被门夹过的老板,才会这样设置服务流程。因为随后的80 位客人,再等待超时后就会离店(还会给差评)。

于是还有一种办法(方法B),老板马上新雇佣99 名服务员,同时印制99 本新的菜单。每一名服务员手持一本菜单负责一位客人(关键不只在于服务员,还在于菜单。因为没有菜单客人也无法点菜)。在客人点完菜后,记录点菜内容交给后堂厨师(当然为了更高效,后堂厨师最好也有100 名)。这样每一位客人享受的就是VIP 服务咯,当然客人不会走,但是人力成本可是一个大头哦(亏死你)。

另外一种办法(方法C),就是改进点菜的方式,当客人到店后,自己申请一本菜单。想好自己要点的才后,就呼叫服务员。服务员站在自己身边后记录客人的菜单内容。将菜单递给厨师的过程也要进行改进,并不是每一份菜单记录好以后,都要交给后堂厨师。服务员可以记录号多份菜单后,同时交给厨师就行了。那么这种方式,对于老板来说人力成本是最低的;对于客人来说,虽然不再享受VIP 服务并且要进行一定的等待,但是这些都是可接受的;对于服务员来说,基本上她的时间都没有浪费,基本上被老板压杆了最后一滴油水。

如果您是老板,您会采用哪种方式呢?

到店情况:并发量。到店情况不理想时,一个服务员一本菜单,当然是足够了。所以不同的老板在不同的场合下,将会灵活选择服务员和菜单的配置。

客人:客户端请求

点餐内容:客户端发送的实际数据

老板:操作系统

人力成本:系统资源

菜单:文件状态描述符(FD)。操作系统对于一个进程能够同时持有的文件状态描述符的个数是有限制的,在linux系统中$ulimit -n 查看这个限制值,当然也是可以(并且应该)进行内核参数调整的。

服务员:操作系统内核用于IO 操作的线程(内核线程)

厨师:应用程序线程(当然厨房就是应用程序进程咯)

方法A:同步IO

方法B:同步IO

方法C:多路复用IO

目前流行的多路复用IO 实现主要包括四种:select、poll、epoll、kqueue。下表是他们的一些重要特性的比较:

IO模型 相对性能 关键思路 操作系统 JAVA支持
select 较高 Reactor windows/Linux 支持,Reactor 模式(反应器设计模式)。Linux 操作
系统的kernels 2.4 内核版本之前, 默认使用
select;而目前windows 下对同步IO 的支持,都
是select 模型。
poll 较高 Reactor Linux Linux 下的JAVA NIO 框架,Linux kernels 2.6 内
核版本之前使用poll 进行支持。也是使用的
Reactor 模式。
epoll Reactor/Proactor Linux Linux kernels 2.6 内核版本及以后使用epoll 进行
支持;Linux kernels 2.6 内核版本之前使用poll
进行支持;另外一定注意,由于Linux 下没有
Windows 下的IOCP 技术提供真正的异步IO 支
持,所以Linux 下使用epoll 模拟异步IO。
kqueue Proactor Linux 目前JAVA 的版本不支持。

多路复用IO 技术最适用的是“高并发”场景,所谓高并发是指1 毫秒内至少同时有上千个连接请求准备好。其他情况下多路复用IO 技术发挥不出来它的优势。另一方面,使用JAVA NIO 进行功能实现,相对于传统的Socket 套接字实现要复杂一些,所以实际应用中,需要根据自己的业务需求进行技术选择。

通道Channel-IO 多路复用相关推荐

  1. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_2整起~IO们那些事【包括五种IO模型:(BIO、NIO、IO多路复用、信号驱动、AIO);零拷贝、事件处理及并发等模型】

    PART0.前情提要: 通常用户进程的一个完整的IO分为两个阶段(IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者!):[操作系统和驱动程序运行在内核空间,应用程序运行在用户空间, ...

  2. IO多路复用和Reactor模型

    目录 1.同步阻塞式IO - BIO 2.同步非阻塞式IO - NIO 2.1 Selector 选择器 2.1.1 SelectionKey 2.1.2 Selector注册事件类型 2.2 Cha ...

  3. Linux IO多路复用之Select简史

    内容目录 前言早期的UnixTCP/IP诞生后终端复用套接字章节回顾结论引用 前言 最近我一直在思考 Linux 中的多路复用,即 epoll(7)[1]系统调用.我很好奇 epoll与Windows ...

  4. 【Netty】NIO 选择器 ( Selector ) 通道 ( Channel ) 缓冲区 ( Buffer ) 网络通信案例

    文章目录 I . NIO 通信 服务器端 流程说明 II . NIO 通信 服务器端代码 III . NIO 通信 客户端 流程说明 IV . NIO 通信 客户端代码 V . NIO 通信 示例运行 ...

  5. 【Netty】NIO 通道 ( Channel ) 组件

    文章目录 I . 通道 ( Channel ) 概念简介 II . 通道 ( Channel ) 常用类 III . 常用的 通道 ( Channel ) 之 套接字通道 ( SocketChanne ...

  6. 【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )

    文章目录 I . NIO 模型 II . NIO 三大组件交互流程 III . NIO 缓冲区 IV . NIO 与 BIO 对比 V . NIO 线程分配 VI . 缓冲区 ( Buffer ) 示 ...

  7. java 通道 双向原理_Java-NIO(四):通道(Channel)的原理与获取

    通道(Channel): 由java.nio.channels包定义的,Channel表示IO源与目标打开的连接,Channel类似于传统的"流",只不过Channel本身不能直接 ...

  8. Java NIO_I/O基本概念_Java中的缓冲区(Buffer)_通道(Channel)_网络I/O

    I/O基本概念 缓冲区基础 缓冲区是I/O的基础, 进程使用read(), write()将数据读出/写入从缓冲区中; 当缓冲区写满, 内核向磁盘发出指令, 将缓冲区中数据写入磁盘中(这一步不需要CP ...

  9. java httputil_Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型

    本文转载自:https://github.com/jasonGeng88/blog 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 http ...

  10. IO 模型 IO 多路复用

    IO 模型 IO 多路复用 IO多路复用:模型(解决问题的方案) 同步:一个任务提交以后,等待任务执行结束,才能继续下一个任务 异步:不需要等待任务执行结束, 阻塞:IO阻塞,程序卡住了 非阻塞:不阻 ...

最新文章

  1. Unicode编码完全探究(三)之联通乱码
  2. 炸金花的JS实现从0开始之 -------现在什么都不会(1)
  3. CH5E02 花店橱窗【线性DP】
  4. 【自动群发小助手】微信也能定时发送消息?过年终于不用熬夜守点发祝福了~
  5. jqgrid常用操作
  6. 【CentOS Linux 7】实验5【Samba服务器管理】
  7. boost::gil::channel_traits用法的测试程序
  8. 2017/Province_C_C++_A/2/跳蚱蜢
  9. Linq 读取Xml 数据
  10. PHP 如何得到当前页面中所有已定义的变量和常量
  11. mysql第四章分页显示查询出租房屋信息_MYSQL必知必会读书笔记第四章之检索数据...
  12. linux操作命令等积累
  13. python 开发工具_一个极具意义的 Python 前端开发工具
  14. SpringMVC-高级参数绑定
  15. 监控系统哪家强?eBay 在监控系统上的实践应用!
  16. r语言 tunerf函数_R语言非参时间序列(六):波动脉冲响应(VIR)中的关键公式推导...
  17. 如何在Java中将字符转换为ASCII
  18. HP MSL6030 磁带库异常fault code:3106
  19. 转载 信号量 第六篇
  20. Unity android平台读取文件

热门文章

  1. 计算机网络(谢希仁 第七版) 数据链路层 个人笔记
  2. Python自动化开发课堂笔记【Day13】 - 前端补充(HTML CSS)
  3. 简明Vim练级攻略(转载)
  4. 设计——主观理想路径
  5. 设计模式原则总结--读《大话设计模式》有感 转
  6. C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
  7. 容器内存释放问题(STL新手笔记)
  8. spi 外设驱动(spi_driver)
  9. 【java reflection】反射工具类总结
  10. 【JFreeChart】JFreeChart—输出柱形图