从epoll引发的了解

背景

每次看Redis多路复用模型,必然就会引出调用内核的epoll方法,对于操作系统的知识早已没了逻辑,梳理一下,仅当记录回顾。

起源

epoll是和内核打交道,我们对于熟悉的IO (Input/Output), 常见的分为了磁盘IO和网络IO, epoll我们主要分析的是磁盘的IO,以及由此引出来的IO模型发展

常见的磁盘IO模型有五种,阻塞IO模型,非阻塞IO模型 ,IO多路复用,信号量IO,异步IO,这里面的名词很多,我们逐一解释下。

阻塞和非阻塞

阻塞和非阻塞是相对于调用者这个角度来看的,调用者读取/写入数据,阻塞方式是一直在占用,直到所有事情都完成,非阻塞是发送完命令后,直接返回一个状态码,不会在一直占用

同步和异步

相对于调用者(应用程序)和被调用(内核) 者来讲的,用户进程触发后,同步是等待/轮询,异步就是等待内核通知,再去处理

阻塞IO
非阻塞IO
IO多路复用
信号量IO
这四种都是同步模型,只有异步IO是异步模式

一个通俗的例子

活动:演唱会
角色一:满满
角色二:举办方-》售票员
角色三:黄牛
角色四:送票快递员

同步阻塞IO:
满满从家到售票点买票,售票员告诉满满,票明天才能卖。满满直接在售票点等到明天买票,然后回家。

非阻塞IO:
满满从家到演唱会现场向售票员买票,但票还未出来,然后满满就走了,去干别的事情,过了几个小时再来询问票是否出来,还没出来继续干别的事情。重复以上操作,直到票可以买。

IO复用: JAVA->selector / linux->select,poll,epoll
满满想买演唱会的票,打电话给黄牛(select)帮留一张票,票出来后,小明是需要花费时间去售票点买票(阻塞)。

信号IO:
满满想买演唱会门票,给举办方打电话,帮我留意票,可以售票了给我打个电话(打完就返回结果,等待kernel信号通知),我自己来买票。票出来后,满满亲自去售票点买票

异步IO:
满满要看演唱会,给举办方打电话,可以售票了让送票快递员帮我把票送家里,满满就不用自己去专门买票了

零拷贝

select poll epoll 发展及原理

参考:
https://mp.weixin.qq.com/s/yA-FgBSDDq7c93wz4DFLkg
https://zhuanlan.zhihu.com/p/127170201
https://www.jianshu.com/p/a2df1d402b4d
https://www.cnblogs.com/jjzd/p/6540205.html
https://www.cnblogs.com/sunsky303/p/8962628.html
C10问题: http://www.kegel.com/c10k.html
epoll解释: https://man7.org/linux/man-pages/man7/epoll.7.html
https://www.cnblogs.com/findumars/p/6361627.html
https://notes.shichao.io/unp/ch6/#introduction

猜你喜欢

转载自blog.csdn.net/hugenshen/article/details/114643167