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中记录了所监视的文件的状态,这样,当用户空间想要知道这些状态时,直接查看就可以了,不需要再现场查找了。

  • 相关阅读:
    使用匿名内部类的创建形式完成线程的2种方式
    线程的2种创建方式
    深入学习 viewport 和 px
    <script> 标签位置应该放在哪里?
    JavaScript 创建对象的几种方式?
    Palindrome Number
    String To Integer
    Reverse Integer
    Zigzag Conversion
    Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/hustdc/p/8111174.html
Copyright © 2011-2022 走看看