【 基于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.mfbz.cn/a/558534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony网络协议通信—libevent [GN编译] - 事件通知库

libevent主要是用C语言实现了事件通知的功能 下载安装 直接在OpenHarmony-SIG仓中搜索libevent并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 库代码存放路径:./third_party/libevent 修改添加依赖的编译脚本 在/developtools/bytrace_standard/…

Office文档在线预览-文档内容在线提取

文档提取功能,支持文档内容提取。包括提取文档中的所有文字内容,提取文档中的图片,提取文档音视频,提取文档中的统计及图表等。同时支持文档中公式的提取,文档大纲目录提取等功能。 支持以下文档格式进行内容提取&…

OSPGF高级实验综合

1.实验拓扑 二.实验要求 1、R4为ISP,其上只配置IP地址;R4与其他所直连设备间均使用公有IP; 2、R3-R5、R6、R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分;除了R12有两个环回&#x…

GPU深度学习环境搭建:Win10+CUDA 11.7+Pytorch1.13.1+Anaconda3+python3.10.9

1. 查看显卡驱动及对应cuda版本关系 1.1 显卡驱动和cuda版本信息查看方法 在命令行中输入【nvidia-smi】可以当前显卡驱动版本和cuda版本。 根据显示,显卡驱动版本为:Driver Version: 516.59,CUDA 的版本为:CUDA Version 11.7。 此处我们可以根据下面的表1 显卡驱动和c…

【论文阅读】用于遥感弱监督语义分割的对比标记和标签激活

【论文阅读】用于遥感弱监督语义分割的对比标记和标签激活 文章目录 【论文阅读】用于遥感弱监督语义分割的对比标记和标签激活一、介绍二、联系工作三、方法3.1 对比token学习模块(CTLM)3.2 Class token对比学习3.3 标签前景激活模块 四、实验结果 Cont…

java实现chatGPT SDK

搭建一个 ChatGPT-SDK 组件工程,专门用于封装对 OpenAI 接口的使用。由于 OpenAI 接口本身较多,并有各类配置的设置,所以开发一个共用的 SDK 组件,更合适我们在各类工程中扩展使用 整个流程为:以会话模型为出口&#x…

websocket 连接,http 协议下用 ws, https 协议下必须要使用 wss

解决方案: https 相当于使用 httpssl 认证,使用 https 时 websocket 访问(比如建立链接时)必须要使用 wss。 详细解释: WebSocket 协议有两个主要版本:“ws”和“wss”。"ws"表示非加密的 Web…

对EKS(AWS云k8s)启用AMP(AWS云Prometheus)监控+AMG(AWS云 grafana)

问题 需要在针对已有的EKS k8s集群启用Prometheus指标监控。而且,这里使用AMP即AWS云的Prometheus托管服务。好像这个服务,只有AWS国际云才有,AWS中国云没得这个托管服务。下面,我们就来尝试在已有的EKS集群上面启用AMP监控。 步…

Linux搭建Discuz论坛

搭建一个论坛 —接上篇博客 改名/etc/httpd/conf.d/vhosts.conf 》/etc/httpd/conf.d/vhosts.conf.bak [rootlocalhost conf.d]# mv /etc/httpd/conf.d/vhosts.conf /etc/httpd/conf.d/vhosts.conf.bak此时的vhosts.conf是一个新创建的文件,之前的vhosts.conf已经…

代码+视频,R语言对数据进行多重插补后回归分析

我们在临床做回顾性研究分析中经常要面对数据缺失的问题,如果数据缺失量大就会对我们的研究结果产生影响,近年来,对数据进行多重插补广泛应用于SCI论文中。我们在之前的文章中已经演示了使用SPSS对数据进行多重插补并分析。今天,我…

【C语言】Dijkstra算法详解

一、引言二、Dijkstra算法原理三、Dijkstra算法的C语言实现四、Dijkstra算法的应用场景五、总结 一、引言 Dijkstra算法是一种著名的图论算法,用于解决单源最短路径问题。它是由荷兰计算机科学家Edsger W. Dijkstra在1956年提出的。本文将详细介绍Dijkstra算法的原理…

数仓建模—逻辑数据模型

数仓建模—逻辑数据模型 数据模型是数据元素及其基于现实世界对象之间的关系的可视化表示。数据模型揭示并定义数据在业务流程中的连接方式,并支持创建高效的信息系统或应用程序。例如,在商业智能中,数据模型定义用户可以在其分析中使用哪种数据。 逻辑数据模型 (LDM Logi…

qt设置TextEdit的提示性文字

提示性文字,就是用户在输入的时候自动消失的那种 比如: 可以这样设置: lineEdit->setPlaceholderText("我是提示性文字"); 但是我们觉的这样有点难看,可以用以下QSS来调整: 调整提示性文字的位置&…

【MATLAB源码-第193期】基于matlab的网络覆盖率NOA优化算法仿真对比VFINOA,VFPSO,VFNGO,VFWOA等算法。

操作环境: MATLAB 2022a 1、算法描述 NOA(Network Optimization Algorithm,网络优化算法)是一个针对网络覆盖率优化的算法,它主要通过优化网络中节点的分布和配置来提高网络的整体覆盖性能。网络覆盖率是衡量一个无…

【学习】软件压力测试对软件产品的作用

在信息化高速发展的今天,软件产品已经成为各行各业不可或缺的一部分。然而,随着软件功能的日益复杂和用户需求的不断增长,软件产品的稳定性和可靠性问题也愈发凸显。在这样的背景下,软件压力测试作为软件质量保障的重要手段之一&a…

weblogic反序列化漏洞(CVE-2017-10271)复现

直接用vuluhub搭建现成的靶场做 访问靶场 打开是这样表示成功 想反弹shell 就先开启kali1的nc监听,这就监听2233端口吧 linux:nc -l -p 2233 抓包修改为攻击数据包 ip和端口可以任意修改 反弹的shell 还可以写入文件shell 只需要把提供的poc POS…

机器学习鸢尾花各种模型准确率对比

流程 获取数据集导入需要的包读取数据划分训练集和测试集调用各种模型比较准确率 获取数据集 链接:https://pan.baidu.com/s/1RzZyXsaiJB3e611itF466Q?pwdj484 提取码:j484 --来自百度网盘超级会员V1的分享导入需要的包 import pandas as pd impo…

ASP.NET基于WEB的选课系统

摘要 设计本系统的目的是对选课信息进行管理。学生选课系统维护模块主要完成的是系统管理与维护功能。课题研究过程中,首先对系统管理模块进行了详尽的需求分析,经分析得到系统管理模块主要完成如下的功能:用户基本信息、选课信息的录入,查看…

SpringBoot 配置 jedis 来连接redis

Maven依赖 首先配置 maven依赖,这个依赖,要结合自己的springboot 的版本去选, 如果想要看自己的springboot 版本 在 启动类中去 加入,这两行代码 String version SpringBootVersion.getVersion(); log.info("***SpringBo…

Node.js 基础学习

文章目录 1. Node.js1.1 是什么?1.2 作用 2. 命令行工具2.1 命令的结构2.2 常用命令 3. Node.js 注意点3.1 Node.js 中不能使用DOM 和BOM 的API3.2 Node.js 中顶级对象叫做global 4. Buffer4.1 Buffer 特点4.2 Buffer 创建方式4.3 Buffer 操作与注意点 5. 计算机基础…
最新文章