IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> NIO源码解析-IO简述 -> 正文阅读

[系统运维]NIO源码解析-IO简述

前言:

? ? NIO,是一个比较高级的知识点。平时的代码开发中,我们一般很少直接使用NIO相关知识点。但是,其却是各种通信框架的基础知识。如Netty、Mina等,就是基于NIO来进行开发的。

? ? IO,我们知道,是Input/Output,输入输出,可以是网络流的IO,也可以是文件的IO。通常这是一种BIO。

? ? 到这里,我们引入了BIO、NIO,如果了解的多一点的话还有AIO。那么它们之间有什么关系呢?

? ? 本文将简单介绍上述三者之间的区别,并且拆分NIO的知识点,后续博客会对NIO的各个知识点进行更详细的说明。

1.同步异步、阻塞非阻塞状态

1.1 同步与异步

? ? 经常会听到同步请求,异步请求。

? ??区分一个请求是同步还是异步的话,主要看请求在调用过来时候,是等待直到执行结果完成,还是及时返回结果,后续通过异步通知或回调的方式来告诉调用方。

? ? 同步请求:调用方发起调用后,会一直等待,直到被调用方返回一个响应结果为止

? ? 异步请求:调用方发起调用后,被调用方立即返回一个响应,后续被调用方通过异步通知或者回调的方式来告知调用方其结果。

1.2 阻塞与非阻塞

? ? 阻塞与非阻塞主要是关注程序在等待执行结果时的状态

? ? 阻塞:当结果返回之前,线程会被挂起(BLOCK状态)

? ? 非阻塞:当结果返回之前,线程不会被挂起(非BLOCK状态)

有了上述基础知识后,我们再来分析下BIO NIO 与AIO的不同之处。

2.操作系统视角下的BIO、NIO和AIO

2.1 BIO

? ? 即Blocking IO(阻塞IO),操作系统下BIO整个过程如下所示:

? ? 当应用程序发起系统调用时,1)操作系统首先需要先将数据拷贝到系统内核缓冲区,2)然后再将内核缓冲区的数据拷贝到应用程序的进程空间(JVM就是堆内存等)

? ? 在BIO的情况下,应用程序发起系统调用后,会一直等待操作系统执行完上述的数据拷贝之后,才结束调用。(此时该请求线程会被BLOCK)

2.2 NIO

? ? 即None-Blocking IO,操作系统视图下NIO调用过程如下:

??? 相比较BIO而言,发起系统调用后,应用程序线程不是一直在阻塞等待数据返回,而是在不停的轮询查询操作系统是否将数据准备好,当操作系统准备好数据之后,后续的从内核空间拷贝数据到用户空间的过程与BIO相同。?

??? 所以,BIO是上述两个阶段都是阻塞的,而NIO第一个阶段非阻塞,第二个阶段阻塞。

? ??另:有关于非阻塞IO,还有一个非常重要的概念,叫做多路复用模型。该模型共包含三种解决方案:select、poll、epoll。应用程序使用这些IO函数同时监听多个IO通道的状态变更,可以更好的支持更大量级的连接。

? ? 有关于多路复用模型,会在下一篇文章中单独说明。

? ??

2.3 AIO

? ? 即Asynchronous?IO,异步IO在操作系统视角下的调用过程如下:

? ? 应用程序线程发起一个系统调用后,会立即返回,调用事件注册到操作系统上,操作系统准备完成数据并将数据拷贝到用户空间后,会通知应用程序数据已经可用。

? ??在上述两个过程中,AIO均为非阻塞状态

? ??

需要说明的是:Java中的BIO NIO和AIO是java对操作系统的各种IO模型的封装。

IO类型一阶段(数据拷贝至操作系统内核空间)二阶段(内核空间数据拷贝至应用程序)
BIO同步阻塞同步阻塞
NIO同步非阻塞同步阻塞
AIO异步非阻塞异步非阻塞

总结:

? ? 实际写一个完整的系列还是蛮困难的,无论写的多还是写的少都比较困难,笔者没有采取先写一个完整示例然后再将示例的知识点拆分的方式,而是反其道而行,先讲解拆分后的知识点,然后最终用一个真实的示例来将知识点串起来。

? ? 整个NIO系列本质上也是其他系列的基础篇章,后续还会有Mycat系列、Netty系列等等。这些高级中间件其实底层也是使用的NIO相关知识。

? ? 工欲善其事必先利其器,让我们一起遨游在NIO的海洋里吧。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 12:21:05  更:2021-09-01 12:22:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 11:29:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码