假期小结 BIO, NIO, AIO

news/2024/7/9 17:37:48 标签: 操作系统, epoll, netty

虽然忙碌,但仍小有收获,开心。

 

引子

BIO: Blocking IO,阻塞式IO

NIO: Non-blocking IO,非阻塞式IO

AIO: Async IO,异步IO

 

问题

什么是阻塞式IO/非阻塞式IO,什么又是同步IO/异步IO呢?

 

前提

① IO实际上分为两大步:应用程序请求的IO操作、操作系统的IO操作 - 用户空间和内核空间(kernel)。用户空间的应用程序需要IO操作,实际上是调用的操作系统的IO操作。

② kernel的IO操作是需要时间的 - 姑且叫它准备时间吧。

 

那问题来了:在这个准备时间里,操作系统和应用程序都是如何工作的?

 

以应用程序读取数据为例(这里不考虑缓存),操作系统其实有两类回复:

① 等到需要的数据都准备完毕再回复 -- 中间一直默不作声,这就是同步IO。

② 先告诉应用程序数据没有准备好,然后准备好数据,通知(回调)应用程序或被轮询 -- 这就是异步IO。

 

那应用程序如何对待这个响应呢?其实还是两类:

① 一直等,直接数据都发过来,然后再进行下一步。-- 阻塞IO。

② 先干别的,然后定期查询或等待回调。-- 非阻塞IO。

 

小结

阻塞/非阻塞IO 说的是应用程序的IO操作;同步/异步IO 说的是操作系统的IO操作。

注意,异步、非阻塞,都有两个彼此对应的小分类。

 

略深入

前面已经说过,操作系统的IO操作分为同步IO和异步IO。同步IO没什么好说的,我们就来看看异步IO。

异步IO,其实是三个系统函数select、poll、epoll中的一个(跟Linux内核版本有关),搞C/C++编程的人应该熟悉这个。

虽然select和poll的性能极高,但能处理的数量有限制,没记错的话是不能超过1000个,否则性能降低。

epoll的性能略低(当然还是很高),但能处理的数量很高。

这几年的Linux核心用的都是epoll,就是说新版本系统上 JDK NIO调用的是epoll

感兴趣的人可以查阅相关资料了解下。

 

注意,这里说的操作系统都是指Linux。

 

优缺点

查了一些资料,都是用网络编程为例来说明BIO、NIO、AIO的区别,这里就不再敲代码了,直接说说彼此的优缺点好了。

BIO:优点是编码简单,容易上手、调试。缺点则是因为多线程本身的问题,①每个线程都要分配内存空间(最少128K),②线程的切换需要耗费时间。所以,一是线程数量有限;二是线程多了会严重降低响应时间。当然也可以使用线程池,但又涉及到队列任务积压问题。

NIO:刚好跟BIO相反。优点是速度快,耗费资源少。缺点是编码复杂,难以上手、调试。

AIO:这个暂时没研究,不过想想应该跟js的回调是一个道理。事件驱动(回调),性能高。

 

补充

说到NIO,其实很少有直接使用JDK的NIO的,因为有严重bug,会导致Linux下select占用CPU 100%。虽说后续有改进,但也只是降低了几率,并没有彻底消除。

所以建议使用Netty、Mina之类的框架,要好的多。

 

另外,Tomcat,自版本7开始,使用的就是NIO技术,以提升服务性能。


http://www.niftyadmin.cn/n/972079.html

相关文章

事物视图索引备份和恢复

一:什么是事物 事物是一种机制,一个操作序列,包含了一组数据库,并且把所有的命令作为一个整体一起向系统提交或撤销操作 请求.既这一组数据库命令要么执行要么不执行,因此事物是一个不可分割的工作逻辑单元.。 二:事物的特性 原子性:事务中的所有元素都必须作为一个…

PythonNote009---线程和进程

线程和进程 通俗意义上的线程和进程的解释,摘自廖雪峰Python教程 进程(Process):对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就…

linux下如何查看磁盘分区所使用的文件系统格式?

答: df -T 转载于:https://www.cnblogs.com/dakewei/p/11377130.html

所有 SAP 现在开设的标准课程

下面是 SAP 中国的教育培训首页,里面有 SAP 最新最完整的培训教育计划。 http://www30.sap.com/china/services/education/index.epx 从中可以看出,随着 SAP 的发展,BC4xx 系列课程已经发生了很大改变,取消了 BC404、BC406&#x…

react 项目实战(四)组件化表单/表单控件 高阶组件

高阶组件:formProvider 高阶组件就是返回组件的组件(函数) 为什么要通过一个组件去返回另一个组件? 使用高阶组件可以在不修改原组件代码的情况下,修改原组件的行为或增强功能。 我们现在已经有了带有表单校验功能的添…

PythonNote008---时间处理

常用的时间、日期处理 生成间隔时序list 备用 import datetimedef dateRange(start, end, step1, inputFormat"%Y-%m-%d", outputFormat"%Y%m%d"):"""startDate:开始时间,字符串类型,默认yyyy-MM-ddendDate:结束时…

Codeforces Round #580 (Div. 2)D(思维,Floyd暴力最小环)

#define HAVE_STRUCT_TIMESPEC#include<bits/stdc.h>using namespace std;const int maxn300;const int inf1e9;long long a[100007];long long b[100007];int val[maxn 1][maxn 1]; // 原图的邻接矩阵inline int floyd(const int &n) { static int dis[maxn 1][m…

【前端】书客编辑器Web版v1.0 - HTML布局

作者&#xff1a;邹峰立&#xff0c;微博&#xff1a;zrunker&#xff0c;邮箱&#xff1a;zrunkeryahoo.com&#xff0c;微信公众号&#xff1a;书客创作&#xff0c;个人平台&#xff1a;www.ibooker.cc。 本文选自书客创作平台第102篇文章。阅读原文 。 当集成书客编辑器Web…