一般来说,一个输入操作通常包括两个阶段:
、等待数据准备好;
、从内核向进程复制数据
是否同步的判断依据是: 是否 针对的 整个过程,即2个阶段,是否有阻塞
是否阻塞的判断依据是: 按 程序等待消息通知时的状态角度来说的,,即针对第一阶段来说
例子很形象:
 
 
Linux 认为
1、用系统调用 read 从 socket 里读取 一段数据
2、用系统调用read 从 一个磁盘文件读取一段数据到 内核
分 网路IO 和 磁盘文件 IO。 网络IO 才做 BLOCK。
 
 一个解释是,所谓“Block”是指操作系统可以预见这个Block会发生才会主动Block。
例如当读取TCP连接的数据时,如果发现Socket buffer里没有数据就可以确定定对方还没有发过来,于是Block;
而对于普通磁盘文件的读写,也许磁盘运作期间会抖动,会短暂暂停,但是操作系统无法预见这种情况,只能视作不会Block,照样执行。

1、Unix 5中 IO模型

  • 阻塞式I/O;
  • 非阻塞式I/O;
  • I/O复用(select,poll,epoll...);
  • 信号驱动式I/O(SIGIO);
  • 异步I/O(POSIX的aio_系列函数);

1、阻塞式I/O;

同步阻塞IO模型是最常用的一个模型。 linux中 默认情况下所有的socket都是 blocing,
在这个模型中,用户空间的应用程序执行一个系统调用 recvform, 这会导致应用程序阻塞,睡没也不干,直到数据准备好,等待 kenel准备好 从 网络上姐都到的 数据包 + 等待收到的报文 被 从 kernel 赋值到bug中,recvform 方法才会返回,最后 进程在处理数据。
 
 

2 非阻塞式I/O

非阻塞IO, 对一个非阻塞描述符 循环调用 recvfrom,持续的轮询(polling),以查看某个操作是否就绪。与阻塞IO不一样,非阻塞将大的 整片时间的阻塞 分成 N多的小的阻塞, 所有 进程 不断的有机会 被 CPU 光顾。
非阻塞的 recvfrom 系统调用后,进程并没有被阻塞,内核马上返回给进程,如果数据没有准备好,会返回 error。 进程在返回之后,可以干其他事情,然后在发起recvfrom 系统调用。如此循环的仅从 recvfrom 系统调用,检查内核数据,直到数据准备好,在拷贝数据到进程。拷贝数据整个过程,进程仍然是属于 阻塞的状态。

3.I/O复用

IO multiplexing 就是我们说的 select,poll,epoll。(多路复用,因为它 可以同时监听多个 fd, 减少了为每个需要监听的fd 开启线程的开销)
select 调用是内核级别的,可以等待多个socket,能实现同时多多个 IO端口进行监听, 当其中任何一个socket 的数据准备好了,就能返回进行 可读(写),然后进程在进行 recvform 系统调用,将数据由 内核 拷贝到用户进程,这个过程是阻塞的。
IO复用模型会用到 select,poll,epoll函数,这几个函数也会使进程阻塞,但是和阻塞IO所不同的, 这几个函数可以同时阻塞多个 IO操作,多个写操作的 IP函数 进行检测,直到有数据 可读或可写 时(不是等到socket数据全部到达再处理, 而是有了一部分数据就会调用用户进程来处理),才进行真正地调用 IO操作函数。
IO复用有人把其成为同步非阻塞的,也有称为同步阻塞。其实这个是否阻塞还需要看第一个阶段,第一个阶段有的阻塞,有的不阻塞。主要也是阻塞在select阶段,属于用户主动等待阶段,我们且规范为阻塞状态,所以,把IO多路复用归为同步阻塞模式。
 
 

4.信号驱动式I/O

信号驱动式I/O:首先我们允许Socket进行信号驱动IO,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。
也就是说第一个阶段,完全是非阻塞的,等数据到达会给一个信号通知,第二个阶段recvfrom还是阻塞过程,和之上无差异。
 

5.异步I/O

异步IO不是顺序执行,用户进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。等到socket数据准备好了,内核直接复制数据给进程,然后从内核向进程发送通知。IO两个阶段,进程都是非阻塞的。
 

总结

2、JAVA IO

Unix中的五种I/O模型,除信号驱动I/O外,Java对其它四种I/O模型都有所支持。其中Java最早提供的
blocking I/O即是同步阻塞I/O,
而NIO即是同步非阻塞I/O,
同时通过NIO实现的Reactor模式即是I/O复用模型的实现,
通过AIO实现的Proactor模式即是异步I/O模型的实现。

(一) BIO,NIO, 阻塞,非阻塞,你懂了吗的更多相关文章

  1. JAVA 中BIO,NIO,AIO的理解以及 同步 异步 阻塞 非阻塞

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...

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

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

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

    原文链接:https://www.cnblogs.com/lixinjie/p/10811219.html 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使 ...

  4. 同步/异步/阻塞/非阻塞/BIO/NIO/AIO

    转摘自:https://www.cnblogs.com/lixinjie/p/a-post-about-io-clearly.html 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HT ...

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

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

  6. 同步/异步/阻塞/非阻塞/BIO/NIO/AIO各种情况介绍

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

  7. JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信

    阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NI ...

  8. 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor

    开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...

  9. 4.NIO的非阻塞式网络通信

    /*阻塞 和 非阻塞 是对于 网络通信而言的*/ /*原先IO通信在进行一些读写操作 或者 等待 客户机连接 这种,是阻塞的,必须要等到有数据被处理,当前线程才被释放*/ /*NIO 通信 是将这个阻 ...

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

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

随机推荐

  1. Linux下Jmeter+nmon+nmon analyser实现性能监控及结果分析

    一.概述 前段时间讲述了Jmeter利用插件PerfMon Metrics Collector来监控压测过程中服务器资源的消耗,一个偶然机会,我发现nmon这个 工具挺不错,和Jmeter插件比起来, ...

  2. Java中的过滤器

    什么是过滤器(Filter)? 过滤器就是一个实现了特殊接口的Java类.实现对请求资源的过滤的功能. 过滤器是Servlet技术中最为实用的技术. 过滤器有啥用? 对目标资源进行过滤. 自动登录,解 ...

  3. python基础知识练习2

    1.请写出如下代码的结果: import copy list1 = [1,2,['a','b'],('c','d')] list2 = list1 list3 = copy.copy(list1) l ...

  4. html中map area 热区自适应的原生js实现方案

    在做自适应网页的时候,如果在图片中使用了热区map.图片可以通过样式实现:图片大小随页面变化,但是MAP中每个area的坐标并不能通过css直接实现自适应.这篇文章就介绍通过原生js来实现:MAP中每 ...

  5. 奇妙的 CSS MASK

    本文将介绍 CSS 中一个非常有意思的属性 mask . 顾名思义,mask 译为遮罩.在 CSS 中,mask 属性允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域 ...

  6. uni-app网络请求

    对于 GET 方法,会将数据转换为 query string.例如 { name: 'name', age: 18 } 转换后的结果是 name=name&age=18. 对于 POST 方法 ...

  7. django中的懒加载机制

    懒加载在前端中的意义: 懒加载的主要目的就是作为服务器前端的优化,减少请求次数或者延迟请求数. 实现原理: 先加载一部分数据,当触发某个条件时利用异步加载剩余的数据,新得到的数据不会影响原有数据的显示 ...

  8. postman-4-响应内容

    通过响应报文来检测接口的正确性:响应由正文,响应头和状态码组成 Pretty模式可以格式化JSON或XML响应报文,以便更容易查看.突出显示Pretry模式中的链接,点击它们, 可以通过链接URL在P ...

  9. 【JMICRO】 微服务简介及异步RPC体验

    一,为什么写JMicro 印象中初次接触微服务大概是2011年,那会做Eclpise插件开发,网上查看好多关于OSGI的技术文章,发现Spring新出了一个叫Spring-boot的框架,那会没太上心 ...

  10. 5 个 IDEA 必备插件,让效率成为习惯

    IDEA 是最好的 IDE,谁赞成,谁反对? IDEA 是 Java 开发人员中最受欢迎和用户友好的 IDE 之一,它具有许多便利的功能,例如智能代码完成,自动执行繁琐的重复开发任务,因此它已成为 J ...