【 基于Netty实现聊天室聊天业务学习】第4节.什么是BIO与NIO

-w774

IO在读写的时候是阻塞的,无法做其他操作,并发处理能力的非常低,线程之间访问资源通信时候也是非常耗时久,依赖我们的网速,带宽。

我们看一下他的白话原理

我们来看一下这张图那么这张图的话它里面有一个server还有三个客户端那么客户端的话它可以有很多,那么我们的服务器server其实它会有一个专门的线程称之为accept or它是专门来负责监听和客户端之间的请求,那么只要有client只要有我们的客户端和我们的服务端建立一个请求那么这个时候我们的服务端和我们的客户端呢他们之间都会创建一个新的线程来进行处理,那么这其实是一种非常典型的一应一答的模式那么如果说我们在这个时候客户端的数量会非常多的时候逐渐增多的时候那么我们在这个时候我们的server和我们的client之间,它会频繁的创建和频繁的销毁相应的线程,那么这个时候呢我们的服务器会有很大的一个压力,甚至会导致我们的服务器崩溃,那么所以说这种方式呢是啊非常老的一种l流的处理方式,那么所以说啊在后续的一段时间呢它会进行了一段改良,那么改良之后那么它就不是通过额外的新增线程了,那么它就是会创建一个线程池,那么通过线程池来进行我们的处理那么这个时候这种方式呢其实也可以称之为是一种伪异步lo,我们来举一个例子啊,呃如果说啊打个比方我现在去上厕所那么厕所的坑呢全部都已经满了那么这个时候我就一直在等着啊我什么事情都不干我就在那边光等着我会主动的观察啊注意啊我说的是主动两个字,我会主动的观察啊哪一个坑好了那么只要有坑位释放了我我这个时候就立马去站开那么其实这个就是一种啊我们生活中的一种实例通过这个实例我们可以去理解这是一种同步阻塞的l0

-w838

我们看一下他的白话原理

现在我去上厕所那么厕所的坑呢全满了这个时候我不会像之前那样,我会呢啊跑出去啊抽根烟啊或者说拿出手机来摇一摇这个时候你会发现我并不是光在那边等着了吧,对吧然后呢这个时候我会啊时不时再主动的回到厕所去看一下看一看有没有坑释放如果说有释放了那么这个时候我再去占一个坑,可以看得出来我现在呢不是在那边光等着而是我同时在做一些别的事情那么这个就是区别那么nio的话其实是在jdk 1.4之后所出现的啊,然后呢它有一些基本概念,比方说它有一个是selector它是一个选择器也称之为多路复用器另外呢还有buffer它是一个缓冲区,还有是一个channel是一个双向通道那么这些我们会结合我们的一个图例来进行一个阐述,我们来看一下这边呢我们会有一个server是我们的服务端另外还有三个客户端那么客户端其实是可以有很多我们在这里只会举三个,然后他们在这个地方去进行一个通信的时候那么首先我们就会使用到一个selector,这一个selector它就是一个选择器你也可以称之为是一个多路复用器,它其实就是一个线程它这个线程会主动的轮询如果说我们的客户端和我们的server端要建立链接的时候那么其实就可以看到它其实是进行一个注册,那么注册完毕之后那么我们就会有一个channel one那么每一个客户端和我们的selector建立链接链接之后都会有一个channel,那么channel它是一个通道是一个双向通道它可以进行一些相应的数据的,读写那么这些数据的读写都会到我们的buffer缓冲区里面去,那么现在我们会有client二client三再和我们的selector去进行一个注册这个时候就会有channel二和channel三那么这个就是我们的一个nio的其实一个最基本的一张图示,通过使用channel注册到selector上之后呢其实就可以实现一种客户端和服务端的通讯方式了吧,那么channel中的数据啊我们之前也说了它的读取或者说是读写都是通过buffer,是一种非阻塞的读取那么如果说没有数据那么它会直接跳过它不会同步的在那边等着你有数据,然后我们的selector多路复用器呢它其实是一个单线程它的整整体来说啊它的这个线程的资源开销会非常的少,光这一个线程它就可以处理成千上万个客户端,那么客户端的增多不会去影响它的性能这个就是和我们一个之前所说bio所他们的之间的一个差别吧,另外我们再理解一下那么channel它相当于是一个读取的工具每一个客户端都可以理解为是一个单独的channel或者说每一个客户端当你在和我们的服务端,建立链接之后注册完毕之后就会有一个单独的channel它是一个一对一的,一个client就会有一个channel然后每一个服务端呢会有一个selector那么buffer里面的数据,会用于进行读写然后呢数据被读完之后它的这个数据啊其实还是会存在在我们的buffer里面的它不会因为我们的数据读取了之后那么我们的数据就消失,那么这个就是区别于stream那么我们的stream如果说我们去读啊读完之后我们的数据就没有了对吧然后我们的channel和我们的selector从我们这张图里面也可以看得出来它其实是啊可以说是一对多吧对吧一个selector,它可以去让多个client去进行注册然后呢它就会有多个channel可以理解为是一种一对多的这种方式那么这个就是一个nio它就是一个同步非阻塞的io

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

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

相关文章

【C++题解】1607. 两位数运算

问题:1607. 两位数运算 类型:基本运算、拆位求解 题目描述: 小丽在编程课上学会了拆位运算,她已经可以拆出一个两位整数的十位和个位了,她想知道这个整数的十位 / 个位的结果是多少,请编程帮她实现&#…

【问题处理】银河麒麟操作系统实例分享,adb读写缓慢问题分析

1.问题环境 处理器: HUAWEI Kunpeng 920 5251K 内存: 512 GiB 整机类型/架构: TaiShan 200K (Model 2280K) BIOS版本: Byosoft Corp. 1.81.K 内核版本 4.19.90-23.15.v2101.ky10.aarch64 第三方应用 数据库 2.问题…

深度学习--CNN应用--VGG16网络和ResNet18网络

前言 我们在学习这两个网络时,应先了解CNN网络的相关知识 深度学习--CNN卷积神经网络(附图)-CSDN博客 这篇博客能够帮我们更好的理解VGG16和RetNet18 1.VGG16 1.1 VGG简介 VGG论文网址:VGG论文 大家有兴趣的可以去研读一下…

pinpoint接入及接入tomcat

# 5、pinpoint接入 1、开启性能监控 应用管理详情页面-->【属性】编辑,勾选开启用性能监控 2.java命令行引用pinpoint和相关变量 java $JAVA_OPTS -javaagent:/usr/local/pinpoint-agent/pinpoint-bootstrap-1.7.2.jar -Dpinpoint.agentIddcs-repair-${HOSTNAME…

k8s集群安装网络插件calico常见问题

关于calico网络插件报错的常见问题处理 1.安装calico插件时,calico相关pod无法成功运行。 报错信息:“MountVolume.SetUp failed for volume "bpffs" : hostPath type check failed: /sys/fs/bpf is not a directory”解决办法:检…

互联网摸鱼日报(2024-04-19)

互联网摸鱼日报(2024-04-19) 36氪新闻 魏建军把方向盘交给AI,长城汽车开卷智能驾驶 一季度我国工业经济保持较快增长,下一步这么做 晶华光学北交所IPO问询分析:利润下滑和存货计提是否充分或成公司能否上会的关键性问题 这10 本改变人生的…

【智能算法】鸡群优化算法(CSO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2014年,X Meng等人受到鸡群社会行为启发,提出了鸡群优化算法(Chicken Swarm Optimization, CSO)。 2.算法原理 2.1算法思想 CSO算法的思想是基于对…

数仓建模—物理数据模型

数仓建模—物理数据模型 前面我们讲了数据模型和逻辑数据模型,你可以参考前面的文章,这一节我们介绍一下物理数据模型 数仓建模—数据模型 数仓建模—逻辑数据模型 什么是物理数据模型 物理数据模型指定如何在数据库中构建数据模型。它概述了所有表结构,包括列名、数据类…

润开鸿与蚂蚁数科达成战略合作,发布基于鸿蒙的mPaaS移动应用开发产品

4月18日,江苏润和软件股份有限公司(以下简称“润和软件”) 旗下专注鸿蒙方向的专业技术公司及终端操作系统发行版厂商江苏润开鸿数字科技有限公司(以下简称“润开鸿”)与蚂蚁数科举行战略合作签约仪式,并发…

【Java开发指南 | 第十六篇】Java数组及Arrays类

读者可订阅专栏:Java开发指南 |【CSDN秋说】 文章目录 数组数组特点创建数组处理数组多维数组Arrays类 数组 Java中的数组是一种用来存储固定大小的相同类型元素的数据结构。 数组特点 数组具有以下特点: 1、固定大小: 一旦数组被创建,其…

系统调优助手,PyTorch Profiler TensorBoard 插件教程

0x1. 前言 使用PyTorch Profiler进行性能分析已经一段时间了,毕竟是PyTorch提供的原生profile工具,个人感觉做系统性能分析时感觉比Nsys更方便一些,并且画的图也比较直观。这里翻译一下PyTorch Profiler TensorBoard Plugin的教程并分享一些…

Sui在Basecamp 2024上重塑区块链行业

Sui主网于去年推出,世界各地的社区活动帮助开发者了解了这一开创性的区块链技术的潜力,而Sui Basecamp表明Sui时代已经到来。 来自65个国家的超过1100人参加了今年在巴黎举办的Sui全球活动,以了解Sui在游戏和DeFi领域的坚实立足点。在两天的…

js DOM模型常用方法复盘梳理

大家好,我是资深前端之路,今天主要是在对常用的js基础知识进行复盘,回顾下最基础的知识,不断打地基。今天主要回顾的知识是以下几个内容: 1、什么是DOM 定义:文档对象模型,操作html标签的能力&…

什么是XXE攻击?如何进行防护

安全性很难做到正确,即使在当今具有安全意识的世界中,也存在一些严重的漏洞,例如 XML 外部实体 (XXE),它们被忽视并最终成为破坏的原因。 XML 外部实体 (XXE) 攻击是一种计算机安全漏洞,通常存在于 Web 应用程序中&…

单字符 和 宽字符

#define PI 3.14 //产生新类型 typedef 3.14 PI单字符,一个字节存储,宽字符,二个字节存储。sizeof(L"abc")8 size("abc")4typedef unsigned short wchar_t; chartypedef wchar_t WCHAR; typedef char CHAR;WCHAR* p …

SpringBoot 项目Docker部署三种方式

一种:直接拷贝jar到服务器部署 1.增加docker配置文件 新建Dockerfile文件,负责Docker的配置 FROM openjdk:21#ENV timezone RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo Asia/Shanghai >/etc/timezone# WORKD…

项目活动图

关键路径: 从开始到结束的所有路径中,时间最长的一条为关键路径。(特点:在关键路径上,所有任务的松弛时间都为0); 松弛时间: 最晚开始时间 – 最早开始时间; 所有的路…

解释Java中的容器化技术,如Docker和Kubernetes

容器化技术是近年来软件开发和运维领域的一项重大创新,它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,从而实现快速、一致和高效的部署。在Java开发中,Docker和Kubernetes是两种非常流行的容器化技术。 ### Docker Do…

2W 3KVDC 隔离单、双输出 DC/DC 电源模块——TPH 系列

TPH系列是一款2W,单、双输出隔离电源模块,特别适合板上只有一种电压而要求有正负电源的场合,工业级温度范围–40℃到105℃,在此温度范围内都可以稳定输出2W,并且效率非常高,高达86%,温升非常低&…

JavaSE进阶篇-面向对象程序设计

一、面向对象和面向过程的关系 1)面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做; 2)面向对象:强调了具备功能的对象,以类/对象为最小单位,考虑谁来做。 总结…