io多路复用 select poll epoll

unix下的五中I/0模型:

阻塞式I/O

非阻塞式I/O

I/O多路复用

信号驱动式I/O

异步I/O(POSIX的aio_系列函数)

                                                阻塞式I/O图

理解:进程阻塞于recvfrom的调用-->系统调用-->在内核中午数据报准备好(等待数据)-->数据报准备好以后复制数据报(等待:从内核空间复制到用户空间)--->复制完成-->返回成功指示。

举个例子:

                                                    非阻塞式I/O图

系统调用后,无数据准备好也会立马返回(这里并不代表I/O操作完成,如果我们下一行的代码依赖于之前的非阻塞I/O操作完成的结果,这时候可能就需要while循环,while循环是非常消耗cpu的,[捂脸],这里还不如不使用非阻塞I/O,因为既需要等待上面的结果,还消耗CPU,但是如果我们下一行代码不依赖于之前的结果,我们这里可以做一些计算任务,或者继续发起I/O操作,我们是可以使用非阻塞IO的。

举个例子:

这里可以通过while循环来一直问connect是否连接成功,直到连接成功后执行client.send方法

关于copy data from kernel to user:

比如说我们现在有8个G的内存,操作系统为了安全起见,操作系统在使用内存,我们自己写的应用程序也在使用内存,操作系统将1个G低地址的内存保护起来,供自己使用,当我们发送recvfrom的时候这是需要操作系统底层支持才行的,当我们调用recv的时候其实操作系统在做事,操作系统请求网络-->拿到数据之后也是在低地址的内存中,我们用户使用的时候需要将低地址的内存里的数据copy到用户内存地址来。

                                                           I/O复用

这里我们通过调用select来判断哪些socket或者文件句柄已经操作好了,比如上面的connect我们可以用select判断是否已经连接好,这种select和不同的循环请求它的状态(while)区别在于select可以监听多个socket状态。它给我们带来的好处在于,我们有一百个socket链接,只要有一个socket发生变化我们就可以处理它,但是I/O多路复用依然没有省去将数据从内核拷贝到用户空间的时间.

                                            信号驱动式I/O

信号渠道I/O应用非常少,大家有兴趣可以自己研究一下


                                        异步I/O(POSIX的aio_系列函数)

异步I/O对于多路复用性能没有很大提升,它们主要的区别在于:真正意义上的异步IO在数据从内核拷贝到用户空间才会发起信号,所以现在使用I/O多路复用比较多,比如torando框架 nginx

select 目前几乎可以应用在所有的平台上,但是它的缺点在于单个检查能够监视的文件描述符的数量存在最大限制,在linux上一般为1024。select在监听文件描述符的时候是要遍历所有的fds的,所以select的效率比较低。

poll 使用pollfd的指针实现,pollfd没有最大数量限制,但是还是需要轮询pollfd来获取就绪的描述符。所以效率提升不高。

epoll是select和poll的增强版本,epoll更加灵活,没有描述符的限制,epoll使用一个描述符管理多个描述符,将这些描述符事件存放到了一个事件表中。

我们通常使用selectors,from selectorsimport DefaultSelector, 其实还是使用select,但是selectors封装的更加好用,selectors到底是选用select 还是epoll,它会根据平台字段选用,在windows上使用select在linux上使用epoll。

下次整理下torando框架原理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容