select/poll 和 epoll 比较
时间:2020-04-21
本文章向大家介绍select/poll 和 epoll 比较,主要包括select/poll 和 epoll 比较使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- select poll epoll三者之间的比较
select/poll 系统调用:
// select 系统调用
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
// poll 系统调用
int poll(struct pollfd fds[], nfds_t nfds, int timeout);
select:
- 查询 fd_set 中,是否有就绪的 fd,可以设定一个超时时间,当有 fd (File descripter) 就绪或超时返回;
- fd_set 是一个位集合,大小是在编译内核时的常量,默认大小为 1024
- 特点:
- 连接数限制,fd_set 可表示的 fd 数量太小了;
- 线性扫描:判断 fd 是否就绪,需要遍历一边 fd_set;
- 数据复制:用户空间和内核空间,复制连接就绪状态信息
poll:
- 解决了连接数限制:
- poll 中将 select 中的 fd_set 替换成了一个 pollfd 数组
- 解决 fd 数量过小的问题
- 数据复制:用户空间和内核空间,复制连接就绪状态信息
epoll: event 事件驱动
- 事件机制:避免线性扫描
- 为每个 fd,注册一个监听事件
- fd 变更为就绪时,将 fd 添加到就绪链表
- fd 数量:无限制(OS 级别的限制,单个进程能打开多少个 fd)
select,poll,epoll:
- I/O多路复用的机制;
- I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
- 监视多个文件描述符
- 但select,poll,epoll本质上都是同步I/O:
- 用户进程负责读写(从内核空间拷贝到用户空间),读写过程中,用户进程是阻塞的;
- 异步 IO,无需用户进程负责读写,异步IO,会负责从内核空间拷贝到用户空间;
原文地址:https://www.cnblogs.com/520playboy/p/12743367.html
- 我的WCF之旅(2):Endpoint Overview
- 关于CPU漏洞Spectre的详细分析
- 17.2 准备工作
- 克隆虚拟机的注意点
- keepalived+nginx搭建高可用(注意点)
- 我的WCF之旅(10):如何在WCF进行Exception Handling
- 安装nginx出现的问题
- 18.11 LVS DR模式搭建
- Linux基础(day64)
- 我的WCF之旅(9):如何在WCF中使用tcpTrace来进行Soap Trace
- 物联网设备已沦陷,咖啡机也不能例外
- 我的WCF之旅(13):创建基于MSMQ的Responsive Service
- 开发自己的Data Access Application Block[上篇]
- 18.9/18.10 LVS NAT模式搭建
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- innobackupex命令总结
- 使用sysbench对数据库进行压测 Part2 sysbench语法介绍
- MySQL Galera Cluster全解析 Part 9 监控Galera Cluster
- redis的介绍及安装
- 使用oradebug捕获SQL语句
- MySQL information_schema详解 PROCESSLIST
- MySQL组复制(MGR)全解析 Part 6 监控MySQL组复制
- 代码审计day2
- 使用XtraBackup备份MySQL 8.0 Part 8 xtrabackup 命令总结
- 代码审计day5
- 使用innobackupex对数据库进行部分备份(指定表或数据库)
- 使用Django获取Linux性能数据并存放在redis中
- MySQL组复制(MGR)全解析 Part 5 MGR单主模式部署指南
- php学习day4
- 使用Python爬取动态网页-腾讯动漫(Selenium)