epoll监听文件_C/C++面试问epoll原理不会?送个快递的原理而已,epoll原理图解

看到一篇不错的文章,在这里分享给大家!

本文纯属转载

原创作者:小麦大大

本文来自:https://blog.csdn.net/qq_35433716/article/details/85345907


流 IO操作 阻塞

可以进行IO操作的内核对象

文件、管道、套接字……

流的入口:文件描述符(fd)

e09c73c2f82eb79c18299c5aa4e8f0f3.png

所有对流的读写操作,我们都可以称之为IO操作。

那么当一个流中再没有数据,read的时候,或者说 在流中已经写满了数据,再write,我们的IO操作就 会出现一种现象,就是阻塞现象

3b06b03b56ad1db77b5b9cebfa60c0b5.png
cb61ecf270c1bb68ea8dc2a8036b0e59.png

阻塞等待: 空出大脑可以安心睡觉。(不占用CPU宝贵的时间片)

非阻塞,忙轮询: 浪费时间,浪费电话费,占用快递员时间(占用CPU,系统资源)

解决阻塞死等待的办法

阻塞死等待的缺点

235db857a0826129c708ca20bd692947.png
de154843df67aaa9f6a57049ce6e6639.png
c556dc08bdbad3309e4a5fa7559126f1.png

办法二:select

aec25d16b6fa70e2e3fa100521095c74.png

select 代收员 比较懒,她只会告诉你快递到了,但是是谁到的,你需要挨个快递员问一遍

办法三:epoll(主角出场)

b006e8c91a318e3178bb3928eb5939ba.png

epoll特点好处:

  1. 与select,poll一样,但是增加了对I/O多路复用的技术
  2. 只关心“活跃”的链接,无需遍历全部描述符集合
  3. 能够处理大量的链接请求(系统可以打开的文件数目)

epoll API

int epoll_create(int size);int epoll_ctl(int epfd, int op, int fd,struct epoll_event *event);struct epoll_event {__uint32_t events; /* epoll 事件 */epoll_data_t data; /* 用户传递的数据 */}/*** @param epfd 用epoll_create所创建的epoll句柄* @param op 表示对epoll监控描述符控制的动作** EPOLL_CTL_ADD(注册新的fd到epfd)* EPOLL_CTL_MOD(修改已经注册的fd的监听事件)* EPOLL_CTL_DEL(epfd删除一个fd)** @param fd 需要监听的文件描述符* * /** events : {EPOLLIN, EPOLLOUT, EPOLLPRI,EPOLLHUP, EPOLLET, EPOLLONESHOT}*/typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64;} epoll_data_t;struct epoll_event new_event;new_event.events = EPOLLIN | EPOLLOUT;new_event.data.fd = 5;epoll_ctl(epfd, EPOLL_CTL_ADD, 5, &new_event);--------------------- 
acaf63c2f7d84b7a292f869523d8f131.png

触发模式

水平触发与边缘触发

dc428bba7c6a3707f513dd506805c78f.png

水平触发优点:

水平触发的主要特点是,如果用户在监听epoll事件,当内核有事件的时候,会拷贝给用户态事件,但是如果用户只处理了一次,那么剩下没有处理的会在下一次epoll_wait再次返回该事件。

这样如果用户永远不处理这个事件,就导致每次都会有该事件从内核到用户的拷贝,耗费性能,但是水平触发相对安全,最起码事件不会丢掉,除非用户处理完毕

边缘触发

1bd7d4544db0dcbe3d34ea47d79e7a61.png

边缘触发,相对跟水平触发相反,当内核有事件到达, 只会通知用户一次,至于用户处理还是不处理,以后将不会再通知。这样减少了拷贝过程,增加了性能,但是相对来说,如果用户马虎忘记处理,将会产生事件丢的情况。

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页