zoukankan      html  css  js  c++  java
  • linux select poll and epoll

    这里以socket文件来阐述它们之间的区别,假设现在服务器端有100 000个连接,即已经创建了100 000个socket。

    1 select和poll

    在我们的线程中,我们会弄一个死循环,在循环里面不断的进行select()。这个select()进入操作系统层面,会主动去调用每个socket文件的poll()函数,主动去询问是否有数据来了,然后返回所有数据ready的socket。也就是说,进行一次select(),它需要进行10 000次的询问。select和poll都是这样的。

    2 epoll

    在我们的线程中,我们也会弄一个死循环,在循环中不断的进行epoll_wait()。在这个epoll_wait()这个调用层级里面,直接去查看ready list里面是否有socket是ready的,如果有的话直接将这个list返回给用户空间,这个操作几乎是实时的。

    那么这个ready list是怎么来的呢?

    关键的思想很简单,将自己放入socket的wait queue中,一旦有数据来了,就会把它放入ready list中。

    3 select/poll和epoll的主要区别

    前者是无状态的,也就是说,内核并不保存所监视的文件的读写状态,当用户空间需要知道这些状态时,会调用内核的接口去现场查找。而后者是有状态的,后者在内核中弄了一个ready list,当有socket文件有数据时,就会自动加入到该ready list中,ready list中记录了所监视的文件的状态,这样,当用户空间想要知道这些状态时,直接查看就可以了,不需要再现场查找了。

  • 相关阅读:
    excel数据 入库mysql 和 mysql数据 导入excel文件
    gson和fastjson将json对象转换成javaBean 简单对照
    docker入门
    jdbc 事务
    关于Java 实现抽象类的抽象方法的特性的利用---面向切面
    try}-with-resources
    关于虚拟机加载类的先后顺序测试
    MySQL api
    JS 截取字符串-全是干货
    JS截取字符串常用方法详细整理
  • 原文地址:https://www.cnblogs.com/hustdc/p/8111174.html
Copyright © 2011-2022 走看看