1 linux的poll操作

linux文件的poll操作有两个主要目的:第一,主动查看该文件上是否有读写事件;第二,提供操作waitqueue的接口给epoll等上层接口使用,比如epoll可以通过直接调用其所监视的文件的poll操作来注册自己的回调到该文件的waitqueue中,所谓的回调就是waitqueue entry中的function,这样的话,当epoll所监视的文件有数据到来的话,注册到waitqueue中的回调就回被调用,然后该文件就可以被放入epoll的rdllist中。

2 ep_item_poll和ep_poll_callback

ep_item_poll中将ep_poll_callback作为waitqueue entry的function注册给所监视的文件的waitqueue。

3 rdllist和ovflist

有读写事件的文件都放在rdllist这个队列中。在用户epoll_wait的时候,需要将rdllist拷贝到用户空间并且加锁,这个时候如果来了新的事件,就先放在ovflist中,在rdllist不忙的时候再放入其中。

4 epoll_create、epoll_ctl和epoll_wait

epoll_create是为当前线程创建一个epoll实体来监视所需要监视的文件,epoll_ctl是往epoll中加入需要监视的文件,epoll_wait是查看是否有事件到来,并且进行相应的处理,因为要一直监视,所以,需要一个死循环不断的进行epoll_wait。

如果当前线程上没有读写事件,epoll_wait会被挂起,醒来策略和timeout时间的设置有关,如果是正的t,那么就等待这个时间t之后醒来,如果是0,那么立即返回,如果是负数,那么一直等到至少有一个事件到来,或者有error了醒来。

之所以需要设置timeout,是因为epoll_wait如果没有发现事件会挂起的,如果没有信号没有事件到来,如果不弄一个timeout,线程就死在这里了。当然,有新的事件到来会唤醒它的。

linux epoll的实现原理的更多相关文章

  1. Java网络编程和NIO详解6:Linux epoll实现原理详解

    Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO h ...

  2. Windows完成端口与Linux epoll技术简介

    收藏自:http://www.cnblogs.com/cr0-3/archive/2011/09/09/2172280.html WINDOWS完成端口编程1.基本概念2.WINDOWS完成端口的特点 ...

  3. 源码剖析Linux epoll实现机制及Linux上惊群

    转载:https://blog.csdn.net/tgxallen/article/details/78086360 看源码是对一个技术认识最直接且最有效的方式了,之前用Linux Epoll做过一个 ...

  4. Windows完成端口与Linux epoll技术简介(能看懂)

    WINDOWS完成端口编程1.基本概念2.WINDOWS完成端口的特点3.完成端口(Completion Ports )相关数据结构和创建4.完成端口线程的工作原理5.Windows完成端口的实例代码 ...

  5. 深入理解NIO(四)—— epoll的实现原理

    深入理解NIO(四)—— epoll的实现原理 本文链接:https://www.cnblogs.com/fatmanhappycode/p/12362423.html 终于来到最后了,万里长征只差最 ...

  6. Server Develop (六) Linux epoll总结

    Linux  epoll epoll是Kernel 2.6后新加入的事件机制,在高并发条件下,远优于select.epoll最大的好处在于它不会随着监听fd数目的增长而降低效率.因为在内核中的sele ...

  7. Linux数据包路由原理、Iptables/netfilter入门学习

    相关学习资料 https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html http://zh.wik ...

  8. Linux Epoll介绍和程序实例

    Linux Epoll介绍和程序实例 1. Epoll是何方神圣? Epoll但是当前在Linux下开发大规模并发网络程序的热门人选,Epoll 在Linux2.6内核中正式引入,和select类似, ...

  9. Linux epoll总结

    Linux epoll总结 Linux  epoll epoll是Kernel 2.6后新加入的事件机制,在高并发条件下,远优于select.epoll最大的好处在于它不会随着监听fd数目的增长而降低 ...

随机推荐

  1. rails使用bootstrap

    在Gemfile文件中添加'bootstrap-sass',再运行bundle install gem 'bootstrap-sass' 在config/application.rb添加一行代码,让b ...

  2. day15-python之变量和递归

    1.局部变量与全局变量 #!/usr/bin/env python # -*- coding:utf-8 -*- # name='lhf' # def change_name(): # global ...

  3. python中的函数的分类

    函数的种类 传参的基本要求 默认参数 *args 关键字参数 **kwargs 普通函数 带参数 默认参数 def text(a,b=2) print("haha") print( ...

  4. 剑指Offer(书):重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...

  5. 稳定排序(sort+结构体)

    #include<cstdio> #include<algorithm> #include<string.h> using namespace std; struc ...

  6. 大数据学习——flume拦截器

    flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...

  7. 相应缓存设置HttpCacheability 枚举

      成员名称 说明   NoCache 设置 Cache-Control: no-cache 标头.如果没有字段名,则指令应用于整个请求,且在满足请求前,共享(代理服务器)缓存必须对原始 Web 服务 ...

  8. Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) 圣诞之夜!

    A. Santa Claus and a Place in a Class 模拟题.(0:12) 题意:n列桌子,每列m张桌子,每张桌子一分为2,具体格式看题面描述.给出n,m及k.求编号为k的桌子在 ...

  9. POJ-1797Heavy Transportation,最短路变形,用dijkstra稍加修改就可以了;

    Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K          Description Background  Hugo ...

  10. nginx反向代理ajax,解决跨域问题

    server { listen 8000; server_name somename alias another.alias; location /a { add_header 'Access-Con ...