网络通信、BIO、NIO

1. 涉及的网络基础知识

Socket:

操作系统提供的api,介于应用层和tcp/ip层之间的软件层,封装服务器客户端之间网络通信相关内容,方便调用

IO多路复用:

(I/O Multiplexing)是一种IO操作模式,它允许单个进程或线程同时处理多个输入输出(IO)操作。

怎么算一个连接:

tcp层中,客户端ip、客户端端口、服务器ip、服务器端口,这4个算一个连接。

通信接收流程:

3步:接收连接、读取数据、写入数据

服务器端接收连接、服务器端读取客户端发来的数据、服务器端写入客户端发来的数据并进行业务处理。

应用程序java在处理通信的两个前提:

1、客户端a与服务器b通信,a的数据到达b的操作系统的socket的缓冲区中。这时候java要如何接收并处理这些数据呢?java会调用操作系统提供的socket api进行操作。

2、如果很多客户端与服务器b通信,并发量上来了,java又如何管理和处理这么多的连接呢?java有BIO(Blocking I/O,阻塞IO)和NIO(no-blocking I/O,非阻塞)两种

2. Java NIO和BIO的区别

  1. 阻塞与非阻塞
    • BIO是同步阻塞的。当线程发起I/O请求时,如果没有数据可读或可写,线程会一直阻塞,直到数据准备就绪。
    • NIO是同步非阻塞的。线程发起I/O请求后,如果没有数据可读或可写,线程不会阻塞,而是可以去做其他事情。当数据准备就绪时,线程会被通知去处理数据。
  2. I/O模型
    • BIO是基于流的。数据被顺序地从一个流读取到另一个流,期间没有缓存,且不能前后移动流中的数据。
    • NIO是基于缓冲区的。数据被读取到一个缓冲区中,需要时可以在缓冲区中前后移动,增加了处理过程中的灵活性。
  3. 线程管理
    • BIO中,每个连接都需要一个独立的线程来处理。这种方式在连接数较少时可行,但在连接数较多时会导致线程数量过多,系统资源消耗大。
    • NIO中,一个线程可以处理多个连接。这是通过Selector和Channel实现的,Selector可以监听多个Channel上的事件,从而允许单个线程管理多个连接。这就是IO多路复用。
  4. 适用场景
    • BIO适用于连接数较少且固定的场景。
    • NIO适用于连接数多且连接时间较短的场景,如聊天服务器、弹幕系统等。它能够有效减少线程数量,降低系统资源消耗,提高并发处理能力。

3、BIO和NIO详解

如果服务器b上同时有多个连接,下面我称为连接1号、连接2号等。

  • 基础版本:java原生bio

流程:读取连接1号socket中的数据,如果数据没有准备好,或者遇到一些其他问题,就会阻塞,一直等到问题解决好。连接1号处理好后,开始处理连接2号,获取连接2号数据与业务处理。

缺点:阻塞,并发量小

 

  • 改进版:伪异步IO

725a8c9128824cdea0e688d0fb8671e9.png

f2ef6fb50c8142f29590c1bf3dcfc497.png

f3a9dc6548d74ba992897556e963bcc7.png

流程:acceptor+处理器。acceptor用来处理连接,处理器用来接收和处理数据。连接1号来了,acceptor就开一个新线程交给一个处理器a去获取连接1号socket数据并业务处理数据。接着acceptor给连接2号开个新线程,交给处理器b去接收并业务处理连接2号。这样连接1号和2号就同时处理了。

优点:并发量大,因为开了线程

缺点:如果并发量多,线程多,消耗多,可能内存爆掉,这点可以通过线程池来控制线程量。

但是因为处理器本身还是阻塞的,如果连接1号的数据没准备好,读取不了数据,这个时候处理器a会等待,也就是cpu在等待,cpu时间其实就浪费了,所以如果并发量很大,性能还是不高

 

  • 改进版:非阻塞IO

流程:如果连接1号的处理器的数据还没准备好,读取不了,这个时候cpu不等待,cpu可以先去处理其他的连接,这个就是不阻塞啦,cpu处理好其他连接,回来处理连接1号时,此时连接1号的数据准备好了,cpu就能顺利的接收连接1号的数据并进行业务处理。

缺点:这个是让cpu在所有处理器(连接1号、连接2号...)中做个轮询,但可能这次轮询到1号,发现1号还是没有准备好,所以还有没有更好的办法呢?

 

  • 改进版:原生jdk网络编程——NIO

3a6fee5fbdf14f68a1851a4e377c2864.png

1b9ae9847e604d2a9611da38d470a5b8.png

3d712a1955924dd3a48aba307b4f7c2e.png

1、Reactor反应器模式

就是一种倒转思维,由处理器主动发布信号

接着上边的讲。如果cpu轮询,发现1号还是没有准备好,那不是也浪费了cpu资源?

所有最好是1号准备好了,来叫我,这时候我cpu去处理就比较顺利。每个连接准备好了,给个信号,我cpu只去处理有这个信号的连接,这样就更快一点。这就是反应器模式!

2、三大组件:selector、channel、buffer

selector:

相当于cpu、acceptor,主要起到记录和调度作用。记录事件与channel的关系,从而帮助分配channel

channel:

相当于处理器。主要有两个

ServerSocketChannel:相当于acceptor,是一个可以监听TCP连接请求的通道。当服务器程序创建一个ServerSocketChannel并绑定到一个特定的端口后,它就开始监听该端口上的连接请求。需ServerSocketChannel本身并不直接“接收”连接,而是触发了一个“连接到达”的事件,即给个“有连接啦”的信号,告知一下

SocketChannel:相当于处理器。一个socketChannel处理一个连接,一个连接可能有多个socketChannel。主要是接收这个连接的数据,并调用业务代码处理数据。

buffer:

用于存储数据,channel从buffer中读写数据

3、服务器端流程:

接收连接

ServerSocketChannel去selector注册,关注OP_ACCEPT接收事件。ServerSocketChannel绑定8808端口,会监听tcp层8808端口,如果发现有连接到达,ServerSocketChannel会给信号,就是触发一个OP_ACCEPT接收事件。 

selector一直在轮询,查看注册下的channel中是否有事件触发,有的话就回去执行channel。这时候发现ServerSocketChannel触发注册时关注的OP_ACCEPT事件了,selector就调用ServerSocketChannel的accept()方法开始接收连接,ServerSocketChannel就会创建并返回一个SocketChannel,然后把这个SocketChannel注册到selector上,并写上关注OP_READ事件,然后ServerSocketChannel就接着去监听还有没有新的连接到来了。接收并处理这个连接的内容是由这个SocketChannel去做的。

处理连接数据

连接socket的数据准备好了,操作系统会更新数据状态,channel就会知道(因为channel的底层是socket),然后就会给出信号,触发一个OP_READ可读事件。

selector一直在轮询,查看注册下的channel中是否有事件触发,发现这个SocketChannel注册时关注的OP_READ事件触发了,就会调用SocketChannel的read()方法,执行相关操作。这个channel可以设置为非阻塞,非阻塞的话就是,如果出现问题,直接返回一个值。也可以设置为阻塞,阻塞的话,就是出现问题,一直等待。

4、理解

所以这里的cpu是selector,selector一直在轮询那些事件触发了(也就是准备好了的,大概率不会阻塞的)的channel,然后去执行channel,这样cpu就不会闲置,通过selector就能管理多个channel,即管理多个连接。而channel呢,就不是被动接受,而是主动告知selector,channel自己监控自己,当准备好了,就触发下事件,主动给告知selector。

优点:最大限度压榨cpu性能,让cpu不闲着

 

 

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

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

相关文章

Java | Leetcode Java题解之第221题最大正方形

题目: 题解: class Solution {public int maximalSquare(char[][] matrix) {int maxSide 0;if (matrix null || matrix.length 0 || matrix[0].length 0) {return maxSide;}int rows matrix.length, columns matrix[0].length;int[][] dp new in…

泰勒雷达图2

matplotlib绘制泰勒雷达图 import matplotlib.pyplot as plt import numpy as np from numpy.core.fromnumeric import shape import pandas as pd import dask.dataframe as dd from matplotlib.projections import PolarAxes import mpl_toolkits.axisartist.floating_axes a…

代码随想录day36

题目一 上边、左边初始化为1 采用求和进行dp运算 class Solution(object):def uniquePaths(self, m, n):""":type m: int:type n: int:rtype: int"""dp [[0]*n for _ in range(m)]for i in range(m):dp[i][0] 1for j in range(n):dp[0][j] 1…

python-课程满意度计算(赛氪OJ)

[题目描述] 某个班主任对学生们学习的的课程做了一个满意度调查,一共在班级内抽取了 N 个同学,对本学期的 M 种课程进行满意度调查。他想知道,有多少门课是被所有调查到的同学都喜欢的。输入格式: 第一行输入两个整数 N , M 。 接…

科普文:一文搞懂jvm实战(四)深入理解逃逸分析Escape Analysis

概叙 Java 中的对象是否都分配在堆内存中? 好了太抽象了,那具体一点,看看下面这个对象是在哪里分配内存? public void test() { Object object new Object(); }这个方法中的object对象,是在堆中分配内存么&#xff1…

利用python进行数据分析 —— python正则表达式(持续更新中!)

文章目录 利用python进行数据分析 —— python基础知识进阶重点笔记:正则表达式re.match 匹配开头re.search 全文匹配re.sub 替换删除re.compile 编译正则findall 返回列表finditer 返回迭代器re.split 分割返回列表(?P...) 分组匹配正则表达符号、修饰符通配符1 ^…

wordpress的restfull API使用教程,之如何用postman调试API,以便能使用vue等前端框架开发主题

文章目录 API开发手册在postman中调试这里以 post 一篇文章为例,讲解如何调试: 步骤 1:生成应用密码步骤 2:配置Postman步骤 3:创建文章 参考链接 API开发手册 官方API手册:https://developer.wordpress.o…

基于AWS Billing Conductor自定义账单计算进行【linker账单】RI/SP还原以及账单菜单栏选择性精细化限制策略设置

文章目录 一、客户需求需求① 设置策略屏蔽billing菜单选项查看需求② 账单RI和SP还原及SP和RI的共享 二、AWS Billing Conductor介绍三、IAM 精细操作映射参考四、详细步骤操作演示4.1 AWS Organization策略设置4.2 账单和成本管理设置4.3 AWS Billing Conductor设置4.3.1 创建…

文档图像处理:大模型的突破与新探索

前言 随着数字化时代的到来,文档图像处理技术在各行各业扮演着越来越重要的角色。在2023第十二届中国智能产业高峰论坛(CIIS 2023)的专题论坛上,合合信息智能技术平台事业部副总经理、高级工程师丁凯博士分享了当前文档图像处理面…

MSPM0G3507——时钟配置(与32关系)

先将32端时钟配置分为1,2,3如图 1是PSC左边未经分频的时钟源(HZ) 2是经过PSC分频的时钟信号(HZ) 3是最终的输出信号(HZ) 3输出的是一个定时器周期的HZ,可以转换成时间 …

ThreeJS-3D教学十五:ShaderMaterial(noise、random)

ThreeJS-3D教学十四:ShaderMaterial(length、fract、step) 上面这篇主要是操作 fragmentShader 片元着色器,实现对物体颜色的修改,这次咱们来看下修改 vertexShader 顶点着色器,这个其实就是位移各个顶点的位置。 接下来我们先介绍下 noise 噪声函数(Perlin Noise、Sim…

linux权限深度解析——探索原理

前言:本节内容主要讲述的是linux权限相关的内容, linux的权限如果使用root账号是感受不到的, 所以我们要使用普通账号对本节相关内容进行学习,以及一些实验的测试。 然后, 通过linux权限的学习我们可以知道为什么有时候…

第33讲:K8S集群StorageClass使用Ceph CSI供应商与Cephfs文件系统集成

文章目录 1.Ceph CSI供应商简介2.创建Cephfs文件系统为StorageCLass提供底层存储端2.1.创建Cephfs文件系统2.2.在Cephfs文件系统中为Storageclass创建子目录2.3.在Cephfs文件系统中创建一个子卷 3.在K8S集群中部署Cephfs-CSI供应商客户端3.1.下载Cephfs-CSI客户端的资源编排文件…

08.C2W3.Auto-complete and Language Models

往期文章请点这里 目录 N-Grams: OverviewN-grams and ProbabilitiesN-gramsSequence notationUnigram probabilityBigram probabilityTrigram ProbabilityN -gram probabilityQuiz Sequence ProbabilitiesProbability of a sequenceSequence probability shortcomingsApproxi…

Spring最早的源码

地址:Spring最早的源码

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

用Canvas绘制一个高可配置的圆形进度条

🚀 用Canvas绘制一个高可配置的圆形进度条 问题分析与拆解第一步,初始化一些默认参数,处理canvas模糊问题第二步,定义绘制函数1. 定义绘制主函数入口,该函数汇集了我们定义的其它绘制方法2. 定义绘制圆环函数3. 定义绘…

【跨境分享】中国商家如何卷到国外?电商独立站和电商平台的优势对比

为什么要选择独立站而不是电商平台 对于跨境电商经营者而言,采取多平台、多站点的运营策略是至关重要的战略布局。这一做法不仅有助于分散风险,避免将所有投资集中于单一市场,从而降低“所有鸡蛋置于同一篮子”的隐患,而且有利于拓…

最近换工作的一些启示,清华学姐篇

最近更新频率慢下来了,一部分原因是沉迷运动不能自拔,还有一部分原因是业余分出来很大的精力来拓展个人的边界,希望在工作之外取得一些成绩,写作上耽误了不少,很难做到日更。 所以整体上今年更新频率较低,但…

揭秘机器学习如何改变广告营销游戏规则

揭秘机器学习如何改变广告营销游戏规则 一、前言1.1 大数据时代的到来1.2 广告营销面临的挑战1.3 机器学习为广告营销带来的机遇 二、机器学习在广告营销中的应用2.1 了解消费者2.1.1 数据收集和分析2.1.2 行为模型的建立2.1.3 消费者画像的制作 2.2 定位广告投放人群2.2.1 人群…