- 浏览: 761623 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
select的参数类型fd_set没有将文件描述符和事件绑定,它仅仅是一个文件描述符集合,因此select需要提供3个这种类型的参数来分别传入和输出可读,可写及异常等事件.这一方面使得select不能处理更多类型的事件,另一方面由于内核对fd_set集合的在线修改,应用程序下次调用select前不得不重置这3个fd_set集合
poll的参数类型pollfd则多少"聪明"一些.它把文件描述符和事件都定义其中,任何事件都被统一处理,从而使得编程接口简洁得多.并且内核每次修改的是pollfd结构体的revents成员,而events成员保持不变,因此下次调用poll时应用程序无须重置pollfd类型的事件集参数.由于每次select和poll调用都返回整个用户注册的事件集合(其中包括就绪和未就绪的),所以应用程序索引就绪文件描述符的时间复杂度O(n).
epoll则采用与select和poll完全不同的方式来管理用户注册的事件.它在内核中维护一个事件表,并提供了一个独立的系统调用epoll_ctl来控制往其中添加,删除,修改事件.这样,每次epoll_wati调用都直接从该内核事件表中取得用户注册的事件,而无须反复从用户空间读入这些事件.epoll_wait系统调用的events参数仅用来返回就绪的事件,这使得应用程序索引就绪文件描述符的时间复杂度的O(1).
从实现原理上来说,select和poll采用的都是轮询的方式,即每次调用都要扫描整个注册文件描述符集合,并将其中就绪的文件描述符返回给用户程序,因此它们检测就绪事件的算法的时间复杂度是O(n).epoll_wait则不同,它采用的是回调的方式.内核检测到就绪的文件描述符,将触发回调函数,回调函数就将该文件描述符上对应的事件插入内核就绪事件队列.内核最后在适当的时机将该就绪事件队列中的内容拷贝到用户空间.因此epoll_wait无须轮询整个文件描述符集合来检测哪些事件已经就绪,其算法时间复杂度是O(1).但是,当活动连接比较多的时候,epoll_wait的效率未必比select和poll高,因为此时回调函数被触发得过于频繁.所以epoll_wait适用于连接数量多,但活动连接较少的情况
poll的参数类型pollfd则多少"聪明"一些.它把文件描述符和事件都定义其中,任何事件都被统一处理,从而使得编程接口简洁得多.并且内核每次修改的是pollfd结构体的revents成员,而events成员保持不变,因此下次调用poll时应用程序无须重置pollfd类型的事件集参数.由于每次select和poll调用都返回整个用户注册的事件集合(其中包括就绪和未就绪的),所以应用程序索引就绪文件描述符的时间复杂度O(n).
epoll则采用与select和poll完全不同的方式来管理用户注册的事件.它在内核中维护一个事件表,并提供了一个独立的系统调用epoll_ctl来控制往其中添加,删除,修改事件.这样,每次epoll_wati调用都直接从该内核事件表中取得用户注册的事件,而无须反复从用户空间读入这些事件.epoll_wait系统调用的events参数仅用来返回就绪的事件,这使得应用程序索引就绪文件描述符的时间复杂度的O(1).
从实现原理上来说,select和poll采用的都是轮询的方式,即每次调用都要扫描整个注册文件描述符集合,并将其中就绪的文件描述符返回给用户程序,因此它们检测就绪事件的算法的时间复杂度是O(n).epoll_wait则不同,它采用的是回调的方式.内核检测到就绪的文件描述符,将触发回调函数,回调函数就将该文件描述符上对应的事件插入内核就绪事件队列.内核最后在适当的时机将该就绪事件队列中的内容拷贝到用户空间.因此epoll_wait无须轮询整个文件描述符集合来检测哪些事件已经就绪,其算法时间复杂度是O(1).但是,当活动连接比较多的时候,epoll_wait的效率未必比select和poll高,因为此时回调函数被触发得过于频繁.所以epoll_wait适用于连接数量多,但活动连接较少的情况
发表评论
-
滑动窗口与拥塞控制
2017-09-29 14:47 759滑动窗口:用作流量控制: 1.发送端和接收端各维护一个独立的发 ... -
rawsocket发送tcp包
2017-09-25 11:52 982testTcp.h #ifndef TESTTCP_H ... -
柔性数组
2017-09-20 09:53 505#include <iostream> #i ... -
rawsocket发送dns包
2017-09-14 15:18 613#include <stdio.h> #in ... -
rawsocket发送icmp包
2017-09-06 09:54 658#include <stdio.h> #in ... -
netfilter
2016-10-04 20:31 474http://blog.chinaunix.net/uid-2 ... -
gdb的简单使用
2016-09-19 15:18 416注意编译的时间加上-g参数 1.调试运行 gdb a.out ... -
TCP各状态的意义
2016-03-01 14:06 420各个状态的意义如下: LISTEN - 侦听来自远方TCP端 ... -
log
2015-03-30 17:42 451log.h #ifndef __LOG_H__ #def ... -
TIMEWAIT与CLOSEWAIT
2015-03-17 11:32 659http://blog.csdn.net/kobejayand ... -
TcpClient
2015-01-16 17:46 470TcpClient.h #ifndef TCPCLIENT ... -
信号量
2014-09-26 10:20 681#include <semaphore.h> ... -
共享内存
2014-09-17 10:39 596SharedMemory.h #ifndef SHARED ... -
记录锁
2014-09-11 16:32 435#include <errno.h> #in ... -
popen
2014-09-06 14:50 639#include <stdio.h> #in ... -
大小端存储
2014-09-05 09:29 603#include <stdio.h> i ... -
条件变量(cond)
2014-09-01 11:02 873#include <pthread.h> # ... -
读写锁
2014-09-01 10:33 728#include <pthread.h> # ... -
trylock
2014-09-01 10:07 667#include <pthread.h> # ... -
线程分离
2014-09-01 10:00 693http://www.cnblogs.com/mydomain ...
相关推荐
下面文章在这段时间内研究 select/poll/epoll的内核实现的一点心得体会: select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll...
select poll epoll 代码实例
高性能网络设计-网络编程(网络io与select、poll、epoll,reactor原理与实现、http服务器实现、websocket协议与服务器实现)与网络原理(服务器百万并发,网络协议栈,UDP可靠传输协议QUIC),协程框架NtyCo的实现....
linux中 epoll poll 和select的区别
在Linux系统中,当面临需要同时管理大量网络连接或文件描述符时,`select`、`poll`和`epoll`是三种常见的I/O多路复用技术,它们允许程序在一个单独的线程中等待多个文件描述符的事件,提高了程序的效率和并发能力。...
为了高效地管理这些并发连接,程序员经常使用I/O复用技术,其中"select"、"poll"和"epoll"是三种常见的机制。本文将深入探讨这三种方法,并通过实例分析它们的工作原理及其优缺点。 首先,`select`函数是最早被引入...
相比之下,`epoll`(Event Poll)是Linux内核提供的更高级别的接口,它克服了`select`的这些局限性。`epoll`支持边缘触发(ET)和水平触发(LT)两种模式,且能有效地处理大量文件描述符。在`epoll.c`和`epollclient...
Linux系统编程——I/O多路复用select、poll、epoll的区别使用,相关教程如下: http://blog.csdn.net/tennysonsky/article/details/45745887
`select`、`poll`和`epoll`是Linux系统中用于I/O多路复用的三种主要机制,它们允许单个进程同时监控多个文件描述符(FD),等待数据就绪后再进行相应的操作。下面我们将详细探讨这三个概念及其原理。 1. **select**...
有三个方式select、poll、epoll。 select:将文件描述符放入一个集合中,调用select时,将这个集合从用户空间拷贝到内核空间(缺点:每次都要复制,开销大),由内核根据就绪状态修改该集合的内容。 poll:和select...
1. EPOLL 与 Select、Poll 的比较: - Select:限制 FD 数量(通常为 1024),且在监控大量 FD 时效率低下,需要遍历整个 FD 集合。 - Poll:解决了 Select 的 FD 数量限制,但同样需要遍历所有 FD 来查找就绪事件...
它主要涉及到TCP/UDP协议以及select/poll/epoll等多路复用技术。 TCP/UDP协议是网络通信的基础,其中TCP协议提供面向连接的可靠数据传输,而UDP协议则提供无连接的不可靠数据传输。在Linux网络编程中,开发者需要...
无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。而如果你想我一样从2.5内核就关注epoll的话,一定...
在Linux内核源码中,poll系统调用的实现代码位于`fs/select.c`文件中的`sys_poll`函数。poll调用的核心在于`struct poll_table_struct`结构体,该结构体包含了回调函数指针`qproc`,它指向`__pollwait`函数。`__...
### select、poll、epoll的内部机制调研:深入探索Linux多路复用技术 #### 一、引言 在Linux操作系统中,对于I/O密集型的应用程序,如何高效地管理多个并发连接,成为了提高系统性能的关键。传统的阻塞式I/O在面对...
本文件“Help to understand select, poll, epoll.pdf”旨在帮助开发者深入理解这些机制的工作原理,特别是它们与Linux内核的关系。 首先,`select`函数是最早引入的I/O多路复用技术。它允许程序监控多个文件描述符...
网络io的使用实例 1.阻塞 2.多线程 3.select 4.poll, 5.epoll