一般来说,一个输入操作通常包括两个阶段:
、等待数据准备好;
、从内核向进程复制数据
是否同步的判断依据是: 是否 针对的 整个过程,即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. windows挂载nas存储

    操作系统:windows server 2016 1.安装nfs客户端打开程序面板 2.点击下一步 3.点击下一步 4.下一步 5.这里只选择文件和存储服务器就可以 6.选择nfs客户端,安装 7.m ...

  2. 小白入门NAS—快速搭建私有云教程系列(一)

    什么是NAS 在日常的工作生活中,我们有大量的资料.文件需要存储在电脑或者其他终端设备中,但是这种方式需要电脑配备高容量的硬盘,而且需要随时随地的带着,这样是不是很麻烦? 那么,今天,我来介绍一种家庭 ...

  3. CSS position 属性_css中常用position定位属性介绍

    css可以通过为元素设置一个position属性值,从而达到将不同的元素显示在不同的位置, position定位是指定位置的定位,以下为常用的几种: 1.static(静态定位): 这个是元素的默认定 ...

  4. SCSS笔记

    SASS是成熟,稳定,强大的 CSS预处理器 ,而 SCSS 是SASS3版本当中引入的新语法特性,完全兼容CSS3的同时继承了CSS强大的动态功能. CSS书写代码规模较大的web应用时,容易造成选 ...

  5. docker安装,卸载和入门

    Docker 简介 背景 开发和运维之间因为环境不同而导致的矛盾 集群环境下每台机器部署相同的应用 DevOps(Development and Operations) 简介 Docker是一个开源的 ...

  6. php 修改图片大小

    <?php set_time_limit(0);ini_set("memory_limit","500M");$dir = dir('./');while ...

  7. python 生成器(五):生成器实例(一)创建数据处理管道

    问题 你想以数据管道(类似Unix管道)的方式迭代处理数据. 比如,你有个大量的数据需要处理,但是不能将它们一次性放入内存中. 解决方案 生成器函数是一个实现管道机制的好办法. 为了演示,假定你要处理 ...

  8. Django之 Models组件

    本节内容 路由系统 models模型 admin views视图 template模板 引子 讲django的models之前, 先来想一想, 让你通过django操作数据库,你怎么做? 做苦思冥想, ...

  9. POJ 1057 File Mapping 最详细的解题报告

    题目来源:POJ 1057 File Mapping 题目大意:像我的电脑那样显示文件夹和文件信息,其中在同一级目录内,文件夹排在文件的前面并且文件夹的顺序不变,同一级目录中文件按字母序排列.文件以‘ ...

  10. 计算机网络学习socket--day3

    1.REUSEADDR(地址重复利用) 1.REUSEADDR解决服务器关闭后重新绑定地址,在day3中知道服务器端必须绑定地址 2.服务器端尽可能使用REUSEADDR 3.在绑定之前尽可能调用se ...