• select的问题以及epoll的使用


    select的问题

    1. 当进程被唤醒时,不清楚到底哪个socket有数据,只能遍历一遍
    2. 每一次select的执行,都需要将这进程,再加入到等待队列中
    3. 为了重复添加等待队列,当每一次操作完成时,也需要从等待队列中删除进程

    所以select最大的限制被设置为了1024,如此看来select连多线程都比不上

    于是就推出了poll和epoll

    poll

    • 简单的对select进行了优化,但依旧不够完美,过渡使用,epoll才是最后的解决方案

    epoll

    • epoll只能在linux中使用,因为这和操作系统相关

    中断程序会将内核的数据copy到socket缓冲区,然后唤醒socket的等待队列,就是epoll,epoll又会唤醒进程A

    epoll维护了一个就绪队列

    socket数据准备好的时候会执行一个回调函数,将自己的地址交给epoll

    epoll将其添加到就绪列表中,即可

    进程A只需要访问epoll的就序列带能够获取到就绪的socket对象

    没懂

    epoll如何解决select的两个问题

    1. epoll把对于等待队列的操作,与阻塞进程分开了
    2. epoll自己维护了一个等待列表,避免了遍历所有的socket
  • 相关阅读:
    C++链式队列基本操作
    C++链栈基本操作
    C++顺序栈基本操作
    C++链表基本操作
    C/C++/JAVA
    C++操作链表
    How Many Maos Does the Guanxi Worth
    Heavy Transportation
    Frogger
    Til the Cows Come Home(Dijkstra)
  • 原文地址:https://www.cnblogs.com/lucky75/p/11167453.html
Copyright © 2020-2023  润新知