本文带你鸟瞰I/O模型全貌,希望可以让你对I/O模型有一个直观的认识

什么是I/O?I/O的过程?同步阻塞 I/O同步非阻塞 I/OI/O多路复用异步I/O

什么是I/O?

  I/O就是计算机内存和外部设备之间拷贝数据的过程。
  那么I/O模型主要解决的问题是什么呢?程序通过CPU,请求外部设备上的数据。而数据拷贝到内存里需要一定的时间,在这个时间里,程序是主动让出CPU时间?还是让CPU不断的去查数据是否是到了?
  I/O模型就是用来解决这个决策问题。

I/O的过程?

  首先我们要明白。I/O通讯涉及到两个非常重要的对象。
  1.程序执行时的用户线程
  2.操作系统内核
  操作系统将进程的地址空间分为用户空间内核空间,用户线程是没有办法从内核空间直接获取数据,需要将数据从内核空间拷贝到用户空间,再获取用户空间的数据。
  所以任何I/O模型,网路数据的读取都可以分为2部分。
  1.用户线程等待内核将网卡中的数据,拷贝到内核空间
  2.内核将数据从内核空间拷贝到用户空间。
  各个I/O模型的区别就是实现这两个步骤的方法不同

同步阻塞 I/O

  用户线程发起read请求后就阻塞了,让出CPU,内核会等待网卡数据的到来,然后吧数据拷贝到内核空间,从内核空间拷贝到用户空间,再唤醒用户线程。

同步非阻塞 I/O

  用户线程不断发起read请求,数据没到内核空间时,每次都返回失败,直到数据到了内核空间,此时再调用read会阻塞,等待内核将内核空间的数据拷贝到用户空间,再唤醒用户线程。

I/O多路复用

  这里把用户线程的读取操作分为了2步,线程先发送select调用,问内核是否将数据准备好了,等数据准备好了,用户线程再发起read调用,在等待数据从内核空间拷贝到用户空间这段时间里,线程仍是阻塞的,一次select请求可以向内核查询多个数据通道(channel)的状态,所以才叫多路复用

异步I/O

  用户发起的read调用,会注册一个回调函数,read立即返回,等到内核将数据准备好后,调用回调函数完成处理,整个过程中,用户线程一直没有被阻塞

  最后,期待您的订阅和点赞,专栏每周都会更新,希望可以和您一起进步,同时也期待您的批评与指正!

图解I/O模型的更多相关文章

  1. 图解 Java 内存模型

    图解 Java 内存模型 (图片来自于:http://www.cnblogs.com/zhangs1986/p/7903722.html)

  2. 图解机器学习 | LightGBM模型详解

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/34 本文地址:http://www.showmeai.tech/article-det ...

  3. 图解jvm--(四)内存模型

    内存模型 java 内存模型 很多人将[java 内存结构]与[java 内存模型]傻傻分不清,[java 内存模型]是 Java Memory Model(JMM)的意思. 简单的说,JMM 定义了 ...

  4. BERT模型图解

    转载于 腾讯Bugly 发表于 腾讯Bugly的专栏 原文链接:https://cloud.tencent.com/developer/article/1389555 本文首先介绍BERT模型要做什么 ...

  5. 【转】JVM内存模型

    http://longdick.iteye.com/blog/473866 图解JVM内存模型 博客分类: JVM JVM活动SUN  /** *  转载请注明作者longdick    http:/ ...

  6. 模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理、分类及应用

    模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理.分类及应用 lqfarmer 深度学习研究员.欢迎扫描头像二维码,获取更多精彩内容. 946 人赞同了该文章 Atte ...

  7. 用实例带你深入理解Java内存模型

    摘要:本文的目的来理解 J V M 与我们的内存两者之间是如何协调工作的. 本文分享自华为云社区<一文带你图解Java内存模型>,作者: 龙哥手记 . 我们今天要特别重点讲的,也就是我们本 ...

  8. The Linux device model

    /sys和 /dev的疑问 1./dev 下放的是设备文件,是由应用层mknod创建的文件.假设底层驱动对mknod的设备号有相应的驱动,如open等函数.那么应用层open "/dev/* ...

  9. NMT 机器翻译

    本文近期学习NMT相关知识,学习大佬资料,汇总便于后期复习用,有问题,欢迎斧正. 目录 RNN Seq2Seq Attention Seq2Seq + Attention Transformer Tr ...

随机推荐

  1. 红杉资本的Dropbox上市,国内哪些产品会跟着受益?

    ​ ​每一个估值达到10亿美元以上的互联网.科技独角兽企业,都将上市当做"终极荣光".但事实上,上市只是这些独角兽企业开启全新时代的开端而已.很多气势汹汹且看似前景一片光明的独角兽 ...

  2. nginx安装与fastdfs配置--阿里云

    上一篇文章:fastDFS 一二事 - 简易服务器搭建之--阿里云 做了fastDFS的服务安装和配置,接下来我们来看nginx的安装 第一步:安装nginx需要安装的一些环境: 1.例如: yum ...

  3. [BZOJ 1412][ZJOI 2009] 狼和羊的故事

    题目大意 有一个 (n times m) 的网格,每一个格子上是羊.狼.空地中的一种,羊和狼可以走上空地.现要在格子边上建立围栏,求把狼羊分离的最少围栏数. (1 leqslant n, ; m le ...

  4. 百度地图API:使用百度定位

    准备工作: 1.申请百度地图API 2.下载百度地图的SDK 3.将SDK包中的BaiduLBS_Android.jar文件放到,项目里的app/libs里面 4.在src/main目录下创建一个名为 ...

  5. 先治再扶,重灾区后的P2P你还敢投吗?

    ​ 互联网强大的包容性和创新性,给予很多新生事物成长的空间.而其全面普及与快速传播的特性,也让任何事物都像被放在放大镜乃至显微镜下,几乎无形遁形.这样一来,新生事物很容易被"神化" ...

  6. vue-router03 vue-cli

    1.钩子: next讲解: next()进行路由跳转 next(false)取消路由跳转 beforeRouteEnter (to, from, next) { next(vm => { // ...

  7. [转帖]RSYNC 的核心算法

    RSYNC 的核心算法 https://coolshell.cn/articles/7425.html rsync是unix/linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并 ...

  8. ubuntu16.04安装库、插件报错:

    安装一些插件.库,遇到报错 Could not fetch URL https://pypi.org/simple/pytest-pycodestyle/: There was a problem c ...

  9. 进阶之路 | 奇妙的Thread之旅

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 需要已经具备的知识: Thread的基本概念及使用 AsyncTask的基本概念及使用 学习清单: 线程概述 ...

  10. 「从零单排HBase 05」核心特性region split

    HBase拥有出色的扩展性,其中最依赖的就是region的自动split机制. 1.split触发时机与策略 前面我们已经知道了,数据写入过程中,需要先写memstore,然后memstore满了以后 ...