BIO阻塞模型

news2024/12/28 6:07:20

作者:V7

博客:https://www.jvmstack.cn

一碗鸡汤

  少年辛苦终身事,莫向光阴惰寸功。   ——   杜荀鹤

同步阻塞IO

   在介绍阻塞和非阻塞之前先说明一下同步异步。我们可以将同步和异步看做是发起IO请求的两种方式。同步IO指的是用户空间(进程或者线程)是主动发起IO请求的一方,系统内核是被动接受方。异步IO则反之,系统内核是主动发起IO请求的一方,而用户空间是被动接受方。

   在这里先介绍阻塞和非阻塞。阻塞IO指的是需要内核空间彻底完成IO操作之后返回到用户空间再执行用户程序的操作指令。这里的阻塞指的是用户程序(发起IO请求的进程或线程)的执行状态。我们平常所说的传统的IO都是阻塞IO模型,在Java网络编程中的socket都属于阻塞IO模型。

  那么同步阻塞IO指的就是用户空间主动发起,需要等待内核IO操作彻底完成之后才返回到用户空间的IO操作,在IO操作的过程中,发起IO请求的用户进程或者线程处于阻塞状态。

   关于用户空间和内核空间的知识点不清楚的可以查看前面网络编程基础的内容。

同步阻塞IO流程

   默认情况下,在Java应用程序中对socket的所有连接进行的IO操作都是同步阻塞IO。在阻塞IO模型中,从Java应用程序发起IO系统调用开始,一直到系统调用返回,这个时间段内发起IO请求的Java进程或者线程是阻塞的。同步阻塞IO的流程如下所示:

同步阻塞IO的流程

   阻塞IO的特点是在内核执行IO操作的两个阶段,发起IO请求的用户进程或线程被阻塞了。

   阻塞IO的优点是:应用程序开发简单,在阻塞等待数据时间段,用户线程是挂起的,基本不会占用CPU资源。

   阻塞IO的缺点是:一般情况下会为每个连接创建一个独立的线程,一个线程维护一个连接的IO操作。这种方式在并发量小的时候一般不会有什么问题。但是在高并发的应用场景下,阻塞IO模型需要大量的线程来维护大量的网络连接,内存、线程上下文切换的开销是非常巨大的,导致性能非常低下,所以在高并发的场景下基本上是不可用的。

BIO的通信模型图

   网络编程的基本模型是client/Server模型,也就是我们常说的C/S通信模型,它们是两个进程之间的通信。其中服务器端提供绑定的IP和监听端口这种位置信息,客户端通过连接操作向服务端监听的地址发起连接请求,通过TCP的三次握手建立连接,如果连接建立成功,客户端和服务端就可以通过网络套接字(socket)进行通信。

   在基于传统同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口。Socket负责发起连接操作。双方连接从成功后,通过输入和输出流进行同步阻塞式通信。

   BIO的服务端通信模型的服务端通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后通过输出流返回应答给客户端,线程销毁。这个就是典型的一请求一应答通信模型。

同步阻塞IO通信模型

   通过上图可以看出,该模型的最大问题就是缺乏弹性伸缩能力,假设当客户端并发访问量增加之后,服务端新创建的线程数量和客户端发起请求的数量是1:1的正比关系,在Java中线程是虚拟机非常宝贵的资源,当线程的数量膨胀之后,系统的性能将急剧下降。最坏的结果就是当并发访问量持续增大,系统会出现线程堆栈溢出、创建新线程失败、客户端连接失败等问题,最终导致进程宕机或僵死以致系统不能对外提供服务。

总结

   本章是对Java中传统IO编程模型的解读,在实际工作中可以根据实际情况选择对该模型的应用。

   扫码关注编程之艺术一起学习、进步。

编程之艺术

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

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

相关文章

项目美术部门敏捷开发流程及工具

前言 在项目开发中,针对美术部门的特性和工作风格,合理使用多种工具进行项目管理和进度控制非常必要。如果项目执行中有异地协作、美术内/外包、多项目并行的情况,正确的规划和管理的优势会更加凸显。 而合理使用整套的综合管理工具会让项目…

Day969.如何拆分代码 -遗留系统现代化实战

如何拆分代码 Hi,我是阿昌,今天学习记录的是关于如何拆分代码的内容。 当完成了项目的战略设计,大体设计出目标架构,又根据系统的现状,决定采用“战术分叉”的方式进行微服务拆分之后,接下来的难点就变成…

用GPT-4 写2022年天津高考作文能得多少分?

正文共 792 字,阅读大约需要 3 分钟 学生必备技巧,您将在3分钟后获得以下超能力: 积累作文素材 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由Lexica …

vue工程搭建

1&#xff1a;查看vue及npm版本&#xff1a; 2&#xff1a;执行npm init nuxt-app <project-name>语句&#xff1a; 若出现npm ERR! code ENOLOCAL 请执行如下语句&#xff1a; npm cache verify npm cache clean --force npm i -g npm npm install -g cnpm --regis…

数据库(mysql语句)循环语句

例题1&#xff1a; 20到50之间能被5除余1的所有自然数的和 EDECLARE i int DECLARE s int SET s0 SET i20 白WHILE i <50 BEGIN IF(i%51) SET s s i SET ii1 END PRINT20到50之间能被5除余1的所有自然数的和是cast(s as varchar(20)) 例题2&#xff1a; 实现如下图 代码…

设计模式之门面模式(Facade Pattern 外观模式)

一、模式定义 门面模式(Facade Pattern)&#xff1a;外部与一个子系统的通信必须通过一个统一的外观对象进行&#xff0c;为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。门面模式又称为外观…

中国南方Oracle用户组沙龙活动:大环境下的Oracle数据库的机遇与挑战

2023年03月12日(周日)在杭州索菲特西湖大酒店 (浙江省杭州市上城区西湖大道333 号)&#xff0c;中国南方Oracle用户组创始人之一&#xff1a;周亮&#xff08;zhou liang&#xff09;组织举办了主题为《大环境下的Oracle数据库的机遇与挑战》活动&#xff0c;大约有50名左右的人…

YMatrix 5.0 故障自动转移功能新实现,运维更方便!

前言 分布式数据库一般都实现了数据多副本的存储以保证数据的高可用性。在多副本存储的基础上&#xff0c;通过切换活跃的存储副本来实现故障转移&#xff0c;是常见的做法。 YMatrix 5.0 实现了在数据库集群所有数据分片上的故障自动转移&#xff0c;完全实现了数据库集群的…

一文带你深入了解分布式数据的复制原理!!

在分布式数据系统中&#xff0c;复制是一种重要的能力。简单来说&#xff0c;复制就是将数据的副本存储在多个位置&#xff0c;通常是在不同的服务器或节点上。这样做有几个关键的优点&#xff1a; 使得数据与用户在地理上接近&#xff08;从而减少延迟&#xff09;&#xff0…

渗透测试--3.1嗅探欺骗攻击

目录 1.中间人攻击 2. 社会工程学攻击 SET使用实例——建立克隆钓鱼网站收集目标凭证 SET工具集之木马欺骗实战反弹链接 后渗透阶段 钓鱼邮件 总结 1.中间人攻击 中间人攻击&#xff08;Man-in-the-middle attack&#xff0c;简称MITM&#xff09;是一种常见的网络攻击…

一文带你完整了解数据的编码!!

数据编码是将数据转换为计算机可读取和处理的二进制格式的过程。在数据存储中&#xff0c;正确的数据编码非常重要&#xff0c;因为它能够保证数据的完整性、可靠性和可读性。 数据编码可以确保数据在存储过程中不会发生错误。通过使用适当的数据编码规则&#xff0c;可以防止…

三十二、自定义镜像

1 、Docker镜像的原理 Docker镜像本质是什么? Docker中一个centos镜像为什么只有200MB&#xff0c;而一个centos操作系统的iso文件要几个G? Docker中一个tomcat镜像为什么有500MB&#xff0c;而一个tomcat安装包只有10多MB? 操作系统组成部分: 计算机组成原理 进程调度子…

OPPO 关停“造芯”业务 ZEKU:一场大胆的尝试的结束

前言 近期&#xff0c;OPPO 关停了其“造芯”业务 ZEKU&#xff0c;结束了其自主研发处理器的尝试。本文将对这一事件进行探讨&#xff0c;分析其背后的原因及其对整个行业的影响。 1. ZEKU的成立与使命 在2019年&#xff0c;OPPO旗下的ZEKU研究所成立&#xff0c;标志着OPP…

Redis缓存穿透、缓存雪崩和缓存击穿

缓存穿透 缓存穿透&#xff0c;是指查询一个缓存和数据库中都没有的数据。正常的使用缓存流程大致是&#xff0c;数据查询先进行缓存查询&#xff0c;如果key不存在或者key已经过期&#xff0c;再对数据库进行查询&#xff0c;并把查询到的对象&#xff0c;放进缓存。如果数据库…

Centos和Windows之间通过主机名实现相互访问

一、业务需求 在内网环境中,我们想直接通过特定的主机名称去访问我们的服务器,而不用去记忆服务器的IP地址,且不想通过nginx等代理工具或域名配置内容来操作。 二、分析 通常我们可以直接在浏览器中输入【localhost】后按下回车键后就可以访问我们的主机80端口的内容了;那…

计算机网络大作业(Wireshark抓包分析)

实验要求 wireshark的深入学习与掌握&#xff0c;如过滤器的使用&#xff0c;归纳方法通过实验阐述ARP的工作原理利用实验结果分析 ICMP 协议的报文结构字段定义基于实验数据深入分析 TCP 协议的连接过程原理&#xff0c;报文的分片等功能从校园网发起向外网中某 Web 服务器的…

基于正点原子电机实验的pid调试助手代码解析(速度环控制)

这里写目录标题 下位机与PID调试助手传输的原理代码讲解(基于正点原子)解析数据接受和数据发送的底层函数数据接受数据帧格式环形数组以及怎么找到它的帧头位置crc校验 数据发送数据上传函数 通过前两节文章&#xff0c;我已经了解了基本的pid算法&#xff0c;现在在完成了电机…

MatrixGate 5.0 性能再升级,加载速度提升三倍!

前言 数据的加载速度在数据处理和分析领域一直是一个挑战&#xff0c;为应对这一挑战&#xff0c;YMatrix 数据库开发了 mxgate 高速数据加载工具。最近&#xff0c;随着 YMatrix 5.0 的 GA&#xff0c;新版 mxgate 与上一版本&#xff08;4.8.1&#xff09;相比&#xff0c;速…

Linux 虚拟机 磁盘扩容

概述 在单台虚拟机上部署了过多服务&#xff0c;导致磁盘使用过度达到98%。 现在扩容提高磁盘容量&#xff0c;增加10G。 现象 df -h df -ih du -s具体步骤 VMware 扩容 关闭虚拟机的情况下执行&#xff0c;类似于生产环境下需要关闭服务器&#xff0c;从而添加硬盘等相关操作…

Liunx基础命令 - rm删除命令

rm命令 – 删除文件或目录 rm命令来自英文单词“remove”的缩写&#xff0c;中文译为“消除”&#xff0c;其功能是用于删除文件或目录&#xff0c;一次可以删除多个文件&#xff0c;或递归删除目录及其内的所有子文件。 rm也是一个很危险的命令&#xff0c;使用的时候要特别…