I/O流

  1. 概念

    (1)c++中将数据的输入输出称之为流(stream),在c++中,流被定义为类,成为流类(stream class),其定义的对象为流对象。

    (2)文件,套接字(socket),管道(pipe)等能够进行I/O操作的对象,可以被看做为流

  2. 工作机制

    (1)大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,读取数据时,都会将数据先拷贝到操作系统内核的缓冲区中,然后将操作系统内核缓冲区的数据拷贝到应用程序的地址空间,写的过程则相反。

    (2)缓存I/O使用操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备,通过将数据写入缓冲区后,再一次性处理,减少了读盘的次数,从而提高了性能

I/O模型

  1. 同步与异步:关注的是消息通信机制

    同步(synchronous):调用者会一直“等待”被调用者返回消息,才能继续执行,在此期间,调用者不能做其它事

    异步(asynchronous):被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态,在此期间,调用者可以边“等待”,边做其它事

  2. 阻塞和非阻塞:关注调用者的状态

    阻塞(blocking):调用者一直“等待”所处的状态

    非阻塞(blocking):调用者能够边“等待”,边做其它事的状态

  3. 同步I/O

    (1)阻塞式I/O:程序发出I/O请求,如果内核缓冲区为空,此时进行读操作,那么该程序就会阻塞

    (2)非阻塞式I/O:程序发出I/O请求,如果内核缓冲区为空,此时进行读操作,此时就会立刻返回一个错误

    (3)I/O复用

    ​ a. 这是一种机制,程序注册一组文件描述符给操作系统,监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。表示“我要监视这些fd是否有I/O事件发生,有了就告诉程序处理”。

    ​ b. 当多个I/O流共用一个等待机制时,该模型会阻塞进程,但是进程时阻塞在这种机制的系统调用上,不是阻塞在真正的I/O操作上

    ​ c. I/O多路复用需要和非阻塞I/O一起使用,非阻塞I/O和I/O多路复用式相对独立的。非阻塞I/O仅仅指流对象立刻返回,不会被阻塞;而I/O多路复用只是操作系统提供的一种便利的通知机制。

    (4)信号驱动式I/O

    ​ a. 用户进程可以通过系统调用注册一个信号处理程序,然后主程序可以继续向下执行,当有I/O操作准备就绪时,由内核通知触发一个SIGIO信号处理程序执行,然后将用户进程所需要的数据从内核空间拷贝到用户空间

    ​ b. 此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处理函数的通知。

  4. 异步I/O

    ​ a. 程序进程向内核发送I/O调用后,不用等待内核响应,可以继续接受其他请求,内核调用的I/O如果不能立即返回,内核会继续处理其他事物,直到I/O完成后将结果通知给内核

    ​ b. 信号驱动式IO是由内核通知我们何时启动一个IO操作,而异步IO是由内核通知我们IO操作何时完成。

I/O复用模型

  1. select

    select的大致工作流程:

    (1)采用数组组织文件描述符

    (2)通过遍历数组的方式,监视文件描述符的状态(可读,可写,异常)

    (3)如果没有可读/可写的文件描述符,进程会阻塞等待一段事件,超时就返回

    (4)当有一个可读/可写的文件描述符存在时,进程会从阻塞状态醒来

    (5)进行无差别轮询,找出能够操作的I/O流,若处理后,会移除对应的文件描述符

    select的缺点:

    (1)每次调用select,都需要把文件描述符集合从用户空间贝到内核空间,这个开销在I/O流很多时会很大

    (2)同时每次调用select都需要在内核遍历传递进来的所文件描述符数组,这个开销在I/O流很多时也很大

    (3)select支持的文件描述符数量太小了,默认是1024

  2. poll

    (1)采用链表组织文件描述符

    (2)原理和select一致

    (3)只是解决了支持的文件描述符受限的缺点

    (4)select和poll都是水平触发:找到可操作的I/O流并通知进程,但进程本次没有处理,文件描述符没有被移除,下次轮询时依旧会通知

  3. epoll

    工作原理:

    (1)红黑树和就绪链表,红黑树用于管理所有的文件描述符,就绪链表用于保存有事件发生的文件描述符。

    (2)接收到I/O请求,会在红黑树查找是否存在,不存在就添加到红黑树中,存在则将对应的文件描述符放入就绪链表中

    (3)如果就绪链表为空,进程则阻塞否则遍历就绪链表,并通知应用进程处理文件描述符对应的I/O

    工作模式:

    (1)LT模式(水平触发):检测到可处理的文件描述符时,通知应用程序,应用程序可以不立即处理该事件。后续会再次通知

    (2)ET模式(边缘触发):检测到可处理的文件描述符时,通知应用程序,应用程序必须立即处理该事件。如果本次不处理,则后续不再通知

参考资料

IO五种模型和select与epoll工作原理(引入nginx) - osc_1ont5xz2的个人空间 - OSCHINA - 中文开源技术交流社区

IO模型:同步、异步、阻塞、非阻塞 | 神奕的博客 (songlee24.github.io)

(3) io复用与epoll模型详解_个人文章 - SegmentFault 思否

(3) Linux IO模式及 select、poll、epoll详解_人云思云 - SegmentFault 思否

Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) - 黄树超 - 博客园 (cnblogs.com)

(3) 网络编程——select模型(总结)_个人文章 - SegmentFault 思否

网络编程之IO模型与Epoll - 简书 (jianshu.com)

彻底搞懂epoll高效运行的原理 - 简书 (jianshu.com)

如果这篇文章说不清epoll的本质,那就过来掐死我吧! (3) - 知乎 (zhihu.com)

浅析I/O模型-select、poll、epoll的更多相关文章

  1. Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】

    一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...

  2. 多路IO复用模型--select, poll, epoll

    select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用se ...

  3. Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)

    Linux下测试代码: http://www.linuxhowtos.org/C_C++/socket.htm TCP模型 //TCPClient.c #include<string.h> ...

  4. 各I/O模型 对应Web服务应用模型(select,poll,epoll,kevent,"/dev/poll")

    一.利用select多路复用I/O的Web服务应用模型  /* 可读.可写.异常三种文件描述符集的申明和初始化.*/ fd_set readfds, writefds, exceptionfds; F ...

  5. 浅谈网络I/O多路复用模型 select & poll & epoll

    http://blog.csdn.net/nk_test/article/details/50662946

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

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

  7. 哪5种IO模型?什么是select/poll/epoll?同步异步阻塞非阻塞有啥区别?全在这讲明白了!

    系统中有哪5种IO模型?什么是 select/poll/epoll?同步异步阻塞非阻塞有啥区别? 本文地址http://yangjianyong.cn/?p=84转载无需经过作者本人授权 先解开第一个 ...

  8. IO模型与select,poll,epoll

    五种:阻塞,非阻塞,IO复印,信号驱动,异步. select,poll,epoll select: 典型用32个32位的整数表示1024个描述符,并发的局限. poll:功能同上,但数据结构不一样(链 ...

  9. Linux I/O复用中select poll epoll模型的介绍及其优缺点的比較

    关于I/O多路复用: I/O多路复用(又被称为"事件驱动"),首先要理解的是.操作系统为你提供了一个功能.当你的某个socket可读或者可写的时候.它能够给你一个通知.这样当配合非 ...

随机推荐

  1. (转载)Tomcat 7集群浅析

    本文转载自:http://blog.csdn.net/wangyangzhizhou. 如有侵权,请联系处理!   简介 每个节点都要维护一份集群节点信息列表,集群组通知的默认实现是在使用 UDP 数 ...

  2. 【题解】【POI2000】病毒

    题目链接 这题让我们构造一个无限长的,不包括给定字符串的01串. 把给定字符串放到\(AC\)自动机上,在结尾处打上标记. 发现,如果我们要构造一个无限长的串,必然要有一个环. 那么这个环上就一定不能 ...

  3. [POI2010]PIL-Pilots 单调队列

    [POI2010]PIL-Pilots 题意: 给定一个序列和一个数值k,求一段连续最大区间是的最大值与最小值之差小于k: 思路: 因为要维护最大值和最小值并且连续,使用两个单调队列分别同时维护最大最 ...

  4. maven下载依赖包下载失败

    在家办公,遇到项目的maven包下载不了,刚开始以为是vpn的问题,折腾半天反复确认之后没有发现什么问题. 同时试过阿里巴巴的maven仓库,删除过以来,重新导过包发现都不行. 后来在idea的设置里 ...

  5. 踩坑 Pycharm 2020.1.1 安装/ JetBrains破解/ anacode配置

    引言 网上的办法试了很多,通常不能解决问题,还会引发一些负效应,选取了一个试了两天终于成功的方案记录一下备用. Pycharm安装 https://www.jetbrains.com/pycharm/ ...

  6. 一键同步,紧跟潮流——CODING 现已支持导入 GitHub 仓库

    为方便用户从 GitHub 快速迁移到 CODING 并开始使用,CODING 现已支持导入 GitHub 仓库.免去繁琐步骤,只需简单两步操作即可完成导入,让仓库静默同步,无缝衔接,平滑过渡:同时还 ...

  7. 多测师讲解自动化selenium___定位元素002___高级讲师肖sir

    高级自动化测试python+selenium教程手册 --高级讲师肖sir(Harm) 第 2 章8种定位方法 总结: selenium 的 webdriver 提供了八种基本的元素定位方法,前面六种 ...

  8. 还不会ida*算法?看完这篇或许能理解点。

    IDA* 算法分析 IDA* 本质上就是带有估价函数和迭代加深优化的dfs与,A * 相似A *的本质便是带 有估价函数的bfs,估价函数是什么呢?估价函数顾名思义,就是估计由目前状态达 到目标状态的 ...

  9. 利用github创建个人网站

    先建个仓库,仓库名为: 用户名.github.io 进入仓库,删除README.md文件 新建个文件,文件名为: index.html,内容根据自己要求编写 打开网站,地址:https://用户名.g ...

  10. Java9第四篇-Reactive Stream API响应式编程

    我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...