Java当中的BIO模型

news2024/11/15 13:37:07

我们知道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.coloradmin.cn/o/1048122.html

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

相关文章

unity生成模型预览图并导出图片

1、首先将模型打成预制体.prefab对象 2、放入指定文件夹 3、打开工具 4、不好使就多点一次 这样就会批量生成预制体图片了 Demo参见: GetbadEarlyup/unityPicDemo: 在unity中生成可导出缩略图的Demo工程 (github.com)https://github.com/GetbadEarlyup/unityPicDe…

天津口碑web前端培训机构 Web前端能干一辈子吗?

近年来,前端开发领域的就业市场呈现出蓬勃发展的态势。越来越多的公司和组织意识到用户体验的重要性,因此对前端开发人员的需求也随之增加。 学前端还是学后端 随着互联网的发展,前端和后端技术在招聘市场上都有很大的需求。学前端可以成为…

紧固螺栓的常见类型有哪些?

大螺丝、小螺丝 螺丝有各种各样的叫法。螺丝、小螺丝、螺栓、鋲螺、螺杆、螺子、小螺钉等。螺丝的大小、以现代的技术细的可以加工到1毫米以下。例如用于手表、计算机、手机等螺丝能加工到0.5毫米。粗的螺丝一般使用到50毫米,主要用于建筑、桥梁等。根据需要可加工…

【VUE复习·4】计算属性computed:原理、完整写法(不常用)、与 methods 的区别、简写(最常用)、应用案例!

总览 1.简介计算属性 2.computed 与 methods 的区别 3.computed 的简写(不修改计算属性,只显示) 4.经典应用场景 一、计算属性 1.为什么需要计算属性? 首先,如果我们要写一个插值语法,而 {{ }} 内的内容…

微信小程序 block 标签

今天在小程序开发中发现项目中出现了一个 block 作为一个小程序经验并不是特别多的我 显然触及到新大陆了 于是问了AI 在小程序中,block 元素用于包裹一组节点,类似于一个容器。它的作用是可以在页面中创建一个独立的作用域,方便对这组节点…

高光时刻丨极智嘉斩获2023中国物流与采购联合会科学技术一等奖

不久前,中国物流与采购联合会宣布了2022年度科学技术奖获奖名单,其中包括了一项令人瞩目的成就。这项成就源自于极智嘉与国药物流、南京医药、九州通医药以及多所高校的合作,他们共同努力,成功研究并应用了一项关键技术&#xff0…

上海再发区块链专项方案 和数集团欲打造新一代Web3.0创新生态

9月27日消息,上海市科学技术委员会印发《上海区块链关键技术攻关专项行动方案(2023-2025年)》的通知。 《行动方案》指出,专项行动要为上海市级区块链基础服务平台建设以及政务、跨境贸易、供应链、金融、元宇宙、数据要素流通等…

HTML5语义化标签解释说明

语义化:在HTML5中提供了一些,具备语义化的标签!他们通常用于去构造网页的各个部分! HTML5之前网页的组成和布局通常是使用p和SPAN来构建和布局整个网页的,这样做是常见的做法,但存在一个问题,以…

用户画像浅析

这篇文章主要和大家分享对于用户画像的认识,包括如何理解用户画像,为什么需要用户用画像,以及在建设和应用用户画像过程中总结的方法论,让大家了解如何构建好的用户画像。 1、用户画像定义 用户画像是根据用户社会属性、生活习惯…

采集SEO方法-添加关键词

采集大量的文章数据,要想批量做SEO添加关键词方法,可以使用简数采集器的处理规则实现。 添加关键词的SEO技巧: 1)注意关键词的密度和分布,不要过度堆砌或重复添加关键词; 2)分析需求和搜索习…

基于微信小程序的奶茶点餐小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

Stm32_标准库_GPIOA初始化

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

【excel密码】为什么工作表不能移动、复制了?

为什么excel文件打开之后,工作表里是可以编辑的,但是想要移动工作表或者复制、重命名等操作,这是什么原因?其实这是因为设置了工作簿保护,设置了保护的工作簿无法对整张工作表进行操作。 想要取消这种保护,…

Spring的依赖注入(DI)以及优缺点

Spring的依赖注入(DI):解释和优点 依赖注入(Dependency Injection,简称DI)是Spring框架的核心概念之一,也是现代Java应用程序开发的重要组成部分。本文将深入探讨DI是什么,以及它的…

讲讲项目里的仪表盘编辑器(二)

应用场景 正常来说,编辑器应用场景应该包括: 编辑器-预览 编辑器 最终运行时 怎么去设计 上一篇推文,我们已经大概了解了编辑器场景。接下来,我们来看预览时的设计 编辑器-预览 点击预览按钮,执行以…

电脑显示系统错误怎么办?

有时我们在开机时会发现电脑无法开机,并显示系统错误,那么这该怎么办呢?下面我们就一起来了解一下。 方法1. 替换SAM文件解决问题 1. 重启电脑并进入安全模式。 Win8/10系统:在启动电脑看到Windows标志时,长按电源键…

SD-WAN网络升级攻略:企业如何快速上手部署?

随着企业信息化的升级,传统网络架构已经无法满足企业复杂的、多样化的组网互联需求。 企业多样化的组网需求包括但不限于以下内容: 一是需要将各办公点互联起来进行数据传输、资源共享; 二是视频会议、ERP、OA、邮箱系统、云服务应用程序等…

分享一下微信优惠券怎么制作

微信优惠券是一种有效的营销工具,可以吸引用户关注、提升购买意愿、促进消费等。下面我们将介绍如何制作微信优惠券,以及相关的注意事项。 一、优惠券的制作 首先,需要在微信公众平台上注册账号并完成企业认证。然后,按照以下步骤…

【LeetCode热题100】--2.两数相加

2.两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数…

关键词搜索淘宝商品数据接口

关键词搜索淘宝商品数据接口(item_search)是淘宝开放业务的形式之一,接口平台与淘宝签订协议之后,通过合法渠道获取到淘宝的官方数据,然后将这些数据储存在接口的数据库当中,供开发者进行调用。企业接入淘宝…