Java当中的BIO模型

我们知道Java中的IO模型分为BIO和NIO模型,BIO是BlCKING IO的简称而NIO当中的N有两层意思,一个是从java1.4开始出现的NEW IO,今天我们来聊一聊为什么传统的BIO会慢以及它并不适合大量的连接,我们先来看一段简单的代码,这段代码就是一个简单的BIO服务端:

public class BioServer {public static void main(String[] args) throws Exception {ServerSocket serverSocket = new ServerSocket();serverSocket.bind(new InetSocketAddress(9090));while (true) {TimeUnit.SECONDS.sleep(1);Socket accept = serverSocket.accept();new Thread(() -> {try {InputStream inputStream = accept.getInputStream();} catch (IOException e) {e.printStackTrace();}}).start();}}
}

这段代码逻辑我就不解释了,我们着重关注bind方法和accept方法,我们把这个代码打包丢到linux系统去执行,看看这一段代码都涉及到哪些系统调用,这里会涉及到一些linux的知识,主要是strace命令的使用,它可以追踪应用程序与操作系统之间的交互,也就是调用了哪些系统函数,也可以叫做系统调用,比如 strace ls命令的效果(后面还有好大一串,没有全部截图出来):

strace命令只会跟踪主线程的活动信息,所以一般我们会加上-ff也就是strace -ff ls ,这样不仅仅会跟踪主线程的活动,也会跟踪子线程的活动,我们此次要追踪的java bioserverde 的命令如下:

 strace -ff -o out java -cp chat-1.0-SNAPSHOT.jar com.tianjun.chat.bio.BioServer

这个命令的意思就是把这个JVM进程下面的所有的子线程的活动全部输出到一out开头的文件中,执行之后的效果如下图:

那么输出的信息,一般的第一个是进程id,第二个是主线程id也就是说图中的63232是jvm进程id,63233是main线程的线程id:

我们知道任何一个应用程序在linux中都会表示程一个文件,并且都会有一对应的文件描述符,我们可以用lsof -p pid来查看应用程序打开了哪些文件(描述符)

有很多,截图不全,我们也可以去/proc/pid/fd下面去看,区别就是没有显示一些系统的so文件,其中的012,相信大家都知道对应着标准输入、标准输出、错误输出:

我们的重点还是放到out.63233这个文件当中去,我们用cat命令查看内容会发现一写关键字,比如bind,accept等,我们先来看bind:

这其实对应的也就是java代码中的bind方法

我们知道BIO之所以成为阻塞,意思是没有连接连过来的时候就会一直等着,也就是Socket accept = serverSocket.accept();这一行代码会一直阻塞住,直到有客户端连接过来,我们继续往后翻文件会发现阻塞在poll这里:

直到有客户端连接进来,就会出现下面的accept那一行,我们继续往后翻,会发现clone字眼:

clone这一行的意思就是fork一个子线程出来处理任务,这时候我们可以用lsof命令看会多了一条数据,也就是clone出来的子线程,我们在上图看到文件内容阻塞在了poll,等待下一个连接进来,循环往复

总结一下:传统的BIO模型中,所涉及到的系统调用主要是三个(当然这里还涉及到tcp三次握手,不在本文讨论范围)

  1. bind,绑定端口
  2. accept,等待客户端连接
  3. clone,fork子线程处理数据

所以传统BIO的“慢”体现在两点:

  • 等待客户端连接是阻塞的
  • 每个连接都需要fork一个子线程来处理

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

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

相关文章

pt28django教程

缓存 缓存是一类可以更快的读取数据的介质统称,读取硬盘、较复杂的计算、渲染都会产生较大的耗时。数据变化频率不会很高的场景适合使用缓存。使用缓存场景:博客列表页、电商商品详情页、缓存导航及页脚。 Django中设置缓存 Django中提供多种缓存方式…

Mac电脑视频处理工具 Topaz Video AI for mac

Topaz Video AI是一款强大而易用的视频处理软件,通过人工智能技术提供高质量的视频增强和编辑功能。它可以帮助用户改善视频的质量、修复缺陷、优化图像,并提供丰富的编辑选项,以满足个性化的视频处理需求。无论是专业摄影师、视频编辑人员&a…

五、3d场景的卡片展示的创建

在我们3d的开发中,对某一些建筑和物体进行解释说明是非常常见的现象,那么就不得不说卡片的展示了,卡片展示很友好的说明了当前物体的状态,一目了然,下面就是效果图。 它主要有两个方法来实现,大量的图片建议…

maven找不到jar包

配置settings.xml文件之后出现报错找不到jar包 先改maven设置: 然后在重新清理构建项目: 可以通过执行以下命令清理本地 Maven 仓库 mvn dependency:purge-local-repository

渗透测试之打点

请遵守中华人民共和国网络安全法 打点的目的是获取一个服务器的控制权限 1. 企业架构收集 (1)官网 (2)网站或下属的子网站,依次往下 天眼查 企查查 2. ICP 备案查询 ICP/IP地址/域名信息备案管理系统 使用网站…

京东大型API网关实践之路

概述 1、背景 京东作为电商平台,近几年用户、业务持续增长,访问量持续上升,随着这些业务的发展,API网关应运而生。 API网关,就是为了解放客户端与服务端而存在的。对于客户端,使开放给客户端的接口标准统…

26342-2010 国际运尸 木质棺柩.

声明 本文是学习GB-T 26342-2010 国际运尸 木质棺柩. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了国际运尸木质棺柩的分类、规格、技术要求、检验方法、包装、运输和储存。 本标准适用于为国际运尸木质棺柩的设计、生产、检测…

第七天:gec6818开发板QT和Ubuntu中QT安装连接sqlite3数据库驱动环境保姆教程

sqlite3数据库简介 帮助文档 SQL Programming 大多数关系型数的操作步骤:1)连接数据库 多数关系型数据库都是C/S模型 (Client/Server)sqlite3是一个本地的单文件关系型数据库,同样也有“连接”的过程 2)操作数据库 作为程序员&am…

如何将matlab中的mat矩阵文件在python中读取出来

先安装hdf5storage这个包 pip3 install hdf5storage 然后在当前目录下放入要读取的mat文件 # 将matlab中的mat文件读取出来 import hdf5storagedata hdf5storage.loadmat(inputWeights.mat) print(data[inputWeights])

分布式搜索引擎Elasticsearch

一、Elasticsearch介绍 1.Elasticsearch产生背景 大数据量的检索NoSql: not only sql,泛指非关系型的数据库Nginx的7层负载均衡和4层负载均衡2.Elasticsearch是什么 一个基于Lucene的分布式搜索和分析引擎,一个开源的高扩展的分布式全文检索引擎 Elasticsearch使用Java开发…

RNN模型与NLP应用(1/9):数据处理基础Data Processing Basics

文章目录 处理分类特征把分类特征转化为数值特征应用one-hot编码indice要从1开始而不能从0开始数据处理为什么使用one-hot向量 处理文本数据Step1:将文本分割成单词Step2:计算单词的频度按频度递减的方式排序 Step3:One-Hot编码 处理分类特征…

Stm32_标准库_GPIOA初始化

代码: #include "stm32f10x.h" // Device headerGPIO_InitTypeDef GPIO_InitStructur;//定义变量结构体int main(void){/*使用RCC开启GPIO的时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启PA端口时钟/*使用GPIO_I…

黑马VUE3视频笔记

目录 一、使用create-vue创建项目 二、setup选项 三、reactive和ref函数 1.reactive() 2.ref() 三、computed 四、watch ​五、生命周期函数 六、父传子、子传父 父传子defineProps 子传父defineEmits 七、模板引用 ref defineExpose 八、跨层传递普通数据 prov…

JAXB(Java Architecture for XML Binding)下载、使用

简介 JAXB(Java Architecture for XML Binding)就是XML数据绑定的java架构。JAXB可以根据XML Schema生成java类,也能根据java类生成XML Schema,能将XML数据unmarshall到Java内容树,也能将Java内容树持久化为XML数据。…

【煤矿虚拟仿真体验】VR采煤机技能培训有效提高训练效果

在我们的社会中,能源是至关重要的。它是推动我们日常生活和工作的主要动力。然而,我们在获取这种能源的过程中,也带来了许多环境问题。煤矿开采是其中的一个重要部分,因此我们需要寻找更环保、更安全的方式来进行煤矿开采。VR&…

手把手教你用 Milvus 和 Towhee 搭建一个 AI 聊天机器人

作为向量数据库的佼佼者,Milvus 适用于各种需要借助高效和可扩展向量搜索功能的 AI 应用。 举个例子,如果想要搭建一个聊天机器人,Milvus 一定是其进行数据管理的首选。那么,如何让这个应用程序开发变得易于管理及更好理解&#x…

LeetCode算法二叉树—222. 完全二叉树的节点个数

目录 222. 完全二叉树的节点个数 - 力扣(LeetCode) 代码: 运行结果: 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能…

2023-09-28 monetdb-db,schema,user,role-分析

摘要: 对moentdb的database,schema,user,role和权限做分析, 以与mysql中的概念做对比分析. 备份: https://stoneatom.yuque.com/staff-ft8n1u/qfqtnb/gfqc62fozh0qsyqm 上下文相关: 2023-09-28 mysql-代号m-schema调研-文档记录-CSDN博客 2023-09-28 monetdb-databae的概念和…

湖南软件测评公司简析:软件功能测试和非功能测试的联系和区别

一、软件功能测试   软件功能测试旨在验证软件是否按照需求规格说明书的要求正常工作。具体而言,功能测试会对软件的所有功能进行测试,以确保其满足用户的需求和预期。在进行功能测试时,根据需求规格说明书编写测试用例,并在测试…

时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-BiLSTM鹈鹕算…