多路复用之select、epoll、poll

IO的多路复用:一个进程可以监视多个描述符,一旦某个描述符读就绪或写就绪,能够通知进程程序进行相应的读写操作

使用场景:

1.当客户处理多个描述符(网络套接口)或一个客户同时处理多个套接口

2.TCP服务器既要处理监听套接口又要处理已经连接的套接口

3.一个服务器处理多个服务或多个协议也要使用I/O复用

与多进程和多线程相比,I/O多路复用最大优点系统开销小,系统也不必创建进程或线程,因而也不用维护这些进程和线程

支持I/O多路复用的系统调用:select、poll、epoll本质上都是同步IO,因此它们都要在读写事件就绪后自己负责读写

1.select

基本原理:该函数监视的文件描述符分读描述符集、写描述符集、异常描述符集,调用该函数后select就会一直阻塞等待,直到有描述符就绪(至少有一个),或者超时等待

优点:具有良好的跨平台性

缺点:

1.单个进程所打开文件描述符个数有数量限制,32位平台下默认1024,64位平台下默认2048

2.每次都要对sock集进行线性扫描(轮询)每次都要从用户态切换到内核态,需要的开销大

3.需要维护一个用来存放大量描述符的数据结构(数组),在内核和用户空间之间的传递复制开销也很大

4.每次调用select函数前都要对timeout进行初始化,还要对它所关心的文件描述符所在的描述符集进行初始化工作

select中的timeout结构体:

1.若传NULL,就是将select设置为阻塞状态,一定要等到一个或多个描述符状态发生变化

2.若设为0秒0毫秒,则变为一个非阻塞函数,不管描述符状态是否发生变化都立即返回

3.若设为大于0,则函数会在timeout时间内阻塞,超时时间内若有事件到来就返回

2.poll

基本原理:将用户传入的数组拷贝到内核区,轮询查看每个描述符对应的事件状态,若事件就绪就加入等待队列中继续遍历,若遍历结束没有事件就绪,就挂起进程,直到有就绪事件到达或超时被唤醒,之后又要轮询

poll中含有一个结构体,它包含了要监视的事件和发生的事件,不在使用select中的参数值传递方式。

优点:没有最大连接数的限制,因为它基于链表来存储

水平触发,在每次调用该函数时都会再次检测该socket来查看该socket缓冲区中的数据是否已被读完

缺点:

1.在每次调用该函数后都要轮询遍历描述符来获取就绪的socket

2.当同时连接大量客户端时,而在某一时刻可能只有很少的处于就绪状态,随着监视的描述符数量增长,它的效率也会降低

适用场景:连接数量少并且每个连接都十分活跃

3.epoll:使用一个描述符来管理多个描述符,将用户所关心的描述符相应事件存放到内核的事件表上,只需拷贝一次

使用三个函数:

epoll_create创建一个epollfd

epoll_ctl进行注册某个socket描述符

epoll_wait等待就绪事件

基本原理:支持水平触发和边缘触发,一般默认水平触发,当使用边缘触发时,只告诉进程哪些描述符已经变为就绪状态并且只通知一次。会先注册所要关心的文件描述符及它所关心的事件,内核也会采用相应的回调机制来激活该描述符,使用epoll_wait只返回就绪的事件

优点:

1.没有最大并发连接的限制,不需要轮询的方式每次都要遍历描述符集,不会随着描述符数目的增加而下降

2.使用mmap(内存映射技术)加速与内核之间的消息传递,减少了从用户到内存的拷贝次数

,不同于select和poll的消息传递方式,通过内核与用户空间共享一块内存来实现

两种工作模式:

LT:当调用epoo_wait检测到描述符事件发生并通知应用程序,应用程序应立即处理,若不处理,则下次还会再次告知上层应用程序

ET:调用epoll_wait检测到描述符事件发生并通知上层应用且只通知一次,只支持非阻塞socket(避免由于一个句柄的阻塞读或写让后续的多个文件描述符一直阻塞等待),在很大程度上减少了时间被重复触发的次数

适用场景:同时处理大量客户端同时请求连接服务器

时间: 2024-08-26 19:31:38

多路复用之select、epoll、poll的相关文章

网络通信 --> IO多路复用之select、poll、epoll详解

IO多路复用之select.poll.epoll详解 目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select,pselect,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内

select,epoll,poll比较

select,poll,epoll简介 select select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理.这样所带来的缺点是: 1 单个进程可监视的fd数量被限制 2 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大 3 对socket进行扫描时是线性扫描 poll poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历

IO多路复用:select、poll、epoll示例

一.IO多路复用 所谓IO多路复用,就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. Linux支持IO多路复用的系统调用有select.poll.epoll,这些调用都是内核级别的.但select.poll.epoll本质上都是同步I/O,先是block住等待就绪的socket,再是block住将数据从内核拷贝到用户内存. 当然select.poll.epoll之间也是有区别的,如下表: \ select poll e

磁盘网络I/O 多路复用之 select、poll、epoll 详解

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: 当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用. 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现. 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用. 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用. 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用. 与多进程和多线程技术相

I/O多路复用之select、poll、epoll

很早之前有写过篇IO多路复用的文章:https://www.cnblogs.com/klcf0220/archive/2013/05/14/3077003.html 参考链接:https://segmentfault.com/a/1190000003063859 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select,poll,epoll本质上都是同步

聊聊IO多路复用之select、poll、epoll详解

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: 当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用. 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现. 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用. 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用. 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用. 与多进程和多线程技术相

select epoll poll

如何理解 Epoll select 和 poll 三种模型,能否用生活中的例子做比喻? 比如说你从某宝下单买了几个东西,这几个东西分别由N个快递员分别给你送过来.在某一时刻,你开始等快递.对于select/poll,就是你在睡觉的时候,收到一条短信"你有快递到了,取一下",但不知道发送方是谁(但一定是那N个快递员中的某人/某几个人给你发的),所以你必须挨个给那N个快递员分别打个电话,问他们,是不是我的快递已经到了.至于select/poll的区别,类似于你和快递员都分别有两个手机号,一

IO多路复用,select、poll、epoll 编程主要步骤

body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-chil

IO多路复用select、poll、epoll的区别

(1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作.所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长. (2)poll==>时间复杂度O(n) poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的

Linux IO模式及 select、poll、epoll详解

注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. 一 概念说明 在进行解释之前,首先要说明几个概念: - 用户空间和内核空间 - 进程切换 - 进程的阻塞 - 文件描述符 - 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32