下面都是以网络读数据为例

【2阶段网络IO】

第一阶段:等待数据 wait for data

第二阶段:从内核复制数据到用户 copy data from kernel to user

下面是5种网络IO模型

【阻塞blocking IO】

两阶段全程阻塞

recvfrom -> [syscall -> wait -> copy ->] return OK

【非阻塞nonblocking IO】

第一阶段是非阻塞的不断检查是否数据准备好,第二阶段阻塞读取数据

recvfrom -> [syscall -> wait ->] return no data ready

recvfrom -> [syscall -> wait ->] return no data ready

recvfrom -> [syscall -> wait ->] return ready

recvfrom -> [syscall -> copy ->] return OK

【多路复用IO multiplexing】

每个IO都是非阻塞IO,第一阶段通过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据

select/pool -> [syscall -> wait ->] return readable

recvfrom -> [syscall -> copy ->] return OK

【信号驱动signal driven IO】

第一阶段构造一个信号处理器,第二阶段阻塞读取数据

signal handle -> [syscall -> wait ->] return

[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK

【异步asynchronous IO】

两阶段都是非阻塞

aio_read -> [syscall -> wait ->] return

[syscall -> copy ->] aio_read callback

5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。

阻塞IO编程简单,这种方式使用很广泛,但是效率较低。

非阻塞IO效率较高,但是编程较复杂,有开发语言和代码库支持就简单多了。

多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤其明显,支持的程序也越来越多。

异步IO效率很高,但是编程很复杂。node.js中使用的就是异步IO。

【select / epoll 对比】

select不足的地方:

1 每次select都要把全部IO句柄复制到内核

2 内核每次都要遍历全部IO句柄,以判断是否数据准备好

3 select模式最大IO句柄数是1024,太多了性能下降明显

epoll的特点

1 每次新建IO句柄(epoll_create)才复制并注册(epoll_ctl)到内核

2 内核根据IO事件,把准备好的IO句柄放到就绪队列

3 应用只要轮询(epoll_wait)就绪队列,然后去读取数据

只需要轮询就绪队列(数量少),不存在select的轮询,也没有内核的轮询,不需要多次复制所有的IO句柄。因此,可以同时支持的IO句柄数轻松过百万。

网络编程,一定要非常了解网络IO模型,对系统设计和架构选型才能有更好的选择和把握。

在实战课程 《PHP秒杀系统 高并发高性能的极致挑战》中,也是针对这类高并发的业务场景做了特定的性能优化以及分布式方案,大家可以参考学习。

作者:一凡Sir
链接:https://www.imooc.com/article/37093
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作

五种网络IO模型以及多路复用IO中select/epoll对比的更多相关文章

  1. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

  2. 五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

    五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O 五种I/O 模式:[1]        阻塞 I/O          ...

  3. Linux 网络编程的5种IO模型:异步IO模型

    Linux 网络编程的5种IO模型:异步IO模型 资料已经整理好,但是还有未竟之业:复习多路复用epoll 阅读例程, 异步IO 函数实现 背景 上一讲< Linux 网络编程的5种IO模型:信 ...

  4. 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  5. 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    此文章为转载,如有侵权,请联系本人.转载出处,http://blog.chinaunix.net/uid-28458801-id-4464639.html 同步(synchronous) IO和异步( ...

  6. I/O模型系列之二:Unix的五种网络I/O模型

    1. Unix的五种I/O模型 从上往下:阻塞程度(高-----低)I/O效率  (低-----高) 阻塞I/O(Blocking I/O):传统的IO模型 非阻塞I/O(Non-Blocking I ...

  7. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  8. {python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块

    python之IO多路复用 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 ...

  9. (IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    参考博客: https://www.cnblogs.com/xiao987334176/p/9056511.html 内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yi ...

随机推荐

  1. ansible笔记(15):循环(二)with_items/with_list/with_together/with_flattened

    嵌套的列表(序列中的序列),示例如下: --- - hosts: 192.168.10.2 remote_user: root gather_facts: no tasks: - debug: msg ...

  2. 用MyEclipse远程debug

    第一步 编辑 tomcat下的文件startup.sh文件,我的路径是 /root/apache-tomcat-6.0.24/bin/startup.sh 命令:vim startup.sh将decl ...

  3. 未安装Oracle数据库,使用PL\SQL Developer连接远程数据库解决方案

    使用PL/SQL远程连接Oracle服务器 背景:本地未安装oracle数据库服务器,希望远程连接Oracle服务器 1.下载oracle数据库客户端 下载64位windows的instantclie ...

  4. word中去除所有table键

    1.打开word---文件---选项---显示,不勾选制表符 2.选择需要的文本,按[CTRL+H]查找替换, 3.将鼠标定位至“查找内容”,点击“特殊格式-制表符”,然后出现^t,在“替换为”中输入 ...

  5. 《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(3)-- 命令

    3 命令 Fabrics命令用于创建队列和初始化controller.Fabrics命令的Opcode字段填写0x7F.无论controller是否处于使能状态(CC.EN)Fabrics命令都会被处 ...

  6. CrystalDecisions.Windows.Forms文件

    1.CrystalDecisions.Windows.Forms 相关dll文件 CrystalDecisions.Crystalreports.Engine.dllCrystalDecisions. ...

  7. 移动端安卓IOS对接H5项目遇到的坑

    最近做一个H5项目 退出的时候需要调用原生的弹框退出, 之前以为很简单,直接ajax调用后端退出接口即可.后来发现数据拿不到,因为状态用的是cookie存储, 后来想到ajax 传参数请求,后来还是拿 ...

  8. [luogu3950] 部落冲突 - Link Cut Tree

    有了LCT这不就是思博题了吗 #include <bits/stdc++.h> using namespace std; const int N = 1000000; int n,m,t1 ...

  9. Python :元组,不可修改的序列

  10. HDU1074 Doing Homework(状压dp)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:给定有n门课的作业,每门课交作业有截止时间,和完成作业所花费的时间,如果超过规定时间完成,每超 ...