Linux网络编程之select、poll、epoll的比较,以及epoll的水平触发(LT)和边缘触发(ET)

Linux的网络通信先后推出了select、poll、epoll三种模式。

select有以下三个问题:

(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大。

(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大。

(3)select支持的文件描述符数量太小了,默认是1024。

poll解决了第三个问题,select保存描述符fd的数据结构是数组,poll改成了链表,突破了fd的个数限制。

但是第1和第2个问题依然存在。

epoll在poll的基础上,又解决了前两个问题:

(1)对第一个问题,epoll每次注册新的事件到epoll句柄中时(在epoll_ctl中指定EPOLL_CTL_ADD),会把所有的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝。这样epoll保证了每个fd在整个过程中只会拷贝一次。

(2)对第二个问题,epoll单独设置了一个就绪链表,当fd就绪(可读/可写)之后,放入就绪链表。epoll_wait只需要遍历就绪链表,而不需要遍历所有的fd,从而节省大量的CPU时间。

epoll有LT和ET两种工作模式,默认工作模式是LT(水平触发),高速工作模式是ET(边缘触发)。

LT是fd只要处于可读或可写状态,就会通知用户;ET只有不可读变为可读,或不可写变为可写之时,才会通知用户。

ET对系统的调用,比LT要少得多,所以ET是高速工作模式,效率高很多。

用户使用ET模式时,读/写fd的时候,必须连续读/写完(直到返回EAGAIN错误)。否则如果未读/写完,系统会认为状态没有变化,就不会再重复通知,这样这个fd就死掉了。

原文地址:https://www.cnblogs.com/heluan/p/9589086.html

时间: 2024-07-31 14:46:56

Linux网络编程之select、poll、epoll的比较,以及epoll的水平触发(LT)和边缘触发(ET)的相关文章

linux网络编程之shutdown() 与 close()函数详解

linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 [cpp] view plain copy print? <span style="font-size:13px;">#include<unistd.h> int 

linux网络编程之TCP/IP基础篇(一)

从今天起,将会接触到网络编程,平台是linux,实现语言C语言,最后将会实现一个简易的miniftp服务器. 主要的内容安排为:linux网络编程之TCP/IP基础篇,SOCKET编程篇,进程间通信篇,线程篇,实战ftp篇. 1.ISO/OSI参考模型:open system interconnection开放系统互联模型是由OSI(international organization for standardization )国际标准化组织定义的网络分层模型,共七层. 各层的具体含义: 物理层

网络编程之select

一 select函数简介 select一般用在socket网络编程中,在网络编程的过程中,经常会遇到许多阻塞的函数,网络编程时使用的recv, recvfrom.connect函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法执行下面的代码.这是就需要用到非阻塞的编程方式,使用 selcet函数就可以实现非阻塞编程.selcet函数是一个轮循函数,即当循环询问文件节点,可设置超时时间,超时时间到了就跳过代码继续往下执行 select(),确定一个或多个套接口的状态,本函数

Linux网络编程之epoll知识点备忘

首先是关于IO多路复用的基础概念: select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间. 关键要了解阻塞非阻塞.同步异步之间的关系与区别,然后对

(转)linux网络编程之IO模型

原文:http://www.cnblogs.com/kunhu/p/3624000.html 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:  

(10)Linux 网络编程之ioctl函数

1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的信息,所以,我们有必要了解一下ioctl函数的具体实现. 2.相关结构体与相关函数 #include int ioctl(int d,int request,....); 参数: d-文件描述符,这里是对网络套接字操作,显然是套接字描述符 request-请求码 省略的部分对应不同的内存缓冲区,而具

linux/unix网络编程之 select

转自http://www.cnblogs.com/zhuwbox/p/4221934.html linux 下的 select 知识点 unp 的第六章已经描述的很清楚,我们这里简单的说下 select 的作用,并给出 select 的客户端实例.我们知道 select 是IO 多路复用的一个最简单支持,poll 和 epoll 是 select 的升级版.在 UNIX 网络编程第五章读书笔记 我们遇到这样一个问题:当客户端阻塞在 fgets() 等待客户输入的时候,服务器端断开连接.而客户端却

socket编程之select(),poll(),epoll()

socket编程,通信 client端  socket() ----->connect() ------->recv() -----> close(); server端 socket() ----->bind()  ------> listen() ---->accept() ------>send() ------->close(); 1> socket(int family,int type,int protocol); family ->协

Linux网络编程之socket相关结构体

Linux中的网络编程是通过 Socket (套接字)实现. Socket有三种类型: 流式套接字(SOCK_STREAM) 流式套接字可以提供可靠的.面向连接的通讯流,它使用TCP协议.TCP保证了数据传输的正确性和顺序性. 数据报套接字(SOCK_DGRAM) 数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,它使用数据报协议UDP. 原始套接字(SOCK_RAM) 原始套接字允许使用IP协议,主要用于新的网络协议的测试等. Socket