系统调用说明

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. 少女NULL中

    NULL inline void read (int &now) { register ; ; !isdigit (word); word = getchar ()) ; + word - ' ...

  2. 【CF1142B】Lynyrd Skynyrd

    [CF1142B]Lynyrd Skynyrd 题面 洛谷 题解 假设区间\([l,r]\)内有一个循环位移,那么这个循环位移一定有一个最后的点,而这个点在循环位移中再往前移\(n-1\)个位置也一定 ...

  3. git 中文文件名乱码

    git 默认中文文件名是 \xxx\xxx 等八进制形式,是因为 对0x80以上的字符进行quote. 只需要设置core.quotepath设为false,就不会对0x80以上的字符进行quote. ...

  4. http 缓存机制简介

    我们应该从两个角度来看http的缓存:缓存控制 和 缓存校验.缓存控制:控制缓存的开关,用于标识请求或访问中是否开启了缓存,使用了什么样的存方式.缓存校验:如何校验缓存,缓存的有效期,如何确定缓存是最 ...

  5. Centos7 配置静态IP并使用xshell远程连接

    静态IP配置 1.定位到 /etc/sysconfig/network-scripts文件夹,打开文件夹下面的ifcfg-enp3s0文件 2.修改BOOTPROTO=static  ONBOOT=y ...

  6. 分析WordPress数据表之评论表(功能篇)

    数据表分析 wp_comments(评论表) 该表字段,如下:comment_ID(评论ID)comment_post_ID(评论文章ID)comment_author(评论者用户名)comment_ ...

  7. java并发编程(三)cpu cache & 缓存一致性

    一 cpu cache 1. cache的意义    为什么需要CPU cache?因为CPU的频率太快了,快到主存跟不上,这样在处理器时钟周期内,CPU常常需要等待主存,浪费资源.所以cache的出 ...

  8. Spring中为什么继承了ApplicationContextAware接口就可以使用ApplicationContext对象?

    1.Spring中使用applicationContext对象 public class SpringContextUtil implements ApplicationContextAware { ...

  9. tig

    /******************************************************************************* * tig * 说明: * tig便于 ...

  10. [SQL]用于提取组内最新数据,左连接,内连接,not exist三种方案中,到底谁最快?

    本作代码下载:https://files.cnblogs.com/files/xiandedanteng/LeftInnerNotExist20191222.rar 人们总是喜欢给出或是得到一个简单明 ...