io操作是指什么_各种IO模型,一篇打尽
一、阻塞/非阻塞-同步非同步
同步/异步
同步请求: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模型,一篇打尽相关推荐
- linux的文件io操作(转)
linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作.不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出.它以文件标识符(整型)作 ...
- 康耐视智能相机IO操作笔记
在视觉学习中,IO的操作是非常有必要的,在康耐视智能相机中IO操作记录如下: 1.相机IO触发拍照,这个不用自己去设置,IO线按照说明书接线即可. 2.相机IO输出信号给其他设备使用: 最常见的场景是 ...
- Python 文件 IO 操作详解
Python 文件 IO 操作详解 1.文件 IO 常用操作 2.文件打开操作 2.1 打开命令 2.2 命令参数 2.2.1 路径 2.2.2 mode 2.2.3 buffering 缓冲区 2. ...
- IO操作和DMA、RDMA
用户进程想要执行IO操作时(例如想要读磁盘数据.向磁盘写数据.读键盘的输入等等),由于用户进程工作在用户模式下,它没有执行这些操作的权限,只能通过发起对应的系统调用请求操作系统帮忙完成这些操作.这里因 ...
- 用python实现yale人脸数据集降维_用Python实现磁盘IO操作全攻略,让数据流动起来!...
导读:IO在计算机中指的是Input/Output,也就是输入输出.凡是用到数据交换的地方,都会涉及IO编程,例如磁盘.网络的数据传输. 在IO编程中,Stream(流)是一种重要的概念,分为输入流( ...
- Python 数据分析三剑客之 NumPy(六):矩阵 / 线性代数库与 IO 操作
CSDN 课程推荐:<Python 数据分析与挖掘>,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务.曾与联想.亨氏.网 ...
- python中io.textio_Python文件读写概述(IO操作、文件读写、stringiobytesio、序列化),python,的,小,总结,StringIOBytesIO...
IO操作 在进行文件的读写之前,需要说明几点.首先,运行的程序和读取的数据都会在内存中缓存. 进入到 程序或数据 内存 其次,用python程序进行文件的读写,需要创建一个小工具–文件流,用来处理数据 ...
- select poll epoll IO操作多路复用及猴子补丁
一:select(能监控数量有限,不能告诉用户程序具体那个连接有数据) select目前几乎所有的平台都支持,其良好的跨平台支持也是一个优点 select的缺点在于单个进程能够监控的文件描述的数量存在 ...
- 【Tensorflow】io 操作
文章首发于微信公众号<有三AI> [从caffe到Tensorflow 1]io 操作 最近项目要频繁用到tensorflow,所以不得不认真研究下tensorflow而不是跟之前一样遇到 ...
最新文章
- Confluence 6 文档主题合并问答
- 修改oracle用户登录密码
- Druid如何自动根据URL自动识别DriverClass的
- python3爬虫初探(五)之从爬取到保存
- 显卡天梯图:2014最新显卡性能天梯图
- Python GUI
- python OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized
- 去掉知乎/CSDN网页标题未读消息提示
- bool类型数组转换成一个整数_Python如何处理数据?如何把数据转换成我们想要的?三种处理方法...
- 金蝶应收应付模块流程_金蝶K3操作流程图详解(65页).doc
- 深度学习--激活函数之sigmoid激活函数
- Java8中Map新方法:compute使用详解
- 怎么学计算机基本步骤,学习计算机知识的基本步骤是什么?
- dex字符串解密_[原创]通过CTF学习Android漏洞(炸弹引爆+dex修复)
- 靶机、软件搭建:05---Burp Suite工具的安装与使用(Windows环境)
- 第三方登录——OAuth2.0协议
- 如何搭建简易又安全的企业内部文件服务器?
- iOS企业版app部署到自己的服务器
- php使用composer安装目录,Composer基本安装与使用
- 中国化合物半导体产业竞争趋势与投资前景建议报告2022-2028年版
热门文章
- 字符串匹配rk算法c语言,字符串匹配问题(BFRK算法)
- 通配符 不是jpg 结尾文件_Struts(十九)- 使用使用通配符匹配
- 同等质量下那种图片格式小_八个PPT图片处理必会的神技巧,帮你轻松做出高质量PPT...
- python中lambda函数_python中的lambda函数用法
- 如何获取某个标签下所有的元素id_D3库实践笔记之元素定位与数据绑定 |可视化系列33...
- 马赛克,克星,真来了!
- 再见了Python,Tableau数分工具确实牛逼!
- Python中令人头疼的变量作用域问题,终于弄清楚了
- 只要200页!火爆全网的Python学习知识手册!拿走不谢!
- 如何看待 2020 届校招算法岗「爆炸」的情况?英雄所见略同