系统调用说明

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

epoll原理的更多相关文章

  1. select/poll/epoll原理探究及总结

    select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...

  2. epoll 原理

    本文转载自epoll 原理 导语 以前经常被人问道 select.poll.epoll 的区别,基本都是靠死记硬背的,最近正好复习 linux 相关的内容,就把这一块做个笔记吧,以后也能方便查阅. e ...

  3. epoll原理详解及epoll反应堆模型

    本文转载自epoll原理详解及epoll反应堆模型 导语 设想一个场景:有100万用户同时与一个进程保持着TCP连接,而每一时刻只有几十个或几百个TCP连接是活跃的(接收TCP包),也就是说在每一时刻 ...

  4. epoll原理解释(转)

    转自:http://yaocoder.blog.51cto.com/2668309/888374   首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. ...

  5. epoll原理与本质

    我们知道IO模型中有一个NIO模型,像我们平时接触到的dubbo类的RPC框架底层基于Netty作为通讯框架,而Netty实现的IO模型就是NIO模型.而NIO模型中 底层技术就用到了Linux的ep ...

  6. EPOLL原理详解(图文并茂)

    文章核心思想是: 要清晰明白EPOLL为什么性能好. 本文会从网卡接收数据的流程讲起,串联起CPU中断.操作系统进程调度等知识:再一步步分析阻塞接收数据.select到epoll的进化过程:最后探究e ...

  7. Socket编程实践(11) --epoll原理与封装

    常用模型的特点 Linux 下设计并发网络程序,有典型的Apache模型(Process Per Connection,PPC), TPC(Thread Per Connection)模型,以及 se ...

  8. redis epoll 原理梗概

    redis 是一个单线程却性能非常好的内存数据库, 主要用来作为缓存系统. redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量.为什么 Redis 中要使用 I/O 多路复用这 ...

  9. select和epoll原理和区别

    对于select和poll,其主要原理跟epoll不同 poll和select的共同点就是,对全部指定设备(fd)都做一次poll,当然这往往都是还没有就绪的,那就会通过回调函数把当前进程注册到设备的 ...

随机推荐

  1. OOO的CSS

    应ooo要求 寻找他手写一千年的css的继承人 html { background:#f7f7f7 url(images/bg-pattern.jpg) } body { margin:; paddi ...

  2. STL next_permutation 全排列

    调用方法: ]={,,,}; )){ ;i<;i++) printf("%d ",arr[i]); puts(""); } 测试效果: 注:可以看到1 2 ...

  3. Python逆向(二)—— pyc文件结构分析

    一.前言 上一节我们知道了pyc文件是python在编译过程中出现的主要中间过程文件.pyc文件是二进制的,可以由python虚拟机直接执行的程序.分析pyc文件的文件结构对于实现python编译与反 ...

  4. Java中Set真的是无序的吗?

    我们经常听说List是有序且可重复的,Set是无序且不重复的.这是一个误区,这里所说的顺序有两个概念,一是按照添加的顺序排列,二是按,照自然顺序a-z排列.Set并不是无序的传统所说的Set无序指的是 ...

  5. Spring Cloud Ribbon源码分析---负载均衡实现

    上一篇结合 Eureka 和 Ribbon 搭建了服务注册中心,利用Ribbon实现了可配置负载均衡的服务调用.这一篇我们来分析Ribbon实现负载均衡的过程. 从 @LoadBalanced入手 还 ...

  6. stream_context_create解析

    (PHP 4 >= 4.3.0, PHP 5, PHP 7) stream_context_create — 创建资源流上下文 说明¶ stream_context_create ([ arra ...

  7. 【转】Android Fastboot 与 Recovery 和刷机

    1. 首先来看下Android系统的分区:   Android系统的分区.jpg   Android分区解释.png 安卓系统一般把rom芯片分成7个区,如果再加上内置sd卡这个分区,就是8个: hb ...

  8. 破解magento加密的密码算法

    magento遇到丢掉密码的情况,其实很常见……比如我这记性,还好我比较暴力:-P      先看一段代码:           /**  * Hash a string  *  * @param s ...

  9. java 把 PEM 格式的公钥证书转换为 X.509 格式的证书

    代码: @UtilityClass public final class X509Certs { private static final CertificateFactory CERTIFICATE ...

  10. HTML5中使用EventSource实现服务器发送事件

    在HTML5的服务器发送事件中,使用EventSource对象可以接收服务器发送事件的通知. 示例: es.html <!DOCTYPE html> <html> <he ...