zoukankan      html  css  js  c++  java
  • epoll IO多路复用(异步阻塞AIO)

    epoll的异步阻塞(AIO):

      用户线程创建epoll后,其实是内核线程负责扫描 fd 列表(在网络服务器上可以是socket,socket在创建后返回的也是文件描述符),并填充事件链表。但是,并不会主动通知用户线程,没有一个回调函数调用之前注册好的函数,还是需要用户线程不停的轮询,所以epoll有人也叫他 伪AIO。

    epoll的三个函数:

    #include <sys/epoll.h>
    int epoll_create(int size);
    int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
    int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

    epoll与select、poll的区别:

    (1)select和poll需要不断的轮询fd_set看是否有就绪的设备。这期间需要多次睡眠与唤醒的交替。

          epoll虽然也需要不断轮询就绪链表,也需要多次睡眠与唤醒,但是一旦有设备就绪,调用回调函数就会把fd放入就绪链表中,并唤醒epoll-wait中进入睡眠的进程。 那么,select和poll需要在醒着的时候遍历整个fd集合,而epoll醒来之后直接看 “就绪链表”就可以了。

      所以在高并发量,低活跃链接的系统中,epoll效率很高。节省了大量的CPU时间,这是回调机制带来的好处。

    (2)select和poll每次轮询都要把fd set从用户态向内核态拷贝一次,并且要把current向内核中的设备等待队列挂一次。而epoll只需要拷贝一次,也挂一次。

    (3)可以监视的设备 epoll要比select多很多。

  • 相关阅读:
    LR 两种录制:html与url
    性能测试心得之一
    杂记
    基于 python 的接口测试框架
    POJ3579 Median
    洛谷P4035 [JSOI2008]球形空间产生器
    洛谷P2455 [SDOI2006]线性方程组
    POJ2393 Yogurt factory
    洛谷P3763 [TJOI2017]DNA
    洛谷P2234 [HNOI2002]营业额统计
  • 原文地址:https://www.cnblogs.com/luntai/p/6501170.html
Copyright © 2011-2022 走看看