详解Java中的BIO、NIO、AIO
1、 详解Java中的BIO、NIO、AIO
1.1、引言
IO流是Java中比较难理解的一个知识点,但是IO流在实际的开发场景中经常会使用到,比如Dubbo底层就是NIO进行通讯。本文将介绍Java发展过程中出现的三种IO:BIO、NIO以及AIO,重点介绍NIO。
1.2、什么是BIO
BIO即同步阻塞IO,实现模型为一个连接就需要一个线程去处理。这种方式简单来说就是当有客户端来请求服务器时,服务器就会开启一个线程去处理这个请求,即使这个请求不干任何事情,这个线程都一直处于阻塞状态。
BIO模型有很多缺点,最大的缺点就是资源的浪费。想象一下如果QQ使用BIO模型,当有一个人上线时就需要一个线程,即使这个人不聊天,这个线程也一直被占用,那再多的服务器资源都不管用。
1.3、BIO代码实践
使用 BIO 模型编写一个服务器端,监听 6666 端口,当有客户端连接时,就启动一个线程与之通讯。
要求使用线程池机制改善,可以连接多个客户端.
服务器端可以接收客户端发送的数据(telnet 方式即可)。
代码演示:package com.atguigu.bio;import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class BIOServer {public static void main(String[] args) throws Exception {//线程池机制//思路//1. 创建一个线程池//2. 如果有客户端连接,就创建一个线程,与之通讯(单独写一个方法)ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();//创建ServerSocketServerSocket serverSocket = new ServerSocket(6666);System.out.println("服务器启动了");while (true) {System.out.println("线程信息 id =" + Thread.currentThread().getId() + " 名字=" + Thread.currentThread().getName());//监听,等待客户端连接System.out.println("等待连接....");final Socket socket = serverSocket.accept();System.out.println("连接到一个客户端");//就创建一个线程,与之通讯(单独写一个方法)newCachedThreadPool.execute(new Runnable() {public void run() { //我们重写//可以和客户端通讯handler(socket);}});}}//编写一个handler方法,和客户端通讯public static void handler(Socket socket) {try {System.out.println("线程信息 id =" + Thread.currentThread().getId() + " 名字=" + Thread.currentThread().getName());byte[] bytes = new byte[1024];//通过socket 获取输入流InputStream inputStream = socket.getInputStream();//循环的读取客户端发送的数据while (true) {System.out.println("线程信息 id =" + Thread.currentThread().getId() + " 名字=" + Thread.currentThread().getName());System.out.println("read....");int read = inputStream.read(bytes);if(read != -1) {System.out.println(new String(bytes, 0, read)); //输出客户端发送的数据} else {break;}}}catch (Exception e) {e.printStackTrace();}finally {System.out.println("关闭和client的连接");try {socket.close();}catch (Exception e) {e.printStackTrace();}}}
}
演示
快捷键win+R打开cmd窗口,根据上面代码拼写6666端口
输入 telnet 127.0.0.1 6666
进入黑窗口
输入ctrl+]
向服务端发送文本
send hello world
服务端接收的
当有
多个cmd窗口时,则创建多一个线程与之对应
退出时,cmd输入
quit
服务端显示
2、什么是NIO
BIO是阻塞的,如果没有多线程,BIO就需要一直占用CPU,而NIO则是非阻塞IO,NIO在获取连接或者请求时,即使没有取得连接和数据,也不会阻塞程序。NIO的服务器实现模式为一个线程可以处理多个请求(连接)。
NIO有几个知识点需要掌握,Channel(通道),Buffer(缓冲区), Selector(多路复用选择器)。
Channel既可以用来进行读操作,又可以用来进行写操作。NIO中常用的Channel有FileChannel
、SocketChannel、ServerSocketChannel、DatagramChannel。
Buffer缓冲区用来发送和接受数据。
Selector 一般称为选择器或者多路复用器 。它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。在javaNIO中使用Selector往往是将Channel注册到Selector中。
下面我通过代码的方式模拟javaNIO的运行流程。
2.1、NIO代码实践
首先贴上NIO的实践代码:
NIO服务端详细的执行过程是这样的:
创建一个ServerSocketChannel和Selector,然后将ServerSocketChannel注册到Selector上
Selector通过select方法去轮询监听channel事件,如果有客户端要连接时,监听到连接事件。
通过channel方法将socketchannel绑定到ServerSocketChannel上,绑定通过SelectorKey实现。
socketchannel注册到Selector上,关心读事件。
Selector通过select方法去轮询监听channel事件,当监听到有读事件时,ServerSocketChannel通过绑定的SelectorKey定位到具体的channel,读取里面的数据。
public class NioServer {public static void main(String[] args) throws IOException {//创建一个socket通道,并且设置为非阻塞的方式ServerSocketChannel serverSocketChannel=ServerSocketChannel.open();serverSocketChannel.configureBlocking(false);serverSocketChannel.socket().bind(new InetSocketAddress(9000));//创建一个selector选择器,把channel注册到selector选择器上Selector selector=Selector.open();serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);while (true){System.out.println("等待事件发生");selector.select();System.out.println("有事件发生了");Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();while (iterator.hasNext()){SelectionKey key = iterator.next();iterator.remove();handle(key);}}}private static void handle(SelectionKey key) throws IOException {if (key.isAcceptable()){System.out.println("连接事件发生");ServerSocketChannel serverSocketChannel= (ServerSocketChannel) key.channel();//创建客户端一侧的channel,并注册到selector上SocketChannel socketChannel = serverSocketChannel.accept();socketChannel.configureBlocking(false);socketChannel.register(key.selector(),SelectionKey.OP_READ);}else if (key.isReadable()){System.out.println("数据可读事件发生");SocketChannel socketChannel= (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int len = socketChannel.read(buffer);if (len!=-1){System.out.println("读取到客户端发送的数据:"+new String(buffer.array(),0,len));}//给客户端发送信息ByteBuffer wrap = ByteBuffer.wrap("hello world".getBytes());socketChannel.write(wrap);key.interestOps(SelectionKey.OP_READ|SelectionKey.OP_WRITE);socketChannel.close();}}
}
客户端代码:NIO客户端代码的实现比BIO复杂很多,主要的区别在于,NIO的客户端也需要去轮询自己和服务端的连接情况。
public class NioClient {public static void main(String[] args) throws IOException {//配置基本的连接参数SocketChannel channel=SocketChannel.open();channel.configureBlocking(false);Selector selector = Selector.open();channel.connect(new InetSocketAddress("127.0.0.1",9000));channel.register(selector, SelectionKey.OP_CONNECT);//轮询访问selectorwhile(true){selector.select();Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();while (iterator.hasNext()){SelectionKey key = iterator.next();iterator.remove();//连接事件发生if (key.isConnectable()){SocketChannel socketChannel= (SocketChannel) key.channel();//如果正在连接,则完成连接if (socketChannel.isConnectionPending()){socketChannel.finishConnect();}socketChannel.configureBlocking(false);ByteBuffer buffer = ByteBuffer.wrap("客户端发送的数据".getBytes());socketChannel.write(buffer);socketChannel.register(selector,SelectionKey.OP_READ);}else if (key.isReadable()){//读取服务端发送过来的消息read(key);}}}}private static void read(SelectionKey key) throws IOException {SocketChannel socketChannel= (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(512);int len=socketChannel.read(buffer);if (len!=-1){System.out.println("客户端收到信息:"+new String(buffer.array(),0,len));}}
}
效果大概是这样的:首先服务端等待事件发生,当客户端启动时,服务器端先接受到连接的请求,接着接受到数据读取的请求,读完数据后继续等待。
客户端发送数据后,获取到了来自服务端的回复。
2.2、NIO总结
NIO通过一个Selector,负责监听各种IO事件的发生,然后交给后端的线程去处理。NIO相比与BIO而言,非阻塞体现在轮询处理上。BIO后端线程需要阻塞等待客户端写数据,如果客户端不写数据就一直处于阻塞状态。而NIO通过Selector进行轮询已注册的客户端,当有事件发生时才会交给后端去处理,后端线程不需要等待。
3、什么是AIO
AIO是在JDK1.7中推出的新的IO方式–异步非阻塞IO,也被称为NIO2.0,AIO在进行读写操作时,直接调用API的read和write方法即可,这两种均是异步的方法,且完成后会主动调用回调函数。简单来讲,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。
Java提供了四个异步通道:AsynchronousSocketChannel、AsynchronousServerSocketChannel、AsynchronousFileChannel、AsynchronousDatagramChannel。
3.1、AIO代码实践
服务器端代码:AIO的创建方式和NIO类似,先创建通道,再绑定,再监听。只不过AIO中使用了异步的通道。
public class AIOServer {public static void main(String[] args) {try {//创建异步通道AsynchronousServerSocketChannel serverSocketChannel=AsynchronousServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress(8080));System.out.println("等待连接中");//在AIO中,accept有两个参数,// 第一个参数是一个泛型,可以用来控制想传递的对象// 第二个参数CompletionHandler,用来处理监听成功和失败的逻辑// 如此设置监听的原因是因为这里的监听是一个类似于递归的操作,每次监听成功后要开启下一个监听serverSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {//请求成功处理逻辑@Overridepublic void completed(AsynchronousSocketChannel result, Object attachment) {System.out.println("连接成功,处理数据中");//开启新的监听serverSocketChannel.accept(null,this);handledata(result);}@Overridepublic void failed(Throwable exc, Object attachment) {System.out.println("失败");}});try {TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);} catch (InterruptedException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();}}private static void handledata(AsynchronousSocketChannel result) {ByteBuffer byteBuffer=ByteBuffer.allocate(1024);//通道的read方法也带有三个参数//1.目的地:处理客户端传递数据的中转缓存,可以不使用//2.处理客户端传递数据的对象//3.处理逻辑,也有成功和不成功的两个写法result.read(byteBuffer, byteBuffer, new CompletionHandler<Integer, ByteBuffer>() {@Overridepublic void completed(Integer result, ByteBuffer attachment) {if (result>0){attachment.flip();byte[] array = attachment.array();System.out.println(new String(array));}}@Overridepublic void failed(Throwable exc, ByteBuffer attachment) {System.out.println("失败");}});}
}
客户端代码基本上没有太多差别,主要还是实现数据的发送功能
public class AIOClient {public static void main(String[] args) {try {AsynchronousSocketChannel socketChannel=AsynchronousSocketChannel.open();socketChannel.connect(new InetSocketAddress("127.0.0.1",8080));Scanner scanner=new Scanner(System.in);String next = scanner.next();ByteBuffer byteBuffer=ByteBuffer.allocate(1024);byteBuffer.put(next.getBytes());byteBuffer.flip();socketChannel.write(byteBuffer);} catch (IOException e) {e.printStackTrace();}}
}
观察结果:
相关文章:
Mac读写U盘软件哪个好用 Mac读写U盘很慢怎么解决 macbookpro读取u盘
在使用Mac电脑时,读写U盘是一个常见的需求,特别是当U盘格式为NTFS时。选择适合的软件来实现这一操作至关重要。下面我们来看Mac读写U盘软件哪个好用,Mac读写U盘很慢怎么解决的相关内容。 一、Mac读写U盘软件哪个好用 在Mac上选择一款适合的…...
git的简单上传
一、git上传项目 1、git init 2、git add . 3、git status 4、链接地址 git remote add origin https://github.com/xxx.git 5、上传文件git pull --rebase origin master,再用git push origin master(仓库带Readme.md) git push -u origin master( GitHub上空仓库,没有Re…...
常用设计模式-单例模式
单例模式 (保证只有一个实例,并只提供一个访问实例的访问点) 单例模式的创建方式:饿汉模式-静态变量package com.pattern;//饿汉模式-静态变量 public class Singleton {// 类初始化时,会立即加载该对象,线程天生安全,调用效率高private static final Singleton singleton…...
图神经网络 | Pytorch图神经网络ST-GNN
时空图神经网络(Spatio-temporal Graph Neural Network)是一种用于处理时空数据的神经网络模型。它结合了图神经网络(Graph Neural Network)和时空数据的特性,能够对时空关系进行建模和预测。 在时空图神经网络中,数据被组织成图的形式,其中节点表示特定的时空位置,边…...
javaEE初阶——多线程(九)——JUC常见的类以及线程安全的集合类
T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享多线程专题的最后一篇文章:关于JUC常见的类以及线程安全的集合类 如果有不足的或者错误的请您指出! 目录 3.JUC(java.util.concurrent)常见的类3.1Callable接口3.2 RentrantLoc…...
练习-字符串逆序统计
需求 完成字符串的逆序以及统计 设计一个程序,要求只能输入长度低于31的字符串,否则提示用户重新输入 打印如下内容: 您输入的字符串:abcabc 长度:6 逆序后为:cbacba 字符统计结果:{a: 2, b: 2, c: 2} 分析 1. 输入字符串(while循环) 2. 字符串长度小…...
详解Java中的BIO、NIO、AIO
1、 详解Java中的BIO、NIO、AIO 1.1、引言 IO流是Java中比较难理解的一个知识点,但是IO流在实际的开发场景中经常会使用到,比如Dubbo底层就是NIO进行通讯。本文将介绍Java发展过程中出现的三种IO:BIO、NIO以及AIO,重点介绍NIO。…...
【论文精读】KD-MVS
今天读的是发表在ECCV2022上的自监督MVS文章,作者来自于旷视科技和清华大学。 文章链接:arxiv 代码链接:https://github.com/megvii-research/KD-MVS 目录Abstract1. Introduction2. Related work3. Methodology3.1 Self-supervised Teacher …...
RabbitMQ-客户端源码之AMQCommand
AMQCommand不是直接包含Method等成员变量的,而是通过CommandAssembler又做了一次封装。 接下来先看下CommandAssembler类。此类中有这些成员变量: /** Current state, used to decide how to handle each incoming frame. */ private enum CAState {EXP…...
灵性和城府不能共处吗?
灵性足够强大,不需要城府。 因为世界本是幻境,你自身的灵性,可以改变周围的环境。 所谓心想事成。 一个天真善良的世界,和一个污浊混沌的世界,是不兼容的。 显化出的实相也会矛盾。 在一个没有谎言的地方,城…...
基于android的网络选课系统
需求信息: 1.实现角色划分管理功能,角色分为超级管理员,教务工作人员,教师,学生; 2.用户输入用户名密码,登录本系统,如忘记密码通过邮箱验证设置新密码; 3.学生ÿ…...
Python数据可视化(二)使用统计函数绘制简单图形
该文会讲解一些大家比较熟悉却又经常混淆的统计图形,掌握这些统计图形可以对数据可视化有一个深入理解,并正确使用。2.1 函数 bar()——用于绘制柱状图函数功能:在 x 轴上绘制定性数据的分布特征。调用签名:plt.bar(x,y)。参数说明…...
nodejs+vue高校网上报名系统
本课题利用nodejsVue设计实现网上报名系统。系统的主要功能是:用户在线注册信息之后,利用注册时填写的用户账号与密码,登入系统后,对注册的个人信息进行修改,在线报名,能正确的提交有送报考的基本信息&…...
阿里“云开发“小程序(uniCloud)
博主ps: 网上资料少的可怜,哎,腾讯云涨价了,论服务器,我肯定选的阿里,再着你们对比下uniCloud的报价就知道了,如果有钱就另当别论了。 所以这片博文,博主试过之后,先抛出…...
随笔集1.24
秋夜独坐经常性会出现啥都不想干的情况,似那黄鹤一去不复返,只留下脑海的白云千载空悠,对任何事情,读书、研究、游戏都提不起兴趣,每当此时静坐于窗下灯前,想起王摩诘所谓雨中山果落,灯下草虫鸣…...
Linux C编程一站式学习笔记6
Linux C编程一站式学习笔记 chap6 循环结构 文章目录Linux C编程一站式学习笔记 chap6 循环结构一.while语句递归 VS 循环函数式编程(Functional Programming) & 命令式编程(Imperative Programming)无限递归 & 无限循环习…...
每日学术速递1.26
CV - 计算机视觉 今天带来的是北航IRIP实验室被国际人工智能联合会议IJCAI-ECAI 2022接收的3篇论文。 IJCAI 是人工智能领域中最主要的学术会议之一,原为单数年召开,自2015年起改为每年召开,本次IJCAI与ECAI一起召开。IJCAI官网显示…...
【教程】Python实时检测CPU和GPU的功耗
目录 前言 GPU功耗检测方法 CPU功耗检测方法 sudo的困扰与解决 完整功耗分析示例代码 转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 前言 相关一些检测工具挺多的,比如powertop、powerstat、s-tui等。但如何通过代码的方式来实时检测…...
ESP32设备驱动-MCP4725数模转换器驱动
MCP4725数模转换器驱动 1、MCP4725介绍 MCP4725 是一款单通道、12 位、电压输出数模转换器,具有集成 EEPROM 和 I2C 兼容串行接口。MCP4725有如下特性: 12 位分辨率板载非易失性存储器 (EEPROM)0.2 LSB DNL(典型值)外部 A0 地址引脚正常或掉电模式6s(典型值)的快速建立…...
电商项目之同一笔单多次收款成功
1 问题背景 有个收单系统(简称S系统),作用是收单,相当于支付渠道,能够作为第三方服务对接其他支付平台。电商系统(简称A系统)与S系统是隔离的。A系统发起支付请求给S系统,S系统包装一…...
Dubbo 源码分析 – SPI 机制
1.简介 SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口 加载实现类。正因此特性࿰…...
spring笔记下(AOP、事务管理)
一、AOP概述 1. AOP介绍 AOP(Aspect Oriented Programming):面向切面编程,一种编程范式,指导开发者如何组织程序结构,是oop的延续。(OOP面向对象编程) AOP作用:在不惊动原始设计的基础上为其进…...
Java基础语法——方法
目录 方法概述 方法定义及格式 方法重载 •方法重载概述 •方法重载特点 方法中基本数据类型和引用数据类型的传递 方法概述 ——假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹(植物大战僵尸)。发射炮弹的动作需要编写100行的代码&…...
逆序遍历List集合
1 问题手写一个程序,完成List集合对象的逆序遍历2 方法创建List接口的多态对象向创建好list集合添加元素使用hasPrevious方法。import java.util.ArrayList;import java.util.List;import java.util.ListIterator;public class TestList { public static void ma…...
RISC-V Directives
原始内容如下: RISC-V Directives The following table lists all available RISC-V specific directives. .align size-log-2 Align to the given boundary, with the size given as log2 the number of bytes to align to. .half value .word value .dword valu…...
Day870.全局锁和表锁 -MySQL实战
全局锁和表锁 Hi,我是阿昌,今天学习记录的是关于全局锁和表锁的内容。 数据库锁设计的初衷是处理并发问题。 作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。锁就是用来实现这些访问规则的重…...
python语法 dot函数
dot是numpy里的函数,主要用于求向量相乘,矩阵乘法,矩阵与向量乘法一、一维向量相乘要求元素个数相同,相当于求内积,对应元素相乘再相加,“1*3 2*4 11”二、矩阵和矩阵相乘遵循矩阵乘法法则“左行 * 右列”…...
Java多线程与并发之线程同步[91]
Java多线程与并发之线程同步[91] 文章目录Java多线程与并发之线程同步[91]一、线程同步概念二、代码演示三.小结一、线程同步概念 线程同步:同步会牺牲性能,加强安全 1.多线程共享数据时,会发生数据不安全情况; 2.多线程共享数据时,必须使用同步; 线程同步三种操作: 1.同步代码…...
C语言基础知识(42)
数组作为函数参数数组可以由整个数组当作函数的参数,也可以由数组中的某个元素当作函数的参数:整个数组当作函数参数,即把数组名称传入函数中数组中的元素当作函数参数,即把数组中的参数传入函数中数组作为函数参数时注意以下事项…...
嵌入式复习题(三)判断题
1.Contex-M3系列处理器内核采用了冯诺依曼结构的三级流水线。( ) 2.STM32系列MCU在使用电池供电时,提供3.3~5V的低电压工作能力。( ) 3.stm3210xx的固件库中,RCC_DeInit函数是将RCC寄存器重新设置为…...
Qt基础之二十三:反射(Reflection)
反射是指程序在运行时动态获取对象属性与方法的一种机制,即编译器需要将类型信息(属性类型与偏移地址以及成员函数的地址等信息)编译到程序文件中,当程序运行时将这些信息加载到内存中去,做到运行时只根据对象的地址或引用就可以获取到对象的类型信息,从而利用这些信息达到…...
AD采集之离散化概念(Quantizer模型使用介绍)
模拟量采集的PLC程序和功能块算法,可以参看下面的文章链接: PLC模拟量采集算法数学基础(线性传感器)_RXXW_Dor的博客-CSDN博客_模拟量采集线性校准模拟量采集库如何设计,具体算法代码请参看我的另一篇博文:PLC模拟量输入 模拟量转换FC:S_ITR_RXXW_BOSS的博客-CSDN博客_…...
【学习笔记】线性递推数列
1.11.11.1 定义:对于无限数列{a0,a1,a2,...}\{a_0,a_1,a_2,...\}{a0,a1,a2,...}和有限非空数列{r0,r1,r2,...,rm−1}\{r_0,r_1,r_2,...,r_{m-1}\}{r0,r1,r2,...,rm−1},若对于任意p≥m−1p\ge m-1p≥m−1,有∑k0m−1ap−krk0\s…...
第一次找工作/实习前需要准备的东西(互联网行业)
文章目录一、简历二、笔试三、面试四、offer选择五、投递途径一、简历 详细模板之类的网上一搜都很多,各种网站,在线的,word的,latex的都可以。 主要讲几个个人感觉写的时候需要关注一下的点。 1、个人信息 让hr联系到你&#x…...
【二叉树】java实现代码,详解二叉树,带大家更深刻的掌握二叉树递归思想
前言: 大家好,我是良辰丫🪐🪐🪐,在探索数据结构的旅程中,二叉树可以说是数据结构中的重点,笔试面试经常出现的问题,同时也是难点。🐥🐥Ǵ…...
【论文翻译】Jointformer :一种基于误差预测和改进的三维人体姿态估计的单帧提升变压器
摘要 单目三维人体姿态估计技术有望极大地提高人体运动数据的可用性。表现最好的单幅图像2D3D提升模型使用图卷积网络(GCNs),通常需要一些手动输入来定义不同身体关节之间的关系。我们提出了一种新的基于变压器的方法,该方法使用更广泛的自我注意机制来…...
Linux用户管理
✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Java案例分…...
第四十六章 动态规划——状态机模型
第四十六章 动态规划——状态机模型一、通俗理解状态机DP1、什么是状态机2、什么是状态机DP二、例题1、AcWing 1049. 大盗阿福(1)问题(2)分析a.状态定义b.状态转移c.循环设计d.初末状态(3)代码2、AcWing 10…...
Idea中指定xml文件失效
目录一、🐇 项目场景:二、🐇 问题描述三、🐇 原因分析:四、🐇 解决方案:一、🐇 项目场景: 最近狮子在搞一个项目,需要用到数据库多表查询,所以在…...
【华为上机真题】工号不够用咋办
🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…...
【蓝桥云课】大整数相加与相乘——字符串模拟
一、大整数相加 思路分析: 输入两个整数a1456、b789,输出两个整数相加的结果。 ①将两个整数翻转 个位十位百位千位a6541b9870 ②相加计算,逢十进一 a0b06915a_0b_06915a0b06915(进1留5) a1b158114a_1b_158114a…...
泊松过程与排队论
全国同理:随机过程随机会过 ......唉 你说热统,他为什么要搭配着随机过程一起学 ......唉 你说数模比赛 为什么不能白送一个奖牌小摘要泊松过程泊松过程来到间隔与等待时间的分布来到时刻的条件分布M/G/1 忙期非齐次泊松过程复合泊松过程条件泊松过程排队系统输入常见的输入分布…...
告别3D-DNA试试chromap和yahs做Hi-C辅助组装吧
之前使用的是3D-DNA流程做Hi-C的辅助组装,它的最大优势就是输出结果可以对接下游的JBAT(juicerbox with Assembly Tools)进行手动矫正。然而它点缺陷也很明显,处理速度不够快,且对植物的优化不行,同时目前许久不更新了。 最近我发…...
Kettle(9):排序记录组件
1 组件介绍 排序组件可以将Kettle数据流中的数据进行排序,可以指定升序、还是降序排列 2 需求 使用Kettle将t_user表中的用户数据,按照年龄升序排序,并将排序后的数据装载到Excel 3 构建Kettle数据流图 效果图...
LVS+keepalived(双主)+Nginx实现高可用负载均衡
#为什么采用双主架构: 单主架构只有一个keepalived对外提供服务,该主机长期处于繁忙状态,而另一台主机却很空闲,利用率低下 #双主架构的优点: 即将两个或以上VIP分别运行在不同的keepalived服务器,以实现…...
力扣 2299. 强密码检验器 II
题目 如果一个密码满足以下所有条件,我们称它是一个 强 密码: 它有至少 8 个字符。 至少包含 一个小写英文 字母。 至少包含 一个大写英文 字母。 至少包含 一个数字 。 至少包含 一个特殊字符 。特殊字符为:“!#$%^&*()-” 中的一个。…...
[GWCTF 2019]枯燥的抽奖
目录 信息收集 知识回顾 解题思路 信息收集 查看源码,发现check.php <?php #这不是抽奖程序的源代码!不许看! header("Content-Type: text/html;charsetutf-8"); session_start(); if(!isset($_SESSION[seed])){ $_SESSIO…...
初入职场的我认识到linux的重要性
先自我介绍下,我是一名普通的软件工程专业的本科毕业生,今年刚毕业,软件工程的课程超级多,有程序设计基础、面向对象程序设计、软件工程导论、离散结构、数据结构与算法、计算机系统基础、操作系统、数据库概论、网络及其计算等等…...
数据库系统概述
文章目录一、数据、数据库、数据库管理系统、数据库系统1.数据2.数据库(DB)3.数据库管理系统(DBMS)1)数据定义2)数据组织、存储和管理3)数据操纵4)事务管理和运行管理5)数…...
【算法基础】快速排序(分治思想)
一、快速排序原理 1. 算法介绍 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: (1)首先设定一个分界值,通过该分界值将数组分成左右两部分。(记左端为L,最右端为R) 分界点的选取有如下四种方法:(1)q[L];(2)q[(L+R)/2];(3)q[R];(4)随机选取 (2)…...
JavaEE-初识网络
目录一、局域网二、广域网三、网络通信基础3.1 IP地址3.2 端口号3.3 协议四、协议分层五、封装和分用一、局域网 局域网,网络种类,覆盖范围一般是方圆几千米之内,其具备的安装便捷、成本节约、扩展方便等特点使其在各类办公室内运用广泛。局…...
【23】C语言 | 初阶结构体
目录 1、结构的基础知识 2、结构成员的类型 3、结构体初始化 4、结构体的访问 5、结构体传参 1、结构的基础知识 结构是这些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量 数组:一组相同类型的元素的集合 结构体:也是…...
【笔记】SemGCN
一. 论文总结 1.1 核心贡献 提出了一种改进的图卷积操作,称为语义图卷积(SemGConv),它源自cnn。其关键思想是学习图中暗示的边的信道权值,然后将它们与核矩阵结合起来。这大大提高了图卷积的能力。其次,我们引入了SemGCN&#x…...
Python机器学习:一元回归
→\rightarrow→回归效果评价 🌕 一元回归 一元回归主要研究一个自变量和一个因变量之间的关系,而这个自变量和因变量之间的关系又可分为线性回归和非线性回归。 ⭐️ 一元线性回归分析两个变量之间的线性关系,如ykxbykxbykxb中xxx和yyy就是…...
四轮两驱小车(三):STM32驱动MPU6050进行转弯
前言: 寒假已经过了一半了,前段时间跟学弟一起从零开始搞了一下深度学习,现在才想起来这个系列还没有更完。本篇博客主要介绍一下这个小车转直角弯的神器----MPU6050 MPU6050介绍: 我所采用的MPU6050是某宝上十几块钱的这种&…...
C++:类的static成员,友元和构造函数初始化列表
目录 一.类的构造函数的初始化列表 1.类的构造函数初始化列表的引入和介绍 2.初始化列表用于类的类对象成员的拷贝构造函数的调用 3.初始化列表的使用细则 4.使用初始化列表的一个注意事项 二.explicit关键字 三.C类的static成员 1.类中static修饰的成员变量 2.类中st…...
Ventus(承影):基于RISC V的开源GPGPU
Ventus(承影):基于RVV的开源GPGPU 清华大学集成电路学院dsp-lab的承影RVV GPGPU设计文档。 整体目标 提供一个开源的基于RVV的GPGPU实现方案,并给出软件映射方案、指令集(支持的指令及特性、添加的自定义指令…...
很多事情不是有意义了才做,而是因为做了才有意义
引言 我们常常陷入一个误区,认为只有当一件事情被普遍认为有意义时,我们才会去做。然而,真正的意义往往来源于行动本身。本文将探讨如何通过行动来发现和创造个人生活和工作的意义,以及如何通过日常行为来确定自己的人生方向。 …...
树莓派学习笔记--树莓派终端基本操作与系统备份(全卡备份,压缩备份)
树莓派终端基本操作 sudo su #切换为超级用户身份 su lyh #切换回普通用户lyh(用户名)#目录切换命令 pwd #显示当前所在目录 cd ~ #切换到主目录(/home/用户名),~也可省略不写 cd dir …...
成长工作思考
前言 这一篇,不是技术博客,而是个人发展的一些思考和总结,复盘才会做的更好,成长的道路当然不是随着时间推移 开场白 不劳而获的是时间,完全免费的,但是免费的同时也是最贵的。向前看仿佛时间悠悠无边&a…...
分析和比较深度学习框架 PyTorch 和 Tensorflow
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 深度学习作为人工智能的一个重要分支,在过去十年中取得了显著的进展。PyTorch 和 TensorFlow 是目前最受欢迎、最强大的两个深度学习框架,它们各自拥有独特的特点和优势。 1. Py…...
设计模式(六):原型模式
设计模式(六):原型模式 1. 原型模式的介绍2. 原型模式的类图3. 原型模式的实现3.1 创建一个原型接口3.2 创建具体原型3.3 创建一个数据缓存类3.4 测试 1. 原型模式的介绍 原型模式(Prototype Pattern)属于创建型模式&…...