linux高性能服务器编程 (九) --I/O复用
第九章 I/O复用
I/O复用就是一个线程可以同时监听多个文件描述符,提高程序性能。虽然I/O复用可以同时监听多个文件描述符,但是它本身是阻塞的,如果多个文件描述符准备就绪,如果不采取措施它仍然是串行工作的。所以只能通过多进程或者多线程来处理。linux下实现I/O复用主要使用到 select poll epoll 三种都是IO多路复用的机制;
select :
1)当有多个I/O流进来了,它不知道哪一个准备就绪可执行(读、写)所以select 只能采用轮询的方式去访问,所以 select 的时间复杂度是 O(n) .所以当流越来越多,轮询的时间就越来越长。
2)select 方案单个进程所监听的数量是被限制的,也就是说同时可监听的端口号大小有限。通常情况下监听的数量和系统内存的大小有关,32位机默认监听大小为1024个,64位机监听的大小是2048个。
3)采用该方案 还需要维护一个用来存放大量 fd(文件描述符)的数据结构,这样使得用户空间和内核空间在传递该结构时复制开销比较大。因为它将文件标识符数组被整体从用户空间和内核地址空间来回拷贝。
poll :
1) poll 本质上和 select 执行方案没有什么区别。就是它没有最大连接数的限制。因为他是基于链表存储的。复杂度为O(n)
epoll :
1) epoll 可以理解为 event poll 它和 select 和 poll 有很大的不同。 event 会将哪个具体的流I/O事件通知到我们。所以说epoll 实际上是事件驱动 每个事件上都关联一个fd (文件描述符) 。epoll的复杂度是 O(1) 所以说它的效率提升了很高。
2) epoll 没有最大并发连接限制,1G的内存上能监听约10万个端口。
3) 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。
参考:https://www.cnblogs.com/lixiaoliuer/p/6735821.html
https://www.cnblogs.com/aspirant/p/9166944.html
最新文章
- HBase参数配置及说明
- tornado使用(Mac)
- HTTP Status 500 - org.apache.jasper.JasperException: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException
- poj1179
- Web自动化框架LazyUI使用手册(2)--先跑起来再说(第一个测试用例-百度搜索)
- 【mongoDB中级篇②】索引与expain
- 程序自动生成Dump文件
- PHP Fatal error问题处理
- session 共享
- js获取url,截取url参数,截取url后文件名
- mysql6.5 操作日志
- python单元测试框架unittest总结
- Html 解决数字和字母不换行
- luogu3195/bzoj1010 玩具装箱(斜率优化dp)
- Pycharm 字体大小调整
- JavaScript实现表单验证_02
- 谷歌浏览器测试工具应用Advanced REST client
- BIO NIO AIO 简介
- 查看crontab的日志记录定位定时任务问题
- IDEA编译时出现";cannot resolve symbol";的问题时的解决方法。
热门文章
- C#基础语法,快速上収C#
- JavaScript---js语法,数据类型及方法, 数组及方法,JSON对象及方法,日期Date及方法,正则及方法,数据类型转换,运算符, 控制流程(三元运算),函数(匿名函数,自调用函数)
- 在微信小程序中使用redux
- 网址URL分解
- 从 Vue 的视角学 React(三)—— 事件处理
- Windows - CMD窗口UTF8编码乱码问题的解决!
- 滥用exchage远程调用域管理员API接口
- es倒排索引原理解析
- PHP实现单人多人聊天源码免费分享 | 电脑报修系统
- struts2启动报错:ERROR com.opensymphony.xwork2.conversion.impl.DefaultConversionPropertiesProcessor - Conversion registration error