- 浏览: 154015 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lyaqys:
lz实现的OptimisticExclusiveLock有点问 ...
java park/unpark 【java并发】基于JUC CAS原理,自己实现简单独占锁
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的通知机制需要很多函数回调
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的通知机制需要很多函数回调
发表评论
-
简单的linux -c http-client
2013-10-23 15:35 4731#include<stdio.h> #includ ... -
毗连“"aa"”和“"bb"”不能给出一个有效的预处理标识符,gcc编译错误表
2013-10-01 18:54 3002gcc bug : ##’ cannot appear at ... -
linux进程cpu资源分配命令nice,renice,taskset
2013-09-04 14:03 1165nice,renice 指定进程运行的优先级 taskset ... -
探索 Pexpect,第 2 部分:Pexpect 的实例分析
2013-08-19 11:08 1721原文: http://www.ibm.com/develope ... -
shell 文件处理
2013-08-16 15:21 731linux文件合并去重 cat loginpc.txt | ... -
c 专家编程
2013-08-13 17:06 691总结: -2> int * a = NUL ... -
进程监控
2013-08-12 15:40 678*/10 * * * * sh /opt/fetch/mint ... -
Linux中线程与CPU核的绑定
2013-08-09 15:15 2129最近在对项目进行性能 ... -
建议编译的时候加警告 atof
2013-08-07 20:46 712#include <stdlib.h> ... -
监控脚本的配置
2013-08-05 19:51 62910 9,12,18 * * * /usr/local/bin ... -
feodra 17 安装 chrome
2013-08-04 01:35 7691: 下载:http://www.google.cn/chro ... -
Sudo提权出现:xx用户不在 sudoers 文件中
2013-08-03 20:22 913Sudo提权出现:xx用户不在 sudoers 文件中 症状 ... -
gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
2013-07-22 22:45 910我们用gcc编译程序时,可能会用到“-I”(大写i),“-L” ... -
Linux下如何将进程绑定在特定的CPU上运行
2013-07-22 10:52 990Linux下如何将进程绑定在特定的CPU上运行? 以root用 ... -
根据nestat 的端口,查看访问的程序
2013-07-19 12:15 978[@zw-76-82 ~]# lsof -i tcp:3398 ... -
linux运维常用命令
2013-07-13 20:40 891推荐一个实用命令:awk '{x+=$2} END {prin ... -
linux 进程通信方式
2013-07-07 20:46 622# 管道( pipe ):管道是一种半双工的通信方式,数据只能 ... -
vim7.3 编辑中文字符的文件会显示乱码
2013-06-29 03:16 834默认编译安装vim7.3后打开含有中文字符的文件会显示乱码,g ... -
vim 退格键(backspace)不能用
2013-06-29 01:59 1681两个步骤: 1.去掉讨厌的有关vi一致性模式,避免以前版本的 ... -
ubuntu pdf乱码解决办法
2013-06-29 01:51 645ubuntu pdf乱码解决办法 第一步,在线安装中文语言支持 ...
相关推荐
linux中 epoll poll 和select的区别
下面文章在这段时间内研究 select/poll/epoll的内核实现的一点心得体会: select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll...
在Linux系统中,当面临需要同时管理大量网络连接或文件描述符时,`select`、`poll`和`epoll`是三种常见的I/O多路复用技术,它们允许程序在一个单独的线程中等待多个文件描述符的事件,提高了程序的效率和并发能力。...
select poll epoll 代码实例
高性能网络设计-网络编程(网络io与select、poll、epoll,reactor原理与实现、http服务器实现、websocket协议与服务器实现)与网络原理(服务器百万并发,网络协议栈,UDP可靠传输协议QUIC),协程框架NtyCo的实现....
1. EPOLL 与 Select、Poll 的比较: - Select:限制 FD 数量(通常为 1024),且在监控大量 FD 时效率低下,需要遍历整个 FD 集合。 - Poll:解决了 Select 的 FD 数量限制,但同样需要遍历所有 FD 来查找就绪事件...
Linux系统编程——I/O多路复用select、poll、epoll的区别使用,相关教程如下: http://blog.csdn.net/tennysonsky/article/details/45745887
它主要涉及到TCP/UDP协议以及select/poll/epoll等多路复用技术。 TCP/UDP协议是网络通信的基础,其中TCP协议提供面向连接的可靠数据传输,而UDP协议则提供无连接的不可靠数据传输。在Linux网络编程中,开发者需要...
有三个方式select、poll、epoll。 select:将文件描述符放入一个集合中,调用select时,将这个集合从用户空间拷贝到内核空间(缺点:每次都要复制,开销大),由内核根据就绪状态修改该集合的内容。 poll:和select...
无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。而如果你想我一样从2.5内核就关注epoll的话,一定...
### select、poll、epoll的内部机制调研:深入探索Linux多路复用技术 #### 一、引言 在Linux操作系统中,对于I/O密集型的应用程序,如何高效地管理多个并发连接,成为了提高系统性能的关键。传统的阻塞式I/O在面对...
为了高效地管理这些并发连接,程序员经常使用I/O复用技术,其中"select"、"poll"和"epoll"是三种常见的机制。本文将深入探讨这三种方法,并通过实例分析它们的工作原理及其优缺点。 首先,`select`函数是最早被引入...
`select`、`poll`和`epoll`是Linux系统中用于I/O多路复用的三种主要机制,它们允许单个进程同时监控多个文件描述符(FD),等待数据就绪后再进行相应的操作。下面我们将详细探讨这三个概念及其原理。 1. **select**...
`select`、`poll`和`epoll`是三种常见的I/O多路复用技术,用于高效地管理多个文件描述符(FDs)的读写就绪状态。本文件“Help to understand select, poll, epoll.pdf”旨在帮助开发者深入理解这些机制的工作原理,...
通过对`select`和`epoll`的测试结果进行比较,可以直观地看到哪种方法在特定场景下更优。 实验报告`epoll和select实现多路复用.docx`应该详细记录了实验的步骤、代码实现、测试过程以及分析结果。通过阅读报告,你...
IO多路复用通过系统调用如select、poll、epoll等,让程序可以监控多个文件描述符(通常包括网络套接字)。当其中任一描述符准备好进行读写操作时,系统会通知程序。这种机制在处理多个客户端连接时非常有效,避免了...
网络io的使用实例 1.阻塞 2.多线程 3.select 4.poll, 5.epoll
本文将深入探讨四种常见的IO复用机制:`select`、`poll`、`epoll`和`kqueue`,并结合源码分析如何在实际项目中应用它们。我们将通过分析`service.cpp`(服务端)和`client.cpp`(客户端)来理解这些机制的工作原理。...