在网上看到一篇对这四个概念比较清晰的分析的文章:http://blog.csdn.net/historyasamirror/article/details/5778378。结合自己一直在学习Java NIO方面的知识,对着四个概念做一些总结。

数据在操作系统中的简单流动过程:

首先进程地址空间分为用户空间和内核空间。用户空间调用IO方法,如read(),它会陷入内核空间,有内核负责将数据从磁盘或者其它IO设备上读入内核,再由内核将数据拷贝到用户空间。

应用程序所在的用户进程(或线程)是否被阻塞,这是区分同步和异步的关键。所以,阻塞IO、非阻塞IO和多路复用IO都属于同步IO。

下面一一进行说明:

阻塞IO:应用程序在用户空间调用read(),一直等到内核准备好数据(此过程有内核线程完成,所以经过了上下文切换),将数据拷贝到用户空间的缓冲区中。这个时候用户线程是阻塞挂起的,它不会消耗CUP,但是它阻塞了改用户线程改read()操作之后的所有动作。

非阻塞IO:应用程序调用read(),read通过系统调用后直接返回,根据返回结果判断是否需要继续调用read(),这其实就是一个不断轮询(轮询内核数据是否已经准备好)的过程。直到read()返回一个满意的结果。在这个返回满意结果的这一次调用过程中,数据从内核空间拷贝到用户空间的缓冲区,这个过程是阻塞的。

多路复用IO:通常使用selector监视多个网络端口,本身select是阻塞的,阻塞用户进行直到内核检查到有网络端口已经准备好,然后对每一个准备好的端口进行IO操作,这个IO操作过程也是阻塞的。

异步IO:应用程序IO操作直接返回,内核获取数据后,将数据从内核空间拷贝到用户空间,然后通知应用程序。应用程序收到信号后处理相关数据,处理方式可以采用回调方法的办法。

转载于:https://www.cnblogs.com/lanhzbupt/p/3580495.html

同步、异步、阻塞、非阻塞IO相关推荐

  1. 聊聊对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)

    一.关于I/O模型的问题 最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题. 1. 为什么redis能以单工作线 ...

  2. 异步就是异步,根本就没有 异步非阻塞IO这个说法。阻塞 非阻塞,同步I/O 异步I/O 的区别

    先给大家安利一下这个 https://www.ibm.com/developerworks/cn/linux/l-async/ 里面关于 异步非阻塞IO 是错的. 异步就是异步,别扯 异步阻塞 异步非 ...

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

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

  4. 异步通知是什么意思_一次相亲经历,我彻底搞懂了阻塞非阻塞、同步异步

    看到标题,可能你会想,相亲跟阻塞/非阻塞,同步/异步有啥关系,这个逗b不知道在想什么东西.不要急,且听我慢慢道来 年纪大了,一回家七大姑八大姨就各种催婚,都说要给我介绍女朋友.这不,刚刚门口,我的大姨 ...

  5. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...

  6. 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

  7. 异步同步、阻塞非阻塞、异步回调、线程队列和协程

    今天学习了异步同步.阻塞非阻塞.异步回调.线程队列和协程 一.异步同步和阻塞非阻塞 线程的三种状态: 1.就绪 2.运行 3.阻塞 阻塞:遇到了IO操作  代码卡住  无法执行下一行  CPU会切换到 ...

  8. NIO详解(二): BIO 浅谈 同步 异步与阻塞 非阻塞

    在我们了解Java NIO/BIO的网络通信之前,我们先了解一下常用的阻塞/非阻塞模型以及同步/异步的概念 一.阻塞和非阻塞 从简单的开始,我们以经典的读取文件的模型举例.(对操作系统而言,所有的输入 ...

  9. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章

    来源:编程新说 网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTT ...

  10. python阻塞和非阻塞_Python基础必备知识:同步异步阻塞非阻塞

    一.状态介绍 在了解其他概念之前,我们首先要了解进程的几个状态.在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞. 就绪(Ready)状态:当进程已分配到除CPU ...

最新文章

  1. H5中的拖拽文件上传-----------------需修改,需测试
  2. irobot擦地机器人故障_懒人必备神器,电动高频擦地,科沃斯地宝T8 AIVI扫地机器人...
  3. POJ3080方法很多(暴力,KMP,后缀数组,DP)
  4. 第二十八讲 解非齐次线性方程组
  5. Attention To, Convert To Capped Collection
  6. Hadoop-Yarn-框架原理及运作机制
  7. nodec mysql_Node.js 连接 MySQL 并进行数据库操作 –node.js 开发指南
  8. JAVA EXCEL API(jxl)简介
  9. mysql 缓存监控_MySql 缓存查询原理与缓存监控 和 索引监控
  10. 作者:陈威,电子科技大学互联网科学中心硕士生。
  11. 怎么用php myadmin连接远程MYSQL数据库
  12. java jdbc_详解Java基础知识——JDBC
  13. 学技术的不能自废武功
  14. go 语言markdown 转 html,Golang中国的markdown转HTML怎么实现
  15. RGL: A Simple yet Effective Relation.. 文章详解
  16. 防止服务器被修改,教您如何防止IE被恶意修改
  17. 通过 iptables 禁止 ping
  18. 电脑桌面计算机文件打不开怎么办,电脑开机桌面文件都点不开的解决方法
  19. zkSnark教程:从方程到验证
  20. appemit使用mpvPlayer在谷歌chrome浏览器播放RTSP

热门文章

  1. jmeter之线程组间变量的传递二
  2. 自制微信小程序通讯JS
  3. 数独动态解题演示小网站 - 基于Vue/pixi.js/Flask
  4. 以太坊POA共识机制Clique源码分析
  5. CRLF line terminators导致shell脚本报错:command not found --转载
  6. ASP.NET上传下载文件
  7. 散列表(哈希表)(散列函数构造、处理冲突、查找)
  8. GoogLeNetV1,V2,V3
  9. matlab2016一条命令设置坐标轴标签旋转角度、字体大小和字体!
  10. Reactor模型-单线程版