2020-08-22:I/O多路复用中select/poll/epoll的区别?
福哥答案2020-08-22:
select,poll,epoll 都是 操作系统实现 IO 多路复用的机制。 我们知道,I/O 多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是 读就绪或者写就绪),能够通知程序进行相应的读写操作。那么这三种机制有什 么区别呢。
1、支持一个进程所能打开的最大连接数
select:单个进程所能打开的最大连接数有 FD_SETSIZE 宏定义,其大 小是 32 个整数的大小(在 32 位的机器上,大小就是 32*32,同 理 64 位机器上 FD_SETSIZE 为 32*64),当然我们可以对进行修改, 然后重新编译内核,但是性能可能会受到影响。
poll:poll 本质上和 select 没有区别,但是它没有最大连接数的限 制,原因是它是基于链表来存储的。
epoll:虽然连接数有上限,但是很大,1G 内存的机器上可以打开 10 万左右的连接,2G 内存的机器可以打开 20 万左右的连
2、FD 剧增后带来的 IO 效率问题
select:因为每次调用时都会对连接进行线性遍历,所以随着 FD 的 增加会造成遍历速度慢的“线性下降性能问题”。
poll:同上。
epoll因为 epoll 内核中实现是根据每个 fd 上的 callback 函数来实 现的,只有活跃的 socket 才会主动调用 callback,所以在活跃 socket 较少的情况下,使用 epoll 没有前面两者的线性下降的性能 问题,但是所有 socket 都很活跃的情况下,可能会有性能问题。
3、 消息传递方式
select:内核需要将消息传递到用户空间,都需要内核拷贝动作 。
poll:同上。
epoll:epoll 通过内核和用户空间共享一块内存来实现的。
总结:
综上,在选择 select,poll,epoll 时要根据具体的使用场合以及这三种方式 的自身特点。
1、表面上看 epoll 的性能最好,但是在连接数少并且连接都十分活跃的情况 下,select 和 poll 的性能可能比 epoll 好,毕竟 epoll 的通知机制需要很多函数回调。
2、select 低效是因为每次它都需要轮询。但低效也是相对的,视情况而定, 也可通过良好的设计改善。
补充知识点:
Level_triggered(水平触发):当被监控的文件描述符上有可读写事件发生时, epoll_wait()会通知处理程序去读写。如果这次没有把数据一次性全部读写完(如 读写缓冲区太小),那么下次调用 epoll_wait()时,它还会通知你在上没读写完的 文件描述符上继续读写,当然如果你一直不去读写,它会一直通知你!!!如果 系统中有大量你不需要读写的就绪文件描述符,而它们每次都会返回,这样会大 大降低处理程序检索自己关心的就绪文件描述符的效率!!!
Edge_triggered(边缘触发):当被监控的文件描述符上有可读写事件发生时, epoll_wait()会通知处理程序去读写。如果这次没有把数据全部读写完(如读写缓 冲区太小),那么下次调用 epoll_wait()时,它不会通知你,也就是它只会通知你 一次,直到该文件描述符上出现第二次可读写事件才会通知你!!!这种模式比 水平触发效率高,系统不会充斥大量你不关心的就绪文件描述符!!
select(),poll()模型都是水平触发模式,信号驱动 IO 是边缘触发模式,epoll() 模型即支持水平触发,也支持边缘触发,默认是水平触发。
***
[评论](https://user.qzone.qq.com/3182319461/blog/1598050790)
2020-08-22:I/O多路复用中select/poll/epoll的区别?的更多相关文章
- Linux I/O复用中select poll epoll模型的介绍及其优缺点的比較
关于I/O多路复用: I/O多路复用(又被称为"事件驱动"),首先要理解的是.操作系统为你提供了一个功能.当你的某个socket可读或者可写的时候.它能够给你一个通知.这样当配合非 ...
- I/O多路复用之select,poll,epoll简介
一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...
- select.poll,epoll的区别与应用
先讲讲同步I/O的五大模型 阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型 而select/poll/epoll属于I/O复用模型 select函数 该函数 ...
- IO多路复用之select poll epoll
参考文档: http://blog.csdn.net/tennysonsky/article/details/45745887 select(),poll(),epoll()都是I/O多路复用的机制. ...
- 最快理解 - IO多路复用:select / poll / epoll 的区别.
目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...
- Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
Linux下测试代码: http://www.linuxhowtos.org/C_C++/socket.htm TCP模型 //TCPClient.c #include<string.h> ...
- 浅谈网络I/O多路复用模型 select & poll & epoll
http://blog.csdn.net/nk_test/article/details/50662946
- bio,nio,aio的区别 select,poll,epoll的区别
先了解一些基本概念,什么是socket?什么是I/O操作 unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切 ...
- python select poll epoll的区别
select 优点:为最早的异步io处理模块,他可以再linux上和windows上使用,跨平台兼容性好,而poll和epoll都不能在windows系统环境中使用. 缺点:select的机制决定了他 ...
- 转--select/poll/epoll到底是什么一回事
面试题:说说select/poll/epoll的区别. 这是面试后台开发时的高频面试题,属于网络编程和IO那一块的知识.Android里面的Handler消息处理机制的底层实现就用到了epoll. 为 ...
随机推荐
- ACM 的正确入门方式是什么?
作者:数学lover 链接:https://www.zhihu.com/question/51727516/answer/127265733 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权, ...
- js对象深拷贝方法
JSON.stringify()是目前前端开发过程中最常用的深拷贝方式, 原理是把有个对象序列化成为一个 JSON 字符串,将对象的内容转换成字符串的形式再保存到磁盘上, 再用 JSON.parse( ...
- Linux系统mysql免安装版配置指南
1.下载(/usr/local目录) wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.32-linux-glibc2.12-x ...
- redis的数据操作和python操作redis+关系非关系数据库差异
关系型数据库(RMDBS) 数据库中表与表的数据之间存在某种关联的内在关系,因为这种关系,所以我们称这种数据库为关系型数据库. 典型:Mysql/MariaDB.postgreSQL.Oracle.S ...
- 【转载】Python:logging详细版
转载自:https://www.cnblogs.com/Nicholas0707/p/9021672.html 一.logging模块 (一).日志相关概念 日志是一种可以追踪某些软件运行时所发生事件 ...
- 自己动手从零写桌面操作系统GrapeOS系列教程——12.QEMU+GDB调试
学习操作系统原理最好的方法是自己写一个简单的操作系统. 写程序不免需要调试,写不同的程序调试方式也不同.如果做应用软件开发,相应的程序调试方式是建立在有操作系统支持的基础上的.而我们现在是要开发操作系 ...
- 翟佳:StreamNative 组织构建之路丨声网开发者创业讲堂 • 第 5 期
前言 翟佳,StreamNative 联合创始⼈,Apache Pulsar PMC 成员与 Committer.之前任职于 EMC,担任统⼀存储部⻔技术负责⼈. 在声网开发者创业讲堂 • 第 5 期 ...
- Django笔记四之字段属性
这篇笔记介绍的 field options,也就是 字段的选项属性. 首先,关于 model,是数据库与 python 代码里的一个映射关系,每一个 model 是django.db.models.M ...
- 深入理解 Python 虚拟机:字节(bytes)的实现原理及源码剖析
深入理解 Python 虚拟机:字节(bytes)的实现原理及源码剖析 在本篇文章当中主要给大家介绍在 cpython 内部,bytes 的实现原理.内存布局以及与 bytes 相关的一个比较重要的优 ...
- Linux防火墙与端口操作命令
CentOS 7系统 目录 1. 防火墙操作命令 2. 端口操作命令 3. CentOS 7 下安装firewall 1. 防火墙操作命令 序号 作用 命令 1 查看防火墙状态 systemctl s ...