Select与Epoll的区别
相同点: 都是IO多路转接,都是一个线程能同一时间等待一堆描述符
不同点:
1.select接口使用不方便,每次调用完select都需要重新设置fd_set,因为输入输出未分离,返回的fd_set会将未就绪的fd清空;
epoll接口使用方便,采用事件结构方式监控,简化了对多个监控结合的操作 , 输入输出也进行了分离,不需要再重新设置fd_set;
#include<sys/select.h> //select执行过程:
//在fd_set中添加要监控的fd-->调用select等待-->fd_set返回已就绪fd,未就绪的被清空 int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
//nfds为最大fd_set+1,减少遍历区间
//fd_set是存储要监控fd的位图,大小是系统设定的,系统提供了一套操作fd_set的增删改查的接口
//timeout == NULL阻塞 >=0等待时间
//epoll执行过程:
//epoll_careate在内核创建eventpoll结构体,其中包含红黑树与双向链表--->
//为需要监控的fd创建一个事件结构并用epoll_ctl添加到红黑树中-->
//调用epoll_wait等待,当有fd就绪操作系统就会调用对应的回调函数将就绪的事件结构添加到双向链表中(红黑树中的就绪fd的事件类型会清空,下次遍历需要重新设置事件类型)-->
//epoll_wait每隔一段时间判断双向链表是否为空,如果不为空就将就绪的事件结构映射到用户传
//入的事件数组中 -->
//函数返回后,用户可以直接对返回的事件数组遍历操作 //创建eventpoll结构体
int epoll_create(int size); //添加监控事件
int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event); //等待就绪事件
int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout);
2.select每次监控都需要在用户态与内核态之间频繁拷贝数据; epoll只需要将监控的事件向内核拷贝一次,不需要频繁拷贝。
3.select监控的fd越多效率越低,因为内核要在内部遍历位图;epoll采用事件回调方式监控(谁就绪回调谁),因此效率不会因为fd增多而降低。
4.select没有直接返回就绪的文件描述符,需要用户对集合进行遍历判断;epoll直接返回的就绪事件结构,用户可以直接操作,不需要空遍历;
5.select监控的fd有限,默认是1024个;epoll监控的fd没有上限。
6.select可以跨平台;epoll不可以跨平台。
事件结构(epoll_event):
\
这里提一下poll:
相比于select: 1.接口使用更方便,采用事件结构数组进行所有事件监控,简化了三种集合操作
2.监控的fd没有上限
除了这两个优点,缺点和select一样。
Select与Epoll的区别的更多相关文章
- select 和epoll模型区别
1.select 和epoll模型区别 1.1.网络IO模型概述 通常来说,网络IO可以抽象成用户态和内核态之间的数据交换.一次网络数据读取操作(read),可以拆分成两个步骤:1)网卡驱动等待数据准 ...
- 多路复用select和epoll的区别(转)
先说下本文框架,先是问题引出,然后概括两个机制的区别和联系,最后介绍每个接口的用法 一.问题引出 联系区别 问题的引出,当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一 ...
- select.poll,epoll的区别与应用
先讲讲同步I/O的五大模型 阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型 而select/poll/epoll属于I/O复用模型 select函数 该函数 ...
- UNIX环境高级编程——select和epoll的区别
select和epoll都用于监听套接口描述字上是否有事件发生,实现I/O复用 select(轮询) #include <sys/select.h> #include <sys/ti ...
- 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的机制决定了他 ...
- 最快理解 - IO多路复用:select / poll / epoll 的区别.
目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...
- select与epoll分析
关于select与epoll的区别,网上的文章已是一大堆.不过别人的终究是别人的,总得自己去理解才更深刻.于是在阅读了大量的文章后,再装模作样的看下源码,写下了自己的一些理解. 在开始之前,要明白li ...
- 转--select/poll/epoll到底是什么一回事
面试题:说说select/poll/epoll的区别. 这是面试后台开发时的高频面试题,属于网络编程和IO那一块的知识.Android里面的Handler消息处理机制的底层实现就用到了epoll. 为 ...
随机推荐
- asp.net web开发——文件的上传和下载
HTML部分 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.a ...
- ArrayList 集合:库存管理
import java.util.ArrayList; import java.lang.Integer; import java.util.Scanner; import java.util.Ran ...
- WinDbg常用命令系列---!cppexr
!cppexr 简介 !cppexr显示C++异常记录的内容. 使用形式 !cppexr Address 参数 Address指定要显示的C++异常记录的地址. 支持环境 Windows 2000 E ...
- P3746 【[六省联考2017]组合数问题】
题目是要我们求出如下柿子: \[\sum_{i=0}^{n}C_{nk}^{ik+r}\] 考虑k和r非常小,我们能不能从这里切入呢? 如果你注意到,所有组合数上方的数\(\%k==r\),那么是不是 ...
- 基于Docker部署ETCD集群
基于Docker部署ETCD集群 关于ETCD要不要使用TLS? 首先TLS的目的是为了鉴权为了防止别人任意的连接上你的etcd集群.其实意思就是说如果你要放到公网上的ETCD集群,并开放端口,我建议 ...
- `ll/sc` 指令在`linux`中的软件实现
load-link与store-conditional (LL/SC)是一对用于并发同步访问内存的CPU指令.Load-link返回内存位置处的当前值,随后的store-conditional在该内存 ...
- Mac复制粘贴文本时默认使用无格式模式
参考:How to Paste Everything as Plain Text 写文章的时候,用的最多的就是copy和paste了,可是现在Mac和Win默认都是会连格式一起复制,真是逆天,导致每次 ...
- 关于js.map以及css.map
什么是source map文件. source map文件是js文件压缩后,文件的变量名替换对应.变量所在位置等元信息数据文件,一般这种文件和min.js主文件放在同一个目录下. 比如压缩后原变量是m ...
- Python自动化脚本-运维人员宝典
文章地址: https://alanhou.org/basic-networking-socket-programming/ 第一章 Python脚本概述 第二章 Python脚本调试和性能测试 第三 ...
- js控制input框只能输入数字和一位小数点和小数点后面两位小数
<script language="JavaScript" type="text/javascript"> function clearNoNum( ...