多路复用IO:select poll epoll
【电话面试】io多路复用专题面试 这个真猛
有人做了笔记:点这里
select
Select(Max+1,&rset,null,null,null)是因为0~max是max+1。
过程:
- 将文件描述符收集过来,把bitmap从用户态拷贝到内核态,交给内核态判断那个有数据。Select是个阻塞函数,没有数据时会一直阻塞在select。如果有数据来,FD(对应的bitmap那一位)置位,然后select返回,O(n)判断哪一个被置位了,然后将那一位的数据读出来然后进行处理。
缺点:
- 1 bitmap默认大小是1024,虽然能调整,但仍有上线。
- 2 从用户态切换到内核态的切换然后拷贝有额外开销。
- 3 O(n)遍历判断哪一个被置位了。
poll
Poll(pollfds,5(元素个数),50000(超时时间));
- 同样是从用户态拷贝到内核态,和select一样,好处是没有使用bitmap,strct pollfd{Int fdl short events; short revents;};
- event在意的事件(读写),poll也是阻塞函数,有被置位,置的是revents而不是fd,然后返回。O(n)个被置位了,然后将那一位的数据读出来然后进行处理,将revents重置为0。
改善的缺点就是没了bitmap的上限(pollfd设置元素个数)
epoll
epoll只能工作在linux下!
- 首先创建一个epoll对象,然后使用epoll_ctl对这个对象进行操作,把需要监控的描述添加进去,这些描述如将会以epoll_event结构体的形式组成一颗红黑树,接着阻塞在epoll_wait,当某个fd上有事件发生时,内核中断处理函数将会把其对应的结构体放入到一个链表中,最后返回有事件发生的链表。
- 如何解决poll的缺点?fd是共享在用户态和内核态之间,避免的切换拷贝的资源开销。把触发的事件用链表存储,这样可以通过O(1)访问。
epoll 水平触发(LT)与 边缘触发(ET)的区别?
- 水平触发(LT,Level Trigger):当文件描述符就绪时,会触发通知,如果用户程序没有一次性把数据读/写完,下次还会发出可读/可写信号进行通知。
- 边缘触发(ET,Edge Trigger):仅当描述符从未就绪变为就绪时,通知一次,之后不会再通知。
区别:边缘触发效率更高,减少了事件被重复触发的次数,函数不会返回大量用户程序可能不需要的文件描述符。
使用场景:当连接数较多并且有很多的不活跃连接时,epoll 的效率比其它两者高很多。当连接数较少并且都十分活跃的情况下,由于 epoll 需要很多回调,因此性能可能低于其它两者。
多路复用IO:select poll epoll的更多相关文章
- IO多路复用之select poll epoll
参考文档: http://blog.csdn.net/tennysonsky/article/details/45745887 select(),poll(),epoll()都是I/O多路复用的机制. ...
- I/O多路复用之select,poll,epoll简介
一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...
- IO模型之IO多路复用 异步IO select poll epoll 的用法
IO 模型之 多路复用 IO 多路复用IO IO multiplexing 这个词可能有点陌生,但是如果我说 select/epoll ,大概就都能明白了.有些地方也称这种IO方式为 事件驱动IO ( ...
- Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
Linux下测试代码: http://www.linuxhowtos.org/C_C++/socket.htm TCP模型 //TCPClient.c #include<string.h> ...
- Python 协程/异步IO/Select\Poll\Epoll异步IO与事件驱动
1 Gevent 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到 ...
- 浅谈网络I/O多路复用模型 select & poll & epoll
http://blog.csdn.net/nk_test/article/details/50662946
- Select/Poll/Epoll异步IO
IO多路复用 同步io和异步io,阻塞io和非阻塞io分别是什么,有什么样的区别? io模式 对于一次io 访问(以read为例),数据会先拷贝到操作系统内核的缓冲区,然后才会从操作系统内核的缓冲区拷 ...
- Linux IO模式以及select poll epoll详解
一 背景 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network ...
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- IO多路复用select/poll/epoll详解以及在Python中的应用
IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...
随机推荐
- 什么是压测,为什么要进行压力测试?Jmeter工具的使用
1.背景介绍 什么是压测? 压力测试是通过不断向被测系统施加"压力",测试系统在压力情况下的性能表现,考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在,也就是我们可 ...
- 20202411 2020-2021-2 《Python程序设计》实验二报告
20202411 2020-2021-2 <Python程序设计>实验二报告 课程:<Python程序设计> 班级: 2024 姓名: 陈书桓 学号:20202411 实验教师 ...
- linux下使用bt-rm 限速删除文件
下载限速删除工具: 链接:https://pan.baidu.com/s/1xXu4Hzr99wLlipqxVkXkBg 密码:upbe nohup ./bt-rm -l 10 ${文件地址} &am ...
- DCS-WORLD 数据获取
任务: 获取DCS-World的姿态数据,发送到6自由度平台. 过程: 1.获取dcs-bios https://github.com/DCSFlightpanels/dcs-bios 2.复制DCS ...
- Debug --> wireshark中的lua插件使用
一.使用Lua脚本对pcap文件按流进行存储 https://zhuanlan.zhihu.com/p/35188803 二.使用tshark对pcap报文进行批量切流 https://blog.cs ...
- 通过VS Code轻松连接树莓派
如果您正在使用树莓派作为开发平台,那么通过远程连接VS Code到树莓派是非常方便的一种方法.这样,您可以在Windows或macOS等计算机上开发和测试代码,而不必在树莓派上进行. 以下是通过VS ...
- login_while
# -*- coding: utf-8 -*- # @Time : 2020/7/25 22:45 # @Author : Breeze # @FileName: login_while.py use ...
- python高阶编程(二)
1.迭代器 迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问结束.迭代器只能往下不会后退. 我们已经知道,可以直接作用于f ...
- idea更改JDK版本_Mac
大致分为几个步骤: 在SDKs中添加JDK(已经添加过就不用添加了) 修改项目的Project SDK和Project language level(两个版本要一致) 修改Modules中的Sourc ...
- Java压缩音频视频工具类
/** * TODO * * @author Administrator * @version 1.0 * @date 2021/11/5 16:55 */ public class vedio { ...