【电话面试】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的更多相关文章

  1. IO多路复用之select poll epoll

    参考文档: http://blog.csdn.net/tennysonsky/article/details/45745887 select(),poll(),epoll()都是I/O多路复用的机制. ...

  2. I/O多路复用之select,poll,epoll简介

    一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...

  3. IO模型之IO多路复用 异步IO select poll epoll 的用法

    IO 模型之 多路复用 IO 多路复用IO IO multiplexing 这个词可能有点陌生,但是如果我说 select/epoll ,大概就都能明白了.有些地方也称这种IO方式为 事件驱动IO ( ...

  4. Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)

    Linux下测试代码: http://www.linuxhowtos.org/C_C++/socket.htm TCP模型 //TCPClient.c #include<string.h> ...

  5. Python 协程/异步IO/Select\Poll\Epoll异步IO与事件驱动

    1 Gevent 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到 ...

  6. 浅谈网络I/O多路复用模型 select & poll & epoll

    http://blog.csdn.net/nk_test/article/details/50662946

  7. Select/Poll/Epoll异步IO

    IO多路复用 同步io和异步io,阻塞io和非阻塞io分别是什么,有什么样的区别? io模式 对于一次io 访问(以read为例),数据会先拷贝到操作系统内核的缓冲区,然后才会从操作系统内核的缓冲区拷 ...

  8. Linux IO模式以及select poll epoll详解

    一 背景 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network ...

  9. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

  10. IO多路复用select/poll/epoll详解以及在Python中的应用

    IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...

随机推荐

  1. 数据驱动DDT(Data-Driven Tests):测试数据的参数化

    准备第三方库: 首先安装ddt库,其次在脚本中引入ddt 打开官网 https://pypi.org/project/ddt/ from ddt import ddt,data,unpack @ddt ...

  2. Linux系统安装&VMware安装一

    本次安装使用的VMware版本是15.5pro,镜像文件是centos7_x86 如果你还没有VMware和镜像文件,这里给你提供: https://my.vmware.com/cn/web/vmwa ...

  3. PulADC驱动设计

    Ref大电容10uF,X5R或钽电容,不建议NPO 参考信号的驱动(高能输出基准源,或者运放),低阻抗,大SlowRate,小建立时间:: ADA4841-1, AD8021, ADA4899-1, ...

  4. ORA-01427: 单行子查询返回多个行 出现原因及对应防止措施

    原因:没有做好子查询约束条件 解决方法:1.加 AND ROWNUM =1 条件 但筛选结果可能并非一定是你想要的 2.匹配查询唯一约束条件

  5. Django框架搭建web项目(一)

    建议查看官方文档:https://docs.djangoproject.com/zh-hans/4.0/intro/tutorial01/ 1.本地安装python环境(略) 2.本地安装Django ...

  6. Callable、Future、FutureTash详解

    Callable.Future.FutureTash详解 Callable与Future是在JAVA的后续版本中引入进来的,Callable类似于Runnable接口,实现Callable接 口的类与 ...

  7. asm 理解

    stm32中有3条总线:地址总线,数据总线,系统总线:地址总线上是地址值,数据总线上是数据值,cpu读写时会先在地址总线上传输地址值,如果是写操作之后数据总线上会放往前面地址处写入的数据值,如果是读操 ...

  8. 实验二 实验二 Linux系统简单文件操作命令

    项目 内容 这个作业属于哪个课程 <班级课程的主页链接> 这个作业的要求在哪里 <作业要求链接接地址> 学号-姓名 15043109吴小怀 作业学习目标 学习在Linux系统终 ...

  9. pip 临时切换 国内源

    sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

  10. 【cs231n】knn作业笔记

    完成了assignment-1中knn相关内容的作业,记录一下遇到的知识点和问题 knn.ipynb的内容大致包括: 1.数据集的建立 主要是通过切片函数,如下图选取前5000张图片和其标记作为训练数 ...