【Java IO】同步异步和阻塞非阻塞真正的区别!!!

先上结论:

同步异步和阻塞非阻塞真正的区别!!!

假设某个进程正在运行下面这段代码:

......
operatorA......;
read();
operatorB......;
operatorC......;

当进程执行完operatorA后开始进行read系统调用,而所需数据尚未准备好,这时进程有两种选择:

  1. 等待数据准备好,然后再运行operatorB,operatorC
  2. 不等待数据的准备,直接运行operatorB,operatorC

同步和异步

第1种就是同步方式,第2种就是异步方式,同步和异步描述的是进程的IO操作与其之后的各指令之间运行的先后顺序及依赖关系
先不谈同步和异步如何实现,先来看为什么有同步或者异步的需求:
当operatorB,operatorC等后续操作依赖于read读入的数据时,程序必须停留在read这一步直至数据完全准备好,否则程序会出现错误的结果,这就是所谓“同步
而当operatorB,operatorC等后续操作与read读入的数据无关时,完全可以让当前线程继续执行下去,与后台的IO操作同时进行,这就是所谓“异步
这里可以做一下同义词转换:同步——必须保证某种指令顺序;异步——一段代码中指令执行互相没有依赖,不需要保证顺序

阻塞和非阻塞

继续看第1种情况,也就是进程等待数据准备好再执行operatorB,operatorC的同步方式,即使是等待,也有两种不同的“等待”:

  1. 主动放弃CPU,在阻塞态下等待
  2. 占用CPU进行轮询,在运行态下等待

第1种就是阻塞方式,第2种就是非阻塞方式。也就是说:阻塞和非阻塞这一对概念是在同步的基础上才有了意义,在异步下进程是“继续执行”而不是“等待”,于是不可能会涉及“以何种姿态等待”的问题,即阻塞和非阻塞这对概念描述的问题
如果学过操作系统的朋友可以感觉到:阻塞方式就是操作系统中的“中断驱动”方式,而非阻塞方式就是操作系统中的“程序控制”方式,显然前者的优点是可以更高效地使用系统资源,而后者的优点是实时性,即保证read所需的数据准备好的一瞬间就让进程继续往下执行operatorB和operatorC,而不是接受中断后进入就绪态,等待操作系统漫长的(相对而言)和不稳定的进程调度才得以继续执行


下面是对一篇讲解 Java IO 底层原理的优秀博客所做的阅读笔记和精华摘抄,原文链接为:10分钟看懂, Java NIO 底层原理

Java程序IO的本质(或操作系统IO的本质)

  • read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。这个两个系统调用,都不负责数据在内核缓冲区和磁盘之间的交换。底层的读写交换,是由操作系统kernel内核完成的。

阻塞和非阻塞

  • 阻塞是指用户空间(调用线程)一直在等待,而且别的事情什么都不做;
  • 非阻塞是指用户空间(调用线程)拿到状态就返回,IO操作可以干就干,不可以干,就去干的事情。
    在java中,默认创建的socket都是阻塞的。

同步和异步

  • 同步IO是指用户空间线程是主动发起IO请求的一方,内核空间是被动接受方。
  • 异步IO则反过来,是指内核kernel是主动发起IO请求的一方,用户线程是被动接受方,用户空间线程向内核空间注册各种IO事件的回调函数,由内核去主动调用

三种IO模型

同步阻塞IO(Blocking IO)

BIO的优点:

  • 程序简单,在阻塞等待数据期间,用户线程挂起。用户线程基本不会占用 CPU 资源。

BIO的缺点:

  • 一般情况下,会为每个连接配套一条独立的线程,或者说一条线程维护一个连接成功的IO流的读写。在并发量小的情况下,这个没有什么问题。但是,当在高并发的场景下,需要大量的线程来维护大量的网络连接,内存、线程切换开销会非常巨大。因此,基本上,BIO模型在高并发场景下是不可用的

注意:不要混淆这里的阻塞IO和操作系统课里学的学的IO模型,操作系统里面学的IO模型是为了节省CPU资源而设计的,概念位于现在所说的JavaIO模型的下层,对Java程序而言是不可见的,而BIO、NIO、AIO是在操作系统的IO模型的上层又发展出的概念,是Java程序可见可控的

同步非阻塞NIO(None Blocking IO)

在linux系统下,可以通过设置socket使其变为non-blocking。NIO 模型中应用程序在一旦开始IO系统调用,会出现以下两种情况:

(1)在内核缓冲区没有数据的情况下,系统调用会立即返回,返回一个调用失败的信息。

(2)在内核缓冲区有数据的情况下,是阻塞的,直到数据从内核缓冲复制到用户进程缓冲。复制完成后,系统调用返回成功,应用进程开始处理用户空间的缓存数据。

NIO的优点:

  • 每次发起的 IO 系统调用,在内核的等待数据过程中可以立即返回。用户线程不会阻塞,实时性较好

NIO的缺点:

  • 需要不断的重复发起IO系统调用,这种不断的轮询,将会不断地询问内核,这将占用大量的 CPU 时间,系统资源利用率较低

点评:NIO有点是“牺牲一切为实时性服务”
Java NIO(New IO) 不是IO模型中的NIO模型,而是另外的一种模型,叫做IO多路复用模型( IO multiplexing )

IO多路复用模型

IO多路复用模型是同步的,也是阻塞的,和BIO的区别就是一个线程可以监听成百上千个文件描述符,减轻了操作系统创建那么多个线程的负担

异步IO模型(asynchronous IO)

  • 当用户线程调用了read系统调用,立刻就可以开始去做其它的事,用户线程不阻塞
  • 在内核kernel的等待数据和复制数据的两个阶段,用户线程都不是block(阻塞)的
  • 用户线程需要注册IO操作完成的回调函数到操作系统的内核
  • 异步IO有的时候,也叫做信号驱动 IO
  • 真正的异步 I/O 模型
  • Windows 系统下通过 IOCP 实现了真正的异步 I/O。但是很少作为百万级以上或者说高并发应用的服务器操作系统来使用。而在 Linux 系统下,异步IO模型目前并不完善。所以在 Linux 下实现高并发网络编程时都是以 IO 复用模型模式为主。

参考资料:
IO 模型知多少 | 理论篇
10分钟看懂, Java NIO 底层原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2776608.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

JSP页面组件

JSP页面组件 JSP页面由各种组件组成,可以在JSP应用程序中使用这些组件来添加其他功能,如添加添加和循环结构或使用JavaBean组件。JSP页面的四个组件为: JSP指令JSP脚本JSP隐式对象JSP动作1. JSP指令 JSP页面中的指令元素提供关于特定JSP页面的全局信息,有三种类型: Page…

你是在独立思考,还是在被洗脑?

你有过这样的经历吗? 老板走过来,急匆匆丢给你一句:帮我整理一下那个客户的资料,下午给我。你抬头,应道「好好好」。老板扬长而去。你转念一想: 等等,哪个客户?什么资料?…

发文新思路!双流卷积!CWT-DSCNN-MSA基于时序特征、cwt小波时频图的双流卷积融合注意力机制的故障识别程序!直接运行!

适用平台:Matlab2023版本及以上 本程序参考中文EI期刊《电力自动化设备》2023年12月29号网络首发文献:《基于格拉姆角场与并行CNN的并网逆变器开关管健康诊断》,此外,在此基础上进一步对模型进行多重改进,每个人都可以构造属于自…

你的立身之本是什么?

去年发生的一切,大到疫情、政治经济形势、行业的萎靡和震荡,小到身边的跳槽、裁员、公司倒闭……似乎都在告诉我们: 当冲击到来的时候,它是不会提前跟你打招呼的。 接下来的10年,我们所面临的不确定性,比起…

绝缘栅极晶体管IGBT

IGBT(绝缘栅极晶体管): 常用于百V百A级使用,外观上看相比于MOS最大的区别是比较大,mos主要用于中小功率器件中。 本质是一个电子开关,相比于MOS和三极管来说其最大的特点是耐压很高,可达6000V以上&#xf…

保育员答案在哪搜?这4款足够解决问题 #媒体#其他#其他

学会运用各类学习辅助工具和资料,是大学生培养自主学习能力和信息获取能力的重要途径之一。 1.石墨文档 石墨文档(Shimo Docs)是一款强大的在线文档协作工具。它提供了多人实时协作、版本控制、评论和批注等功能,方便学生在学习中进行文档编写、合作项…

VUE学习——事件处理

事件分为内联事件和方法事件。 我们可以使用【v-on】&#xff08;简写&#xff1a;&#xff09;来处理。 内联 <button v-on:click"count">按钮</button><button click"count">按钮</button><p>{{ count }}</p>方法

ClickHouse--01--简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. ClickHouse 简介1.1 大数据处理场景1.2 什么是 ClickHouse1.3 OLAP 场景的特征 2. ClickHouse 特性2.1 完备的 DBMS 功能2.2 列式存储行式存储: 在数据写入和修改…

Linux线程库封装

一 MyThread.hpp #pragma once #include<pthread.h> #include<iostream> #include<unistd.h> #include<string> #include<ctime>typedef void (*callback_t)(); static int num 1; //任务和线程绑定 class Thread {static void* Routine(void …

容器监控三剑客CAdvisor、Granfana、InfluxDB

容器监控 原生命令 docker stats查看结果 &#x1f629;通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据&#xff0c;一般小公司够用了。但是&#xff0c;docker stats统计结果只能是当前宿主机的全部容器&#xff0c;数据资料是实…

【OrangePi Zero2的系统移植】交叉编译工具链配置、wiringOP库、智能分类工程代码

一、交叉编译工具链配置 二、交叉编译wiringOP库 三、交叉编译智能分类工程代码 四、Makefile 用于编译 WiringPi 库 一、交叉编译工具链配置 1、关于编译 编译是指将源代码文件&#xff08;如C/C文件&#xff09;经过预处理、编译、汇编和链接等步骤&#xff0c;转换为可执…

第5章 数据库操作

学习目标 了解数据库&#xff0c;能够说出数据库的概念、特点和分类 熟悉Flask-SQLAlchemy的安装&#xff0c;能够在Flask程序中独立安装扩展包Flask-SQLAlchemy 掌握数据库的连接方式&#xff0c;能够通过设置配置项SQLALCHEMY_DATABASE_URI的方式连接数据库 掌握模型的定义…

推荐研发度量思码逸的研发度量工具及视频教学

目前国内做研发度量中&#xff0c;思码逸的研发度量工具的确做的不错&#xff0c;网址是&#xff1a;思码逸-专业的软件研发效能度量分析平台 看到一个不错的介绍视频&#xff1a;《让数据说话&#xff0c;高效盘点企业研发效能》&#xff0c; 地址是&#xff1a;视频课程&…

VMware17上安装centos7.9成功后,进入linux命令行以后,运行没几分钟直接卡死,或者说非常卡

VMware17上安装centos7.9成功后&#xff0c;进入linux命令行以后&#xff0c;运行没几分钟直接卡死&#xff0c;或者说非常卡 解决方案&#xff1a;关闭windows的Hyper-V服务&#xff0c;重启虚拟机

高防服务器出租的优势及特点

高防服务器出租是指租用具备高防御能力的服务器&#xff0c;用于应对网络攻击、保护网站和数据安全。那么为什么会选择高防服务器出租&#xff0c;小编为您整理发布高防服务器出租的优势及特点。 高防服务器通常具备以下特点&#xff1a; 1. 高性能硬件配置&#xff1a;高防服务…

面试经典150题 -- 栈(总结)

总的链接 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 关于栈 -- stack 的学习链接 c的STL中的栈 -- stack-CSDN博客 20 . 有效的括号 这题直接用栈模拟就好了; 这里用一种取巧的方法 , 当遇见左括号&#xff0c;加入右…

以管理员权限删除某文件夹

到开始菜单中找到—命令提示符—右击以管理员运行 使用&#xff1a;del /f /s /q “文件夹位置” 例&#xff1a;del /f /s /q "C:\Program Files (x86)\my_code\.git"

HARRYPOTTER: FAWKES

攻击机 192.168.223.128 目标机192.168.223.143 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.143 开启了21 22 80 2222 9898 五个端口&#xff0c;其中21端口可以匿名FTP登录&#xff0c;好像有点说法,百度搜索一下发现可以用anonymous登录…

政安晨:快速学会~机器学习的Pandas数据技能(六)(数据类型和缺失值)

在数据分析中&#xff0c;了解数据的类型是非常重要的。数据类型决定了可以对数据进行哪些操作&#xff0c;以及如何对数据进行分析和处理。 常用的数据类型包括&#xff1a; 数值型数据&#xff1a;包括整数&#xff08;int&#xff09;和浮点数&#xff08;float&#xff09;…

CentOS 7安装Nodejs

说明&#xff1a;本文介绍如何在云服务器上CentOS 7操作系统上安装Nodejs。以及安装过程中遇到的问题。 下载压缩包&解压 首先&#xff0c;先去官网下载Linux版本的Node。 将下载下来的压缩包&#xff0c;上传到云服务器上&#xff0c;解压。配置环境变量。 &#xff08…