回顾
  上次博客结尾的时候简单提到了多路复用技术。在I/O编程过程中,如果需要多个客户端接入请求时,可以利用多线程或者I/O多路复用技术进行处理。I/O多路复用技术是通过把多个I/O的阻塞复用到同一个select的阻塞上,这样程序在单线程情况下可以同时处理多个客户端请求。这与多线程实现相比较,I/O多路复用的最大优势是系统开销小,系统不需要创建多余线程或者线程池,减少了系统维护的工作量。那么I/O多路复用模型的应用场景有哪些呢?
服务器需要同时处理多个处于监听状态或者多个连接状态的套接字
服务器需要同时处理多种网络协议的套接字

  在目前支持I/O多路复用的系统调用有select、pselect、poll、epoll,在Linux网络编程中,在很长的时间内都是使用了select做为轮询和网络事件通知,但是在前面的分享中我们提到了一个概念,利用select在最大文件打开数上有一定的限制,所以在新的Linux中找到了一个epoll作为替代,当然epoll和select原理是比较相似的,但是为了克服select的缺点,epoll做了很大的优化。

1.支持一个进程打开的socket描述符(FD)不受限制(仅受限于操作系统的最大文件句柄数)
  我们知道select的最大的缺点就是单个线程打开的FD是有限的,它由FD_SETSIZE来设置,默认是1024,对于有千万级的TCP连接来说这个数量有点少。当然可以重新编译内核来实现扩展,但是这样做的就会导致网络效率的下降。这就出现了之前提到的多线程多进程解决方案。在Linux上创建进程的消耗比较小,但是如果数量较大的话也是不可被忽视的。进程间的数据交换是一个复杂的过程,对于Java来说没有共享内存,需要通过Socket通信或者其他的方式进行数据同步,这就会导致额外的性能消耗,同时增加了程序的复杂度,所以是一种不完美的解决方案。在新的Linux中epoll并没有这个限制,它所能支持的FD上限就是操作系统所能支持的最大文件句柄数。当然这个数字远大于1024.这个文件句柄数可以通过 cat /proc/sys/fs/file-max 来查看。通常这个值与操作系统内存有关。
2.I/O效率不会随着FD的数目增加而线性下降
  在传统的select/poll中另外的一个硬伤就是,当select集合较大的时候,由于网路延迟或者出现空的链路,在执行过程任意时刻只有少数的一部分select是活跃状态,但是select/poll每次调用都会扫描整个集合。整个就导致效率处于一个线性下降的状态。而epoll则不会出现整个问题,它只会对于活跃的socket进行操作,这个原因是内核实现中epoll是根据每个fd上的callback函数实现操作,这就是说只有它处于活跃状态socket才会去调用callback函数,其他的处于idle状态的socket则不会被调用callback。这里这个epoll的操作实际上是一个为AIO。针对epoll和select的性能对比,如果所有的socket都处于活跃状态,例如一个高速的LAN环境,epoll并不比select/poll效率高,相反,如果过多的使用epoll_ctl,效率相比还有稍微的下降,但是如果使用idle connections模拟WAN环境,epll的效率就远在与select/poll之上。
3.使用mmap加速内核与用户空间的消息传递
  当然使用select/poll还是epoll都是需要内核把FD消息通知给用户空间,那么如何避免不必要的内存复制就是个问题,在epoll中通过内核和用户空间mmap同一块内存实现。
4.epoll的API相对简单
  epoll的API使用包括创建epoll描述符、添加监听事件、阻塞等待所监听的事件发生,关闭epoll描述符等等。
  值得一提的是,用来克服select/poll 的方式不止只有epoll,epoll只是一种Linux的实现方案。在freeBSD下有个kqueue等,但是这个实现的逻辑比较复杂也是一个比较老的实现方式所以这里就不再过多的说明。

Netty入门笔记-I/O多路复用技术相关推荐

  1. Netty入门笔记-Linux网络I/O模型介绍

    在之前的博客中并没有将关于Netty的知识系统的总结起来.从这篇博客开始就将关于Netty的有关知识点总结起来顺便提升自己的分析问题的能力,通过博客分享的形式将学习的知识点形成体系,希望也可以帮助大家 ...

  2. Netty入门笔记-BIO编程

    导语   对于网络编程来说最为典型的就是基于客户端.服务器的C/S模型.也就是说客户端有一个线程,服务器端有一个线程,两个线程之间进行相互的通信.其中服务器段提供的是数据的信息,例如IP端口以及数据等 ...

  3. 个人学习笔记——庄懂的技术美术入门课(美术向)19

    个人学习笔记--庄懂的技术美术入门课(美术向)19 1 顶点平移 2 顶点缩放 3 顶点旋转 4 综合应用 1 顶点平移 2 顶点缩放 方法类似 避免产生负值 3 顶点旋转 方法类似 以下是涉及到的一 ...

  4. 个人学习笔记——庄懂的技术美术入门课(美术向)01

    个人学习笔记--庄懂的技术美术入门课(美术向)01 0 前言 1 工程搭建示范 2 理论 2.1 结构(struct) 2.2 渲染管线 3 操作 3.1-2 向量/标量/点积等若干线代基础 3.3 ...

  5. 个人学习笔记——庄懂的技术美术入门课(美术向)07

    个人学习笔记--庄懂的技术美术入门课(美术向)07 1 单色环境光 2 三色环境光 3 投影 4 光照模型组合 有关AO的知识之前涉及到就是 SSAO的实现了,可以回顾下 1 单色环境光 环境光加上环 ...

  6. 个人学习笔记——庄懂的技术美术入门课(美术向)02

    个人学习笔记--庄懂的技术美术入门课(美术向)02 1 作业点评 2 作业批改 2.1 作业1 2.1.1 模拟高光 2.1.2 菲涅尔 2.1.3 叠加模式 2.2 作业2 2.2.1 关于屏幕UV ...

  7. 个人学习笔记——庄懂的技术美术入门课(美术向)12

    个人学习笔记--庄懂的技术美术入门课(美术向)12 1 作业示范 2 答疑 3 作业示范思路 4 作业实现·准备 5 作业实现·光照模型 6 作业实现·细节 7 开源Shader 该课是在13课之后上 ...

  8. 个人学习笔记——庄懂的技术美术入门课(美术向)04

    个人学习笔记--庄懂的技术美术入门课(美术向)04 1 作业点评 2 作业答案 2.1 半Lambert 2.2 SSSLut 2.3 批改 2.3.1 批改1 2.3.1.1 分层 2.3.1.2 ...

  9. 个人学习笔记——庄懂的技术美术入门课(美术向)08

    个人学习笔记--庄懂的技术美术入门课(美术向)08 1 作业点评 2 作业批改 3 法线贴图 1 作业点评 没啥问题,注意调节AO强度需要从白色去调 看起来透明的猴子有风格化,会讲例子 右下角的蓝色小 ...

最新文章

  1. java怎么制作放置游戏_从零开始实现放置游戏(八)——实现后台管理系统(6)代码重构...
  2. boot gwt_带Spring Boot的GWT
  3. ajax 示例_通过示例了解挥发
  4. bp配置 sap_SAP转储订单之 STO without delivery
  5. java 静态类的实现_[Java教程]Javascript 静态类的实现
  6. PHP array_pop()函数与示例
  7. 《Arduino开发实战指南:机器人卷》一2.4 时间函数
  8. 问答| 四轮驱动移动机器人(SSMR)简化模型的虚拟轮间距dLR具体是多少
  9. SpringBoot基于易邮邮件服务器实现本地邮件收发
  10. 将DLL注册成COM组件
  11. 交通信号灯规范国家标准出台
  12. [定理证明]正态随机过程又是马尔科夫过程的充要条件(高斯-马尔科夫过程的充要条件)...
  13. Debian10上使用360随身Wifi
  14. 软件工程导论04-设计工程
  15. FPGA串口之RS-485
  16. 基于LiDAR里程计和先验地图的定位方法
  17. scanf函数、冒泡排序和不定长度数组的使用 —— malloc
  18. 小程序 报错 errcode: 40029, errmsg: invalid code, hints: [ req_id: HQd79a0747th31 ]
  19. 真-C++通过函数名字符串调用函数
  20. jQuery实现图片卡片层叠式切换效果

热门文章

  1. cdn厂商 同兴万点_CDN进入牌照时代 工信部规范和清理CDN市场
  2. 程序员学历要求越来越高,薪酬天花板犹如发际线,原因很简单!
  3. asp.net mvc 性能测试工具 - Glimpse
  4. unset MAILCHECK
  5. XML NameSpace
  6. APAC SharePoint Conference 2007 讲义与资源下载
  7. OpenStack快速入门-queens版本
  8. 基于Sanic的微服务基础架构
  9. CloudCC:2017年下半年企业移动CRM市场风向窥测
  10. 新浪安装weiphp2.0的方法