zoukankan      html  css  js  c++  java
  • select和epoll

    什么是select,它的工作原理,优缺点?
    select是多路复用模型下的一个模块,
    工作原理:
    通过调用select,向内核拷贝fd(文件描述符),
    内核监视select下的所有套接字,会遍历所有套接字,查看是否有事件发生,
    没有事件发生则睡眠,直到有事件发生,或者timeout时间到了后,唤醒,再次遍历,
    内核一旦查看到有事件发生,则返回遍历后的fd,
    将fd从内核拷贝到用户空间,用户进程再根据fd遍历一遍,找到发生事件的套接字
    优点:使服务端达到并发的效果,只用到单线程,所用的cpu资源少,减少了网络io堵塞
    缺点:
    1,遍历的fd在linux上有数量限制,1024个
    2,fd从用户态拷贝到内核态,每次都需要复制,产生巨大的开销
    3.对fd的扫描形式是一种遍历的方式,要找到发生的事件必须从头开始扫,
    对没有发生事件的fd做了大量无用功.

    什么是epoll,工作原理,优缺点?
    epoll是linux系统提供的多路复用模块
    工作原理:
    epoll模块提供了三个函数调用,分别是epoll_creat,epoll_ctl,epoll_wait
    调用epoll_create,创建红黑树,和就绪链接表
    调用epoll_ct,若要添加新的句柄,如果存在则返回,
    不存在则添加到树干上,然后向内核注册回调函数,
    当事件发生的时候,可以往就绪链接表中插入数据
    调用epoll_wait,查看就绪链接表中有没有就绪的fd,
    如果有则返回就绪的fd数目,通过mmap(内存映射技术)得到相应的文件描述符,
    没有则睡眠,直到有就绪的fd或者timeout时间到了
    优点:
    1,没有最大的fd限制,只受到服务端内存大小的限制
    2.效率提升,只有句柄中有事件发生,就会调用回调函数,把相应的fd放到就绪链接表中,
    不用从头开始遍历fd,
    3.省去了不必要的内存拷贝,如mmap技术
    缺点:
    当fd数量较少时,epoll的速度不见得比select的速度快
    对于单个连接,不存在优势

  • 相关阅读:
    JAVA基础——编程练习(二)
    JAVA基础——面向对象三大特性:封装、继承、多态
    JVM内存
    50. Pow(x, n) (JAVA)
    47. Permutations II (JAVA)
    46. Permutations (JAVA)
    45. Jump Game II (JAVA)
    43. Multiply Strings (JAVA)
    42. Trapping Rain Water (JAVA)
    41. First Missing Positive (JAVA)
  • 原文地址:https://www.cnblogs.com/wengxiaobin/p/11630069.html
Copyright © 2011-2022 走看看