当前位置: 首页 > 编程日记 > 正文

select,epoll,poll比较

select,poll,epoll简介

select

select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是:

1 单个进程可监视的fd数量被限制

2 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大

3 对socket进行扫描时是线性扫描

poll

poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。

它没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点:

大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。

poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。

epoll

epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。

在前面说到的复制问题上,epoll使用mmap减少复制开销。

还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知

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时要根据具体的使用场合以及这三种方式的自身特点。表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调

相关文章:

华为开发者大会HDC.Cloud技术探秘:云搜索服务技术实践

搜索是一个古老的技术,从互联网发展的第一天开始,搜索技术就绽放出了惊人的社会和经济价值。随着信息社会快速发展,数据呈爆炸式增长,搜索技术通过数据收集与处理,满足信息共享与快速检索的需求。基于搜索技术&#xf…

从今天开始,自己做SEO。

1.购买了一点黑链。开始优化之路。 2.更改了关键词,描述。 3.整理了友情链接。 4.购买了VPS服务器:点击查看 转载于:https://www.cnblogs.com/zq535228/archive/2010/06/09/1754986.html

Elasticsearch2.2.0配置文件说明

为什么80%的码农都做不了架构师?>>> 官方配置文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html 配置详解 # ---------------------------------- Cluster (集群配置)----------------------…

各种类型的字节数

int类型比较特殊,具体的字节数同机器字长和编译器有关。如果要保证移植性,尽量用__int16 __int32 __int64吧,或者自己typedef int INT32一下。 C、C标准中只规定了某种类型的最小字节数(防止溢出) 64位指的是cpu通用寄…

154 万 AI 开发者用数据告诉你,中国 AI 如何才能弯道超车?| 中国 AI 应用开发者报告...

曾经,软件吞噬世界。现在,AI 吞噬软件。作者 | 屠敏数据 | 杨阳、刘学涛可视化&策划 | 唐小引出品 | CSDN(ID:CSDNnews)从三年前年薪 25 万只是白菜价,到去年华为以年薪最高达 201 万招揽顶尖应届毕业生…

中国移动用户能不能用WCDMA网?(世界杯与通信2)

到南非有移动的用户也有联通的用户,联通的网络快这是肯定的,不过联通的通话价格也比移动的高,就有人希望拿着移动的号去南非,最好也能享受WCDMA的网络速度,这样就是两全其美了,对于这个问题,在国…

平安陆金所-点金计划,简直是骗子行为。

陆金所点金计划,让人防不胜防。平安保险,骗子中的教练。 转载于:https://www.cnblogs.com/hthf/p/5205921.html

深度分析define预处理指令

#define语句 预处理 宏替换 --以上出自《C语言入门经典(第四版)》 #和## --出自《C语言程序设计:现代方法(第2版)》 #undef取消定义 --以上出自《21天学通C语言(第6版)》

建立YUM服务器CENTOS

1 ,YUM Client:要保证安装有如下软件包:yum-3.2.19-18.el5.centosyum-metadata-parser-1.1.2-2.el52 ,YUM Server:要保证安装有如下软件包:yum-3.2.19-18.el5.centosyum-metadata-parser-1.1.2-2.el5yum-fastestmirror…

数据库设计的10个最佳实践

作者 | Emily Williamson译者 | 孙薇,责编 | 屠敏出品 | CSDN(ID:CSDNnews)以下为译文:数据库是应用及计算机的核心元素,负责存储运行软件应用所需的一切重要数据。为了保障应用正常运行,总有一…

十进制转化为十六进制分割高低位

2019独角兽企业重金招聘Python工程师标准>>> 将十进制1000,转化为十六进制,则为0x03E8,如果得到高低位,high0x03,low0xE8 BYTE high;BYTE low;int temp_data1nWeightValue;highBYTE(temp_data1 >>8);int temp_data2nWeightV…

Nginx内存池--pool代码抽取(链表套路)

ngx_palloc.c文件 ngx_palloc_large_hm是自己写的代码没有nginx原版的ngx_palloc_large写的好&#xff0c;细节要品味才会发现nginx的美 nginx链表的套路&#xff0c;正好是两种插入“从前插”和“从后插”&#xff0c;有些许差别 #include <stdio.h> #include <std…

阿里再次主办大数据世界杯, KDD Cup2020正式开赛

记者从国际计算机科学顶会ACM SIGKDD官网获悉&#xff0c;KDD Cup 2020今日正式开赛&#xff0c;本届比赛由阿里巴巴达摩院主办。随即&#xff0c;阿里公布了认知智能、曝光偏差两大赛题方向&#xff0c;并向全球参赛者开放最大规模的商品多模态数据集。阿里也是两次举办该赛事…

grep 正则表达式

grep 正则表达式来源:http://blog.rednet.cn/user1/213546/archives/2007/35795.html以下为整理的grep 正则表达式的大部分功能,详细参见man grep: 要用好grep这个工具&#xff0c;其实就是要写好正则表达式&#xff0c;所以这里不对grep的所有功能进行实例讲解&#xff0c;只列…

Mybatis缓存机制理解及配置

2019独角兽企业重金招聘Python工程师标准>>> 1. Ehcache EHCache是来自sourceforge&#xff08;http://ehcache.sourceforge.net/&#xff09;的开源项目&#xff0c;也是纯Java实现的简单、快速的Cache组件。EHCache支持内存和磁盘的缓存&#xff0c;支持LRU、…

浅谈无缓存I/O操作和标准I/O文件操作区别 (转载)

首先&#xff0c;先稍微了解系统调用的概念&#xff1a; 系统调用&#xff0c;英文名system call&#xff0c;每个操作系统都在内核里有一些内建的函数库&#xff0c;这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核&#xff0c;调用相应的的内核函数完成所需的…

Android之ListActivity(一):布局与数据绑定

Android中的列表&#xff0c;当然也可以用ListView来完成所需要的功能&#xff0c;用法是一样的。 废话不说&#xff0c;来关键的。 LiveActivity本身继承了关于List操作的众多接口&#xff0c;我们可以方便的重写这些操作中需要的方法来实现自己需要的功能。 如果要用ListActi…

用于单图像超分辨率的对偶回归网络,达到最新SOTA | CVPR 2020

作者 | Yong Guo, Jian Chen等译者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;通过学习从低分辨率&#xff08;LR&#xff09;图像到高分辨率&#xff08;HR&#xff09;图像之间的非线性映射函数&#xff0c;深度神经网络在图像超分辨率&#xff08;SR&a…

老生常谈,joomla wordpress drupal,你该选择哪个CMS?

本人从事Joomla建站多年&#xff0c;给客户建站都是用Joomla&#xff0c;所以我会极力推荐你选择Joomla&#xff1f; No No No&#xff0c;这样未免太Hard sale了。 虽然这是一个会经常被提到的问题&#xff0c;网上也有不少优秀的答案&#xff0c;但我还是想把自己的想法跟大家…

利用TCMalloc替换Nginx和Redis默认glibc库的malloc内存分配

TCMalloc的全称为Thread-Caching Malloc&#xff0c;是谷歌开发的开源工具google-perftools中的一个成员。与标准的glibc库的Malloc相比&#xff0c;TCMalloc库在内存分配效率和速度上要高很多&#xff0c;这在很大程度上提高了服务器在高并发情况下的性能&#xff0c;从而降低…

Silverlight Analytics Framework(开源分析框架)

Silverlight Analytics Framework是由微软官方推出的WPF/Silverlight扩展Web分析框架.该框架与10余家第三方分析服务结合&#xff0c;使应用可以跟踪程序如何使用的详细情况&#xff0c;为用户提供诸如可用性和视频质量等细节分析。用户可以了解到这些应用软件的使用细节&#…

Python炫技操作:条件语句的七种写法

作者 | 写代码的明哥来源 | Python编程时光有的人说 Python 入门容易&#xff0c;但是精通难的语言&#xff0c;这点我非常赞同。Python 语言里有许多&#xff08;而且是越来越多&#xff09;的高级特性&#xff0c;是 Python 发烧友们非常喜欢的。在这些人的眼里&#xff0c;能…

puppet(1.7-2.1)

puppet配置模块(一)模块是puppet的最大单元&#xff0c;模块里面有类&#xff0c;类下面有资源。同步文件、远程执行命令、cron等叫做资源&#xff0c;都是通过模块来实现的。下面我们来定义一个模块&#xff1a;在服务端上做如下操作&#xff1a;mkdir /etc/puppet/modules/te…

ldconfig动态链接库管理以及修改ld.so.conf.d

将"/usr/local/lib"加入配置文件重 执行命令&#xff1a; #echo "/usr/local/lib" >> /etc/ld.so.conf 然后再直接执行&#xff1a; #ldconfig /etc/ld.so.conf.d/* 或/etc/ld.so.conf和ldconfig. /etc/ld.so.conf.d/*目录下的文件和/etc/ld.so.co…

深度残差收缩网络:借助注意力机制实现特征的软阈值化

作者 | 哈尔滨工业大学&#xff08;威海&#xff09;讲师 赵明航本文解读了一种新的深度注意力算法&#xff0c;即深度残差收缩网络&#xff08;Deep Residual Shrinkage Network&#xff09;。从功能上讲&#xff0c;深度残差收缩网络是一种面向强噪声或者高度冗余数据的特征学…

如何在同一台电脑上多个账户同时登陆MSN

一般情况下&#xff0c;在一台电脑上只能启动一个msn进程&#xff0c;所以当想多个账户在同一台电脑上同时登陆时&#xff0c;就无法实现了。我们可以使用MSNShell来实现多个账户的同时登陆。MSNShell下载地址&#xff1a;http://www.msnshell.netMSNShell系统要求&#xff1a;…

LINUX动态链接库的创建与使用

大家都知道&#xff0c;在 WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件&#xff0c;DLL即Dynamic Link Library)。这种动态链接库&#xff0c;和静态函数库不同&#xff0c;它里面的函数并不是执行程序本身的一部分&#xff0c;而是根据执行程序需要按需装入&#xff…

多模态商品推荐与认知智能背后的数学

在数据挖掘领域&#xff0c;KDD CUP是最有影响力、最高水平的国际顶级赛事&#xff0c;堪称大数据的“奥运会”。阿里巴巴作为KDD CUP 2020的主办方为参赛团队准备了两大赛题&#xff0c;第一道是关于“电商场景的多模态商品推荐”&#xff0c;下面就这一道题目从认知智能与数学…

Asp.net MVC2.0系列文章-运行Web MVC2.0 Demo

安装VS2010 首先安装VS2010&#xff0c;安装过程请参考文章&#xff1a;http://www.cnblogs.com/ywqu/archive/2010/01/27/1657450.html。创建第一个MVC2.0程序 新建一个asp.net MVC2.0网站程序&#xff0c;如下图&#xff1a;提示是否新建单元测试工程&#xff0c;选择创建Uni…

one pragmatical sqlhelper

namespace ConsoleApplication2 {using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Configuration;public class SqlHelper{/// <summary>/// 连接字符串/// </summa…