一、阻塞/非阻塞-同步非同步

同步/异步

同步请求:A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A;

异步请求:A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。

同步/异步区别

同步和异步最大的区别就是被调用方的执行方式和返回时机;

同步指的是被调用方做完事情之后再返回;

异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。

阻塞/非阻塞

阻塞请求:A调用B,A一直等着B的返回,别的事情什么也不干;

非阻塞请求:A调用B,A不用一直等着B的返回,先去忙别的事情了。

阻塞/非阻塞区别

阻塞和非阻最大的区别就是在被调用方返回结果之前的这段时间内,调用方是否一直等待。

阻塞指的是调用方一直等待,别的事情什么都不做;

非阻塞指的是调用方先去忙别的事情。

阻塞/非阻塞和同步/异步的区别

阻塞、非阻塞和同步、异步其实针对的对象是不一样的

阻塞、非阻塞说的是调用者

同步、异步说的是被调用者

二、Linux(UNIX)操作系统五种IO模型

什么是IO

拿一次磁盘文件读取为例,我们要读取的文件是存储在磁盘上的,我们的目的是把它读取到内存中。可以把这个步骤简化成把数据从硬件(硬盘)中读取到用户空间中。

一次完整的钓鱼(IO)操作,是鱼(文件)从鱼塘(硬盘)中转移(拷贝)到鱼篓(用户空间)的过程。

阻塞IO模型

阻塞 I/O 是最简单的 I/O 模型,一般表现为进程或线程等待某个条件,如果条件不满足,则一直等下去。条件满足,则进行下一步操作。

应用程序进行 recvfrom 系统调用时将阻塞在此调用,直到该套接字上有数据并且复制到用户空间缓冲区。该模式一般配合多线程使用,应用进程每接收一个连接,为此连接创建一个线程来处理该连接上的读写以及业务处理。

非阻塞IO模型

应用进程与内核交互,目的未达到之前,不再一味的等着,而是直接返回。然后通过轮询的方式,不停的去问内核数据准备有没有准备好。如果某一次轮询发现数据已经准备好了,那就把数据拷贝到用户空间中。

应用进程通过 recvfrom 调用不停的去和内核交互,直到内核准备好数据。如果没有准备好,内核会返回error,应用进程在得到error后,过一段时间再发送recvfrom请求。在两次发送请求的时间段,进程可以先做别的事情。

IO复用模型

多个进程的IO可以注册到同一个管道上,这个管道会统一和内核进行交互。当管道中的某一个请求需要的数据准备好之后,进程再把对应的数据拷贝到用户空间中。

IO多路转接是多了一个select函数,多个进程的IO可以注册到同一个select上,当用户进程调用该select,select会监听所有注册好的IO,如果所有被监听的IO需要的数据都没有准备好时,select调用进程会阻塞。

信号驱动IO模型

应用进程在读取文件时通知内核,如果某个 socket 的某个事件发生时,请向我发一个信号。在收到信号后,信号对应的处理函数会进行后续处理。

异步IO模型

应用进程把IO请求传给内核后,完全由内核去操作文件拷贝。内核完成相关操作后,会发信号告诉应用进程本次IO已经完成。

5种IO模型对比

三、Java中的三种IO模型

java IO模型和操作系统IO模型关系

Java中的IO还是借助操作系统的IO模型的,只不过是对操作系统IO模型的封装而已啦。

可以把Java中的BIO、NIO和AIO理解为是Java语言对操作系统的各种IO模型的封装。

java中提供的IO有关的API,在文件处理的时候,其实依赖操作系统层面的IO操作实现的。

比如在Linux 2.6以后,Java中NIO和AIO都是通过epoll来实现的,而在Windows上,AIO是通过IOCP来实现的。

阻塞IO(BIO)

同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。

BIO (Blocking I/O):有一排水壶在烧开水,BIO的工作模式就是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。

BIO和NIO都是同步的IO模型,即同步阻塞IO和同步非阻塞IO

非阻塞IO(NIO)

同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。

NIO (New I/O):NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。

异步IO(AIO)

异步非阻塞I/O模型。

异步IO指的是异步非阻塞IO。

AIO ( Asynchronous I/O):为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。

四、Reactor 模式

Reactor 模式跟 IO 模型关系

Reactor 模式跟 IO 模型中的 IO 多路复用模型非常相似

IO 多路复用模型可以看成是 Reactor 模式在 IO 模型上的应用

Reactor 模式在进程-线程模型上的应用。

1. 单进程单线程

只有一个进程,监听套接字和连接套接字上的事件都由 Select 来处理。

过程

(1) 如果有建立连接的请求过来,Acceptor 负责接受并与之建立连接,同时将连接套接字加入 Select 进行监听。

(2) 如果某个连接上有读事件则进行 Read->业务处理->Write 等操作。

(3) 如此循环反复。

缺点:会有阻塞,在进行业务处理的时候不能进行其他操作:如建立连接,读取其他套接字上的数据等。

2. 单进程多线程

与单进程单线程类似,不同的是该模型将业务处理放在线程中,进程就不会阻塞在业务处理上。

优点:比较完美的进程-线程模型,在 Java 实现中复杂度也不高,很多网络库都是基于此,比如 Netty 。

3. 多进程单线程

与非 Reactor 模式中的多进程单线程相似,只是本模式在子进程中使用了 IO 多路复用,实用性一下就上来了。大名鼎鼎的 nginx 就采用这种进程-线程模型。

缺点:子进程还是会阻塞在业务处理上。

4. 多进程多线程

5. 主从进程多线程

前面几种 Reactor 模式的进程-线程模型中,连接的建立和连接的读写都是在同一进程中。本模型中将连接的建立和连接读写放在不同的进程中。

过程

(1) 主进程在监听套接字上 Select 阻塞,一旦有请求过来则与之建立连接,并将连接套接字传递给从进程。

(2) 从进程在连接套接字上 Select 阻塞,一旦连接上有数据过来则进行 Read,并将业务通过线程来处理。如果有必要还会向连接 Write 数据。

五、常见组件使用的模型

netty-主从-多线程

tomcat-单进程多线程

redis-单进程单线程

ngnix-多进程单线程

io操作是指什么_各种IO模型,一篇打尽相关推荐

  1. linux的文件io操作(转)

    linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作.不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出.它以文件标识符(整型)作 ...

  2. 康耐视智能相机IO操作笔记

    在视觉学习中,IO的操作是非常有必要的,在康耐视智能相机中IO操作记录如下: 1.相机IO触发拍照,这个不用自己去设置,IO线按照说明书接线即可. 2.相机IO输出信号给其他设备使用: 最常见的场景是 ...

  3. Python 文件 IO 操作详解

    Python 文件 IO 操作详解 1.文件 IO 常用操作 2.文件打开操作 2.1 打开命令 2.2 命令参数 2.2.1 路径 2.2.2 mode 2.2.3 buffering 缓冲区 2. ...

  4. IO操作和DMA、RDMA

    用户进程想要执行IO操作时(例如想要读磁盘数据.向磁盘写数据.读键盘的输入等等),由于用户进程工作在用户模式下,它没有执行这些操作的权限,只能通过发起对应的系统调用请求操作系统帮忙完成这些操作.这里因 ...

  5. 用python实现yale人脸数据集降维_用Python实现磁盘IO操作全攻略,让数据流动起来!...

    导读:IO在计算机中指的是Input/Output,也就是输入输出.凡是用到数据交换的地方,都会涉及IO编程,例如磁盘.网络的数据传输. 在IO编程中,Stream(流)是一种重要的概念,分为输入流( ...

  6. Python 数据分析三剑客之 NumPy(六):矩阵 / 线性代数库与 IO 操作

    CSDN 课程推荐:<Python 数据分析与挖掘>,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务.曾与联想.亨氏.网 ...

  7. python中io.textio_Python文件读写概述(IO操作、文件读写、stringiobytesio、序列化),python,的,小,总结,StringIOBytesIO...

    IO操作 在进行文件的读写之前,需要说明几点.首先,运行的程序和读取的数据都会在内存中缓存. 进入到 程序或数据 内存 其次,用python程序进行文件的读写,需要创建一个小工具–文件流,用来处理数据 ...

  8. select poll epoll IO操作多路复用及猴子补丁

    一:select(能监控数量有限,不能告诉用户程序具体那个连接有数据) select目前几乎所有的平台都支持,其良好的跨平台支持也是一个优点 select的缺点在于单个进程能够监控的文件描述的数量存在 ...

  9. 【Tensorflow】io 操作

    文章首发于微信公众号<有三AI> [从caffe到Tensorflow 1]io 操作 最近项目要频繁用到tensorflow,所以不得不认真研究下tensorflow而不是跟之前一样遇到 ...

最新文章

  1. Confluence 6 文档主题合并问答
  2. 修改oracle用户登录密码
  3. Druid如何自动根据URL自动识别DriverClass的
  4. python3爬虫初探(五)之从爬取到保存
  5. 显卡天梯图:2014最新显卡性能天梯图
  6. Python GUI
  7. python OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized
  8. 去掉知乎/CSDN网页标题未读消息提示
  9. bool类型数组转换成一个整数_Python如何处理数据?如何把数据转换成我们想要的?三种处理方法...
  10. 金蝶应收应付模块流程_金蝶K3操作流程图详解(65页).doc
  11. 深度学习--激活函数之sigmoid激活函数
  12. Java8中Map新方法:compute使用详解
  13. 怎么学计算机基本步骤,学习计算机知识的基本步骤是什么?
  14. dex字符串解密_[原创]通过CTF学习Android漏洞(炸弹引爆+dex修复)
  15. 靶机、软件搭建:05---Burp Suite工具的安装与使用(Windows环境)
  16. 第三方登录——OAuth2.0协议
  17. 如何搭建简易又安全的企业内部文件服务器?
  18. iOS企业版app部署到自己的服务器
  19. php使用composer安装目录,Composer基本安装与使用
  20. 中国化合物半导体产业竞争趋势与投资前景建议报告2022-2028年版

热门文章

  1. 字符串匹配rk算法c语言,字符串匹配问题(BFRK算法)
  2. 通配符 不是jpg 结尾文件_Struts(十九)- 使用使用通配符匹配
  3. 同等质量下那种图片格式小_八个PPT图片处理必会的神技巧,帮你轻松做出高质量PPT...
  4. python中lambda函数_python中的lambda函数用法
  5. 如何获取某个标签下所有的元素id_D3库实践笔记之元素定位与数据绑定 |可视化系列33...
  6. 马赛克,克星,真来了!
  7. 再见了Python,Tableau数分工具确实牛逼!
  8. Python中令人头疼的变量作用域问题,终于弄清楚了
  9. 只要200页!火爆全网的Python学习知识手册!拿走不谢!
  10. 如何看待 2020 届校招算法岗「爆炸」的情况?英雄所见略同