• epoll原理


    系统调用说明

    epoll_create:在内核中创建epoll结构
    epoll_ctl:add
    1. 调用监听的文件的poll方法,设置callback
    2. 设备就绪时唤醒等待队列上的进程,此时会调用callback
    3. 该callback会将监听事件放入epoll的就绪队列中
    epoll_wait:判断就绪队列中是否有事件

    与select, poll区别

    select/poll 会将监听的描述符表copy到内核
    然后顺序扫描各个监听对象的poll函数,如果有事件(如可读),poll返回可读掩码。
    循环最后如果有事件就返回用户空间进行处理
    

    ET为啥比LT高效?

    更少的系统调用次数?
    

    ET饥饿现象如何避免?

    饥饿:如某个链接上有大量数据写入,导致其他事件得不到处理。
    可以在用户态做一层管理,如果读取了1MB以上的数据,就处理下一个事件。均衡一下
    

    select源码

    [fs/select.c do_select](https://www.jianshu.com/p/da6642369ef0)
    如果没有就绪事件就去睡眠,直到超时时间到,醒来再遍历一把,然后timeout退出。
    要么从timeout中醒来,要么从事件中醒来,醒来之后继续在死循环中
    
    poll会返回当前fd的状态(比如是否可读写),根据这个状态,do_select做不同的动作。
    1. 如果fd的状态与应用程序监听的事件匹配,则记录下来,do_select退出循环,并把结果返给上层。
    2. 如果不匹配,do_select发现timeout或进程有signal信号打断,也会退出循环,返回空给应用。
    

    epoll部分源码

    ep_insert注册的回调函数中,会把epitem放到eventpoll结构的rdlist上
    ep_send_event中调用ep_send_events_proc的每个event,这里要调用epitem对应的file的poll函数,获取返回的掩码
    
    void poll_wait(struct file *filp, wait_queue_head_t *queue, poll_table *wait);
    他的作用就是把当前进程添加到wait参数指定的等待列表(poll_table)中。该函数中不会阻塞。
    
    另一个函数:__wake_up_common
  • 相关阅读:
    [公告]Google个性化主页可以正常阅读博客园的RSS了
    致歉
    [公告]网站程序已经升级到ASP.NET 2.0
    GTF: Great Teacher Friedman
    Node.js : exports と module.exports の違い
    拨开历史的迷雾从篡夺者战争到五王之战的政经原因
    javascript模板系统 ejs v10
    window.name + postMessage实现不用代理页的跨域通信
    node.js Domain 時代のエラー処理のコーディングパターン
    鲜为人知的get,set操作符
  • 原文地址:https://www.cnblogs.com/holidays/p/epoll1.html
Copyright © 2020-2023  润新知