当前位置: 首页 > article >正文

Java I/O终极指南:BIO, NIO, AIO深度剖析

  • BIO、NIO和AIO是计算机编程中涉及I/O(输入/输出)操作的三种不同模型,它们各自有着不同的特点和应用场景。

BIO、NIO和AIO详解

BIO(Blocking I/O)

BIO,即阻塞式I/O模型,是传统的I/O通信方式。在这种模型中,当线程执行输入输出操作时会被阻塞,直到数据准备就绪。这意味着每个连接需要独立的线程进行处理,如果连接数量较大,会导致线程资源消耗过多,从而影响系统性能。BIO模型适用于连接数较少且固定的场景。

NIO(Non-blocking I/O) 

NIO,也称为New I/O,是Java领域中的一种同步非阻塞的I/O模型。NIO引入了Channel(通道)和Buffer(缓冲区)的概念,使得一个线程可以处理多个连接。通过Selector(选择器)来实现多路复用,一个线程可以监听多个通道上的事件,从而减少线程开销。NIO模型避免了为每个连接分配一个线程的开销,大大提高了系统的并发能力,被广泛应用于大型应用服务器,特别是在需要解决高并发与大量连接、I/O处理问题的场景中。

 AIO(Asynchronous I/O)

AIO,即异步I/O模型,也称为NIO.2。在AIO模型中,进行I/O操作时,不需要等待数据就绪,而是通过回调的方式来处理数据。这意味着当I/O操作开始时,应用程序会立即继续执行,而不需要等待I/O操作完成。当I/O操作完成时,系统会通知相应的线程进行处理。AIO模型相比于NIO更适合处理大量并发连接,且不会阻塞线程,从而进一步提高了系统的并发能力和响应速度。

 总结

模型简称描述特性应用场景
阻塞式I/OBIO传统的I/O通信方式每个连接需要独立的线程,线程资源消耗大连接数较少且固定的场景
非阻塞式I/ONIO同步非阻塞的I/O模型引入Channel和Buffer概念,通过Selector实现多路复用,减少线程开销大型应用服务器,高并发与大量连接、I/O处理
异步I/OAIO异步I/O模型,也称为NIO.2不需要等待数据就绪,通过回调方式处理数据,不阻塞线程大量并发连接,需要进一步提高系统并发能力和响应速度的场景

IO模型的应用场景

BIO、NIO和AIO这三种I/O模型在计算机编程和网络通信中有广泛的应用,具体的应用场景如下:

BIO(Blocking I/O)

BIO模型主要适用于连接数较少且固定的场景。由于BIO是同步阻塞的,每个连接都需要一个独立的线程来处理,因此在连接数不多的情况下,BIO模型能够较好地工作,不会造成过多的线程开销。这种模型简单易懂,实现起来也相对容易。然而,在需要处理大量并发连接的场景中,BIO模型可能会因为线程资源耗尽而导致性能问题。

NIO(Non-blocking I/O)

NIO模型由于其同步非阻塞的特性,在需要处理大量并发连接的场景中表现出色。它广泛应用于网络编程和高性能服务器开发中,特别是那些需要处理大量并发网络连接请求的应用,如聊天服务器、即时通讯服务器、游戏服务器等。NIO通过引入Channel(通道)和Buffer(缓冲区)的概念,并使用Selector(选择器)来实现多路复用,从而允许一个线程同时处理多个连接,大大提高了系统的并发处理能力。此外,NIO还提供了对文件的高效读写操作,适用于需要处理大型文件的应用,如日志处理、文件传输等。

AIO(Asynchronous I/O)

AIO模型是异步非阻塞的,它进一步提高了系统的并发能力和响应速度。AIO适用于那些需要处理大量并发连接,且对响应时间有较高要求的应用场景。与NIO相比,AIO模型不需要在数据就绪时立即处理,而是通过回调的方式来处理数据,这样就不会阻塞线程,从而可以进一步提高系统的并发性能。然而,由于AIO模型的实现相对复杂,且在一些情况下可能不如NIO高效(特别是在网络延迟较低的情况下),因此它在实际应用中的普及程度可能不如NIO。

综上所述,BIO、NIO和AIO这三种I/O模型各有其适用的场景。在选择时,需要根据具体的应用需求、系统资源以及性能要求来进行综合考虑。随着技术的发展和应用的不断深入,这些模型也在不断演进和完善,以适应更加复杂和多样化的应用场景。

网络连接请求和请求/响应有区别

网络连接请求

定义


网络连接请求是一组命令,通过IP/TCP协议,向对方WEB服务器发出TCP连接建立请求。这个过程是网络通信的起始阶段,用于建立客户端与服务器之间的通信链路。

特点

  • 协议基础:基于IP/TCP协议进行。
  • 主动行为:由客户端发起,目的是与服务器建立连接。
  • 连接建立:当服务器有空且响应了连接请求后,客户端和服务器之间的连接才算建立成功。
  • 多次尝试:在网络条件不佳或服务器繁忙时,连接请求可能需要多次尝试才能成功。

请求响应

定义


请求响应是服务器在接收到客户端的请求后,对请求进行处理并将处理结果返回给客户端的过程。这个过程发生在网络连接已经建立之后。

特点

  • 被动行为:相对于客户端的请求而言,服务器是被动地响应请求。
  • 处理结果:服务器根据请求的内容进行相应的处理,并将处理结果作为响应返回给客户端。
  • 状态码:响应中通常包含HTTP状态码,用于表示请求的处理结果,如200表示成功,404表示未找到资源等。
  • 内容多样性:响应的内容可以是HTML页面、图片、JSON数据等多种类型,具体取决于请求的内容和服务器的配置。

区别

网络连接请求请求响应
定义通过IP/TCP协议,向对方WEB服务器发出TCP连接建立请求服务器对客户端请求的处理结果返回过程
发起者客户端服务器(对客户端请求的回应)
发生时机网络通信的起始阶段,用于建立连接网络连接建立之后,对请求的响应
内容TCP连接建立请求命令处理结果(可能包含HTML页面、图片、JSON数据等)及HTTP状态码
目的建立客户端与服务器之间的通信链路将处理结果告知客户端

一次网络连接可以进行几次请求和响应

一次网络连接可以进行几次请求和响应,主要取决于所使用的网络协议和连接类型。在HTTP协议中,网络连接的请求-响应次数可以分为短连接和长连接两种情况:

1. 短连接

  • 定义:在HTTP/1.0中,默认使用的是短连接。短连接指的是每次HTTP请求-响应交互都会建立一个新的TCP连接。
  • 请求-响应次数:对于短连接来说,每次TCP连接只能承载一次HTTP请求和相应的响应。一旦响应完成,连接就会立即关闭。因此,在短连接模式下,一次网络连接(即一个TCP连接)只能进行一次请求和响应。

2. 长连接(也称为持久连接或HTTP Keep-Alive)

  • 定义:长连接允许在同一TCP连接上进行多次HTTP请求-响应交互。这样,客户端和服务器之间的TCP连接在一段时间内保持打开状态,可以重复使用,而不必重复建立和关闭连接。
  • 请求-响应次数:在长连接模式下,一次网络连接(即一个TCP连接)可以承载多次HTTP请求和响应。客户端可以在一个TCP连接上连续发送多个请求,并接收相应的响应,直到连接被关闭或超时。

总结

  • 在短连接模式下,一次网络连接只能进行一次请求和响应。
  • 在长连接模式下,一次网络连接可以进行多次请求和响应,具体次数取决于连接保持的时间和客户端的请求频率。

值得注意的是,虽然长连接可以显著提高网络性能和效率,但也存在资源占用和管理复杂度增加的问题。因此,在实际应用中,需要根据具体场景和需求选择合适的连接类型。

什么是服务器

服务器(Server)是一种高性能的计算机设备或软件程序,它专门用于处理网络上的请求并提供相应的服务。服务器可以是硬件设备,也可以是运行在特定硬件上的软件程序,或者两者结合。在网络中,服务器扮演着中心节点或资源提供者的角色,为客户端(如计算机、手机、平板等设备)提供数据、文件、数据库访问、网页、应用程序、电子邮件、文件传输等服务。

服务器的主要特点包括:

  1. 高性能:服务器通常需要处理大量的并发请求和数据传输,因此它们通常配备有高性能的处理器、大容量的内存和快速的存储设备,以确保快速响应和高吞吐量。

  2. 高可靠性:服务器需要持续运行,以提供稳定的服务。因此,它们通常具有冗余的电源、硬盘、风扇等组件,以及备份和恢复机制,以确保在硬件故障时仍能提供服务。

  3. 可扩展性:随着业务的发展,对服务器的需求可能会增加。因此,服务器需要具有可扩展性,以便能够轻松地添加更多的处理器、内存、存储设备等资源。

  4. 可管理性:服务器需要易于管理,以便管理员可以轻松地监控服务器的状态、性能、安全性和配置。这通常通过远程管理工具和界面来实现。

  5. 安全性:服务器存储和处理大量的敏感数据,因此必须采取适当的安全措施来保护数据免受未经授权的访问、泄露和篡改。

服务器可以根据其提供的服务类型进行分类,如Web服务器(用于托管网站和应用程序)、数据库服务器(用于存储和管理数据库)、文件服务器(用于共享和存储文件)、邮件服务器(用于处理电子邮件)、应用服务器(用于运行企业级应用程序)等。此外,服务器还可以根据其架构进行分类,如塔式服务器、机架式服务器、刀片服务器等。

在云计算和虚拟化技术的推动下,服务器也变得越来越灵活和可扩展。现在,许多企业和组织都选择使用云服务提供商的虚拟服务器(也称为云服务器或虚拟机实例)来托管他们的应用程序和数据,这些虚拟服务器可以根据需要动态地调整资源分配,并提供高可用性和灾难恢复功能。

什么是tomcat

Tomcat 是一个开源的 Java Servlet 容器,用于在服务器上运行 Java Servlet 和 JavaServer Pages (JSP) 等 Java EE 规范中的 web 应用程序。它实现了 Java Servlet、JavaServer Pages (JSP)、Java Expression Language (EL) 和 Java WebSocket (JSR 356) 技术规范。Tomcat 主要由 Apache 软件基金会(Apache Software Foundation, ASF)开发和维护。

Tomcat 提供了 Web 服务器所需的功能,但它本身并不直接提供静态内容的服务(如 HTML 页面、图片等)。通常,Tomcat 会与 Apache HTTP Server 或 Nginx 等 Web 服务器结合使用,其中 Tomcat 处理 Java Servlet 和 JSP 页面,而 Web 服务器则处理静态内容并可能将请求转发给 Tomcat。

Tomcat 的核心组件包括:

  1. Catalina Servlet 容器:这是 Tomcat 的核心,负责处理 Servlet 和 JSP 页面。它管理 Servlet 的生命周期,包括加载、初始化、执行和销毁。

  2. Connector:Connector 组件负责接收来自客户端的请求,并将它们转发给适当的 Servlet 进行处理。Tomcat 支持多种协议,如 HTTP/1.1 和 AJP(Apache JServ Protocol),每种协议都有自己的 Connector 实现。

  3. Session Manager:管理用户的会话信息。当用户与 Web 应用程序交互时,Tomcat 会创建会话来跟踪用户的状态。

  4. JSP Engine:JSP 引擎负责将 JSP 页面转换为 Servlet,并编译和执行这些 Servlet。

  5. Web Server:虽然 Tomcat 本身不是一个完整的 Web 服务器,但它提供了足够的功能来托管 Web 应用程序。然而,在生产环境中,它通常与更强大的 Web 服务器结合使用。

  6. JMX 和 JNDI:Tomcat 支持 Java 管理扩展(JMX)和 Java 命名和目录接口(JNDI),这使得管理员可以远程管理 Tomcat 实例,并允许应用程序查找和访问资源(如数据库连接)。

Tomcat 是轻量级的,易于安装和配置,因此它非常适合用于开发和测试环境。然而,由于其性能和可扩展性的限制,对于高流量的生产环境,可能需要考虑更强大的解决方案,如 JBoss、WebLogic 或 WebSphere。不过,通过适当的配置和集群技术,Tomcat 也可以扩展到支持大型网站。

 tomcat服务器采用的是什么模型?

Tomcat服务器采用的主要模型包括多线程模型基于插件的架构。以下是对这两种模型的详细解释:

1. 多线程模型

Tomcat服务器在处理HTTP请求时采用了多线程模型。这意味着每个请求都会被分配一个独立的线程进行处理,以提高并发性能。当请求到达时,Tomcat的连接器(Connector)会从线程池中获取一个空闲线程,将请求分配给该线程进行处理。处理完成后,线程将返回线程池,可以被其他请求重复利用。这种模型有效地利用了系统资源,提高了服务器的并发处理能力。

2. 基于插件的架构

Tomcat的架构设计是一个基于Java的分层架构,通过多个组件和插件共同构建了一个完整的Web服务器和Servlet容器。这些组件包括连接器(Connector)、容器(Container)、处理器(Processor)等。其中,最核心的组件是Catalina,它负责处理HTTP请求和管理Servlet容器。

  • 连接器(Connector):负责接收和处理HTTP请求和响应的数据流,支持多种协议和传输方式,如HTTP、HTTPS、AJP等。
  • 容器(Container):负责管理Web应用程序,每个Web应用程序都有一个Context,它包含了该应用程序的Servlet、Filter、Listener等组件的定义和配置。容器还负责类加载、Session管理、安全性等方面的处理。
  • 处理器(Processor):用于解析和执行Servlet和JSP代码,将请求和响应在Tomcat内部进行转换和处理。

此外,Tomcat还支持集群和负载均衡,可以将多个Tomcat实例组成一个集群,通过共享Session等方式进行通信,并通过负载均衡器将请求分发到不同的Tomcat实例上,以提高性能和可用性。

总结

Tomcat服务器通过采用多线程模型基于插件的架构,提供了高效、灵活且可扩展的Web服务解决方案。它支持Java Servlet和JSP技术,能够部署和运行Java Web应用程序,并通过丰富的日志记录和监控功能帮助开发人员和管理员监控Tomcat的运行状态和性能指标。

tomcat的采用什么IO模型?

Tomcat支持多种IO模型,包括BIO(阻塞I/O)、NIO(非阻塞I/O)和APR(Apache可移植运行库)。在选择使用BIO还是NIO时,主要取决于应用的具体需求和预期的性能表现。

BIO模型

  • 特点:BIO模型是Tomcat早期版本(如Tomcat 7及以前)默认使用的IO模型。它基于Java的阻塞IO实现,每个请求都会创建一个线程来处理,直到连接关闭。这种方式在处理大量并发连接时,会消耗大量的系统资源,因为每个连接都需要一个独立的线程。
  • 适用场景:适合连接数较少、并发量不高的应用场景。

NIO模型

  • 特点:NIO模型是Tomcat目前主流使用的IO模型。它基于Java的非阻塞IO实现,通过事件驱动的方式处理请求。NIO模型使用一个或多个线程来管理多个连接,并通过选择器(Selector)机制来检测连接的就绪状态,从而实现非阻塞的IO操作。这种方式能够显著提高系统的并发处理能力,降低资源消耗。
  • 适用场景:适合处理大量并发连接、长连接或需要持续处理的连接的应用场景。

Tomcat默认配置

  • Tomcat 8及以后版本:默认以NIO模式启动。这是因为NIO模型在并发处理能力和资源利用效率方面通常优于BIO模型。
  • 配置方式:可以通过修改Tomcat的server.xml文件来指定连接器使用的IO协议。例如,将<Connector>标签的protocol属性设置为org.apache.coyote.http11.Http11NioProtocol可以显式指定使用NIO模型。

总结

Tomcat默认采用NIO模型,因为NIO模型在并发处理能力和资源利用效率方面通常更优于BIO模型。然而,在实际应用中,选择哪种IO模型还需要根据应用的具体需求和预期的性能表现来决定。如果应用需要处理大量并发连接或长连接,那么NIO模型将是更好的选择。如果应用连接数较少且对性能要求不高,那么BIO模型也可以考虑使用。

高并发指的是什么?

高并发通常指的是系统能够同时处理大量请求的能力,这些请求可以是网络连接请求,也可以是HTTP请求,但更常见的是指HTTP请求,因为HTTP是Web应用中最常用的协议。

在Web应用中,当用户通过浏览器访问网站时,浏览器会向服务器发送HTTP请求以获取网页内容。如果网站非常受欢迎,同时有大量的用户访问,那么服务器就会接收到大量的HTTP请求。这时,服务器需要能够高效地处理这些请求,确保每个用户都能得到及时的响应,这就是高并发的概念。

高并发处理不仅仅是服务器的问题,还涉及到整个系统的架构设计、数据库设计、缓存策略、负载均衡等多个方面。为了应对高并发,系统需要采用一系列的技术手段,如分布式架构、异步处理、缓存机制、数据库读写分离、负载均衡等,以提高系统的处理能力和响应速度。

需要注意的是,虽然高并发通常指的是HTTP请求,但在其他类型的网络应用中,如实时通信、游戏服务器等,也可能存在高并发的需求。在这些场景中,网络连接请求的处理同样重要,需要采用相应的技术手段来优化性能。

tomcat承载的并发量

Tomcat承载的并发量是一个复杂且多变的问题,它受到多种因素的影响,包括但不限于硬件资源、JVM配置、应用程序代码以及Tomcat自身的配置等。以下是对Tomcat承载并发量的详细分析:

一、影响因素

  1. 硬件资源
    • CPU核心数:CPU的性能直接影响Tomcat处理请求的能力。更多的CPU核心意味着Tomcat可以同时处理更多的请求。
    • 内存容量:内存大小决定了JVM可以分配给Tomcat的堆大小,进而影响Tomcat的并发处理能力。
    • 网络带宽:网络带宽限制了Tomcat处理外部请求的速度,特别是在高并发场景下。
  2. JVM配置
    • 堆大小:JVM堆的大小决定了Tomcat可以使用的最大内存量,进而影响其并发处理能力。
    • 垃圾回收器:垃圾回收器的选择和配置会影响JVM的停顿时间,从而影响Tomcat的响应速度和并发性能。
    • 线程池:Tomcat通过线程池来管理请求处理线程,线程池的配置(如最大线程数、核心线程数等)直接影响并发处理能力。
  3. Tomcat配置
    • 连接器属性:如maxConnectionsmaxThreads等属性,这些属性直接限制了Tomcat可以同时处理的连接数和线程数。
    • NIO与BIO:Tomcat支持NIO和BIO两种IO模型。NIO模型在并发处理能力上通常优于BIO模型,因为它采用了非阻塞IO和选择器机制。
  4. 应用程序代码
    • 应用程序的复杂度、资源占用情况和锁使用情况等都会影响Tomcat的并发处理能力。
    • 应用程序的数据库操作也会影响并发性能,因为数据库连接数和操作性能都是有限的。

二、并发量范围

Tomcat的并发量范围非常广泛,从低到高可以分为以下几个层次:

  • 低并发:每秒数百个请求。这种级别的并发量通常适用于小型网站或应用。
  • 中并发:每秒数千个请求。这是大多数中型网站或应用的常见并发量。
  • 高并发:每秒数万至数十万个请求。这种级别的并发量需要高度优化的环境和集群配置才能支持。

三、提升并发量的措施

为了提升Tomcat的并发量,可以采取以下措施:

  • 优化硬件资源:增加CPU核心数、内存容量和网络带宽等。
  • 优化JVM配置:调整堆大小、选择合适的垃圾回收器和优化线程池配置等。
  • 优化Tomcat配置:调整连接器属性、使用NIO模型等。
  • 优化应用程序代码:减少资源占用、优化数据库操作、避免不必要的锁使用等。
  • 采用集群配置:通过多台服务器分担请求压力来提高并发处理能力。

综上所述,Tomcat承载的并发量是一个动态且可优化的过程,需要根据实际的应用场景和需求来进行配置和调整。

tomcat运行在JVM内存中

  • Tomcat作为一个Java Servlet容器,它运行在Java虚拟机(JVM)上。这意味着Tomcat及其托管的应用程序(如Web应用程序)都是在JVM的内存空间中运行的。
  • JVM是Java平台的核心,它提供了一个运行时环境,让Java程序能够运行在各种操作系统上而无需修改。JVM负责管理程序的内存分配、垃圾回收、线程管理等关键任务。
  • 当Tomcat启动时,它会加载Java类(包括Tomcat自己的类和应用程序的类),并在JVM的内存中创建必要的对象。这些对象包括但不限于Servlet实例、JSP转换后的Servlet实例、Session对象、JDBC连接等。

Tomcat的JVM内存可以分为几个主要部分:

  1. 堆(Heap):这是JVM中用于存放对象实例的内存区域。Tomcat的应用程序会在堆上创建大量的对象。堆内存的大小可以通过JVM启动参数来调整,如-Xmx-Xms参数分别用于设置JVM堆的最大值和初始值。

  2. 方法区(Method Area):虽然Java 8之后,方法区的实现发生了变化(引入了元空间Metaspace),但基本概念相似。它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

  3. 栈(Stack):每个Java线程都有自己的栈,用于存储局部变量和部分计算过程。当调用方法时,JVM会在调用线程的栈上创建一个栈帧来保存参数、局部变量和返回地址等信息。

  4. 程序计数器(Program Counter Register):这也是线程私有的,用于记录当前线程执行到的字节码的位置。

  5. 本地方法栈(Native Method Stacks):与Java栈类似,但它是为Native方法(即非Java语言编写的方法,如C或C++)服务的。

Tomcat运行在JVM上,意味着你可以通过调整JVM的启动参数来优化Tomcat的性能,比如增加堆内存大小以处理更多的用户请求,或者调整垃圾回收策略以减少停顿时间等。

运行Tomcat实际上是运行了一个Java程序。Tomcat是一个开源的Java Servlet容器,同时也是一个JSP(Java Server Pages)和Java Expression Language(JEL)的容器,它完全用Java编写。当你启动Tomcat服务器时,你实际上是在启动一个Java虚拟机(JVM)进程,该进程加载并执行Tomcat的Java类库和组件。

java的线程有上限吗

Java的线程数量是有限制的,这主要受到系统内存大小和操作系统本身的限制。具体来说,Java线程的数量上限可以从以下几个方面来理解:

一、操作系统限制

  1. 线程栈大小:每个线程都会占用一定的内存空间,其中包括线程栈。线程栈的大小是可以通过JVM参数(如-Xss)来设置的。当线程数量增多时,总的线程栈内存占用也会相应增加。
  2. 系统内存:操作系统的内存总量是有限的,当JVM进程中的线程占用的内存(包括线程栈、线程控制块等)达到一定程度时,系统可能无法再为新的线程分配足够的内存,从而限制了线程的数量。

二、JVM限制

JVM本身也会对线程数量进行一定的限制,尽管这种限制通常比操作系统的限制要宽松得多。JVM的线程数量限制主要受到JVM实现和JVM配置的影响。

三、实际限制

在实际应用中,Java程序可以创建的线程数量通常远低于理论上的最大值。这是因为:

  1. 内存资源:除了线程栈外,线程还会占用其他内存资源(如线程局部变量、线程控制块等),这些资源在大量线程存在时也会成为瓶颈。
  2. 上下文切换开销:操作系统在多个线程之间切换时会产生一定的开销。当线程数量过多时,这种开销会显著增加,影响程序的性能。
  3. 同步和锁竞争:在多线程程序中,同步和锁竞争也是影响性能的重要因素。过多的线程可能导致锁竞争加剧,从而降低程序的并发性能。

四、建议

  1. 合理评估需求:在编写多线程程序时,应根据实际需求合理评估所需的线程数量。避免创建过多的线程,以免造成系统资源的浪费和性能的下降。
  2. 使用线程池:线程池是一种有效的线程管理方式,它可以控制同时运行的线程数量,避免创建过多的线程。同时,线程池还可以实现线程的复用,提高系统的并发性能。
  3. 优化程序结构:通过优化程序结构、减少锁竞争、合理使用并发工具类等方式,可以进一步提高程序的并发性能。

综上所述,Java的线程数量是有限制的,具体上限取决于系统内存大小、操作系统限制以及JVM配置等多个因素。在编写多线程程序时,应根据实际需求合理评估线程数量,并采取相应的优化措施以提高程序的性能和效率。


http://www.kler.cn/news/313544.html

相关文章:

  • ethtool
  • 携手阿里云CEN:共创SD-WAN融合广域网
  • 【图像匹配】基于‌墨西哥帽小波(Marr小波)算法的图像匹配,matlab实现
  • signalR和WebSocket的区别是什么
  • 2024华为杯研究生数学建模C题【数据驱动下磁性元件的磁芯损耗建模】思路详解
  • Oracle脚本:排查占用UNDO段的SQL
  • 【Unity】对象池 - 未更新完
  • leetcode:2124. 检查是否所有 A 都在 B 之前(python3解法)
  • XXL-JOB 漏洞大全
  • 计算机毕业设计 美发管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 逻辑运算符
  • 第T10周:数据增强
  • 使用 Internet 共享 (ICS) 方式分配ip
  • 从虚拟机安装CentOS到自定义Dockerfile构建tomcat镜像
  • 【云安全】云服务安全攻防
  • 2024华为杯研赛C题原创python代码+结果表(1-2问)|全部可运行|精美可视化
  • openstack中的rabbitmq
  • 清理C盘缓存,电脑缓存清理怎么一键删除,操作简单的教程
  • E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning
  • 系统架构设计师教程 第5章 5.1 软件工程 笔记
  • 面向过程和面向对象思想
  • Linux:开源世界的璀璨明珠
  • 深度学习-13-小语言模型之SmolLM的使用
  • 【Linux 从基础到进阶】OpenStack 私有云平台搭建
  • SpringBoot使用@Scheduled注解实现定时任务
  • MavenMyBatis
  • 0基础跟德姆(dom)一起学AI 数据处理和统计分析04-Panda入门
  • 【操作系统】01.冯·诺伊曼体系结构
  • Flask-WTF的使用
  • 【C++】透析string类