2019独角兽企业重金招聘Python工程师标准>>>

1、概念

《Unix网络编程:卷1》中介绍了5种I/O模型,JAVA作为运行在宿主机上的程序,底层也遵循这些规则。

  • 阻塞式IO(Blocking IO):即传统的IO模型;
  • 非阻塞式IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK,注意这里所说的NIO并非Java的NIO(New IO)库;
  • IO多路复用(IO Multiplexing):即经典的Reactor设计模式,Java中的Selector和Linux中的epoll都是这种模型;
  • 信号驱动式IO:
  • 异步IO:即经典的Proactor设计模式,也称为异步非阻塞IO;

按POSIX标准来分,IO分为同步和异步,上面的前4种都属于同步IO。

一个IO分为两个阶段:

  1. 等待数据:数据可能来自其他应用程序或者网络,如果没有数据,操作系统就一直等待,应用程序就跟着等待;
  2. 拷贝数据:将就绪的数据拷贝到应用程序工作区;

在Unix系统中,操作系统的IO操作是一个系统调用recvfrom(),即一个系统调用recvfrom包含两步,等待数据就绪和拷贝数据。

同步和异步:描述的是用户线程与内核的交互方式。同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行。而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

阻塞和非阻塞:描述的是用户线程调用内核IO操作的方式。阻塞是指IO操作需要彻底完成后才返回到用户空间。而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

2、IO模型

2.1、blocking I/O

application调用 recvfrom()转入kernel,直到最后copy complete后,recvfrom()才返回,此过程一直是阻塞的。

2.2、nonblocking I/O

不断轮询直到内核缓冲区有数据,由于轮询会消耗大量CPU时间,这种模式并不常用。

阻塞IO与非阻塞IO的关键区别在于,系统调用recvfrom是否立即返回。

 2.3、I/O multiplexing (select/poll/epoll) 

最常见的I/O复用模型,与blocking I/O相比,select会有两次系统调用,但是select能处理多个套接字,服务器只需要一两个线程就可以进行多客户端通信。

2.4、signal driven I/O (SIGIO) 

只有UNIX系统支持,与I/O multiplexing相比,它的优势是,免去了select的阻塞与轮询,当有活跃套接字时,由注册的handler处理。

2.5、asynchronous I/O

很少有*nix系统支持,windows的IOCP则是此模型,完全异步的I/O复用机制,纵观上面其它四种模型,至少都会在由kernel copy data to appliction时阻塞。而该模型是当copy完成后才通知application,可见是纯异步的。好像只有windows的完成端口是这个模型,效率也很出色。

2.6、五种模型的比较 

可以看出,越往后,阻塞越少,理论上效率也是最优。

3、select、poll、epoll的区别

select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。selectpollepoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

select缺点:

a、每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;

b、同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大;

c、select支持的文件描述符数量太小了,默认是1024;

poll

poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多。 

epoll

select和poll的增强版本

a、 每次注册新的事件到epoll句柄中时都会拷贝进内核,保证了每个fd在整个过程中只会拷贝一次;

b、 为每个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回调函数会把就绪的fd加入一个就绪链表,只需在就绪链表中查看有没有就绪的fd;

c、 epoll没有这个限制,它所支持的FD上限是最大可以打开文件的数目;

Ref:

https://www.cnblogs.com/fysola/p/6146063.html

https://www.cnblogs.com/linganxiong/p/5583415.html

https://www.cnblogs.com/Anker/p/3265058.html

转载于:https://my.oschina.net/u/3787772/blog/1630932

网络通信模型(IO模型)相关推荐

  1. Java网络编程------IO模型的同步/异步/阻塞/非阻塞(1)

    IO模型的同步/异步/阻塞/非阻塞 一.同步/异步/阻塞/非阻塞 1.同步和异步 2.阻塞和非阻塞 3.同步.异步和阻塞.非阻塞组合 二.IO 1.I/O 2.阻塞IO和非阻塞IO 3.同步IO和同步 ...

  2. Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

    目录 IO模型 阻塞与非阻塞 同步与异步 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用 ...

  3. 【操作系统】IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析

    [操作系统]IO模型篇之从BIO.NIO.AIO到内核select.epoll剖析! 参考资料: Java网络编程-IO模型篇 [Redis]网络模型:Redis的IO多路复用 [操作系统]全面解析I ...

  4. 后端开发【一大波有用知识】网络通信模型和网络IO管理

    简单的C/S通信模型(accept阻塞的话,就只能一个客户端接进来) socket()函数 //函数原型.返回:若是成功则为非负数,如出错则为 -1 int socket(int domin, int ...

  5. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

  6. 大白话详解5种网络IO模型

    1 前言 我们都知道,为了实现高性能的通信服务器,BIO在高并发的情况下会出现性能急剧下降的问题,甚至会由于创建过多线程而导致系统OOM.因此在Java业界,BIO的性能问题一直被开发者所诟病,所幸的 ...

  7. 网络IO模型的深入浅出

    标题索引 追溯IO原因 网络数据流 网络IO模型 IO模型举例 追溯IO原因     从事项目多年来,有个问题一直困扰着我,但因种种原因一直没有翻阅资料去释怀,随着项目经历的增加.年龄的增长和责任的使 ...

  8. mysql io模型_5种网络IO模型

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

  9. Netty详解(二)Linux 网络IO模型

    1. Linux I/O基础知识 针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00 ...

最新文章

  1. Python 中的进程、线程、协程、同步、异步、回调(一)
  2. 无图形界面下控制台操作Virtualbox
  3. 出错页面webpar的t删除
  4. 利用python分析了下乘风破浪的姐姐
  5. python基本算法语句_Python中基本且又常用的算法
  6. mysql插入时间区间_mybatis插入数据时返回主键以及MySQL根据时间区间查询问题总结...
  7. [css] 如何形成BFC?
  8. 『飞秋』在ASP.NET服务器端过程中使用WebBrowser的注意事项
  9. JAVA jlist 获取选定,java - 拆分并将选定的jList值移动到jTable行(SWING) - 堆栈内存溢出...
  10. consul的安装配置 一centos7环境
  11. python列表求和显示unsupport_本地使用pip命令安装requests库,提示unknow or unsupported command install解决方法...
  12. Google Flutter 一统移动、Web、桌面、嵌入式江湖!
  13. 视觉在无人驾驶中的应用及分类_紫外光在机器视觉中的应用
  14. 使用javascript的“委托”实现attachEvent
  15. 台式计算机开机黑屏,台式电脑开机黑屏只有一个点怎么处理?
  16. deepin安装NVIDIA显卡驱动
  17. 如何使用Java计算闰年?
  18. 麻雀虽小五脏俱全,中小企业的知识管理须重视
  19. Linux里面输入错误无法使用Backspace键
  20. 王兴:为什么中国的To B企业都活得这么惨?(演讲全文)

热门文章

  1. 从程序员的角度深入理解MySQL
  2. 《Windows Server 2012 Hyper-V虚拟化管理实践》一3.3 远程管理Hyper-V主机
  3. bLock 回调 就是这么简单!
  4. 【RHCE学习笔记】基于安全的NFS认证(kerberos)
  5. win7 设置自动关机
  6. 让Dev-C++运行C++程序的控制台窗口等待查看运行结果
  7. portlet 与 servlet 的关系
  8. lua如何判断是否支持cookie_如何判断家里暖气片是否需要更换
  9. java 字符串拼接优化_JAVA字符串拼接效率
  10. 继承redis spring_实例讲解Springboot以Repository方式整合Redis