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

基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)

已完成功能:

        支持 GETPOST 请求的路由与回调处理。

        解析URL请求。

        单例模式 管理核心业务逻辑。

        异步 I/O 技术和 定时器 控制超时。

        通过回调函数注册机制,可以灵活地为不同的 URL 路由注册处理函数。

1. 项目背景

1.1 项目简介

本项目是一个基于 Boost.AsioBoost.Beast 的高性能 HTTP 服务器,实现了对 HTTP 请求的处理、路由功能和回调机制。该服务器使用 单例模式 来管理请求逻辑,并采用 异步 I/O 技术 来提升并发处理能力。支持的 HTTP 请求类型包括 GETPOST,并能够根据 URL 注册不同的处理函数,从而实现灵活的请求路由与回调处理机制。

1.2 项目目标

该项目旨在提供一个 高效可扩展 的 HTTP 服务器,适用于处理大量并发 HTTP 请求,具备以下核心目标:

  • 高并发处理能力:通过使用异步 I/O 和非阻塞 I/O 操作显著提升并发处理能力,避免因同步阻塞导致的性能瓶颈。
  • 可扩展性:支持通过注册回调函数来灵活处理不同的 HTTP 请求,能够根据需要扩展支持更多的 HTTP 请求类型和自定义业务逻辑。
  • 简洁的单例管理:使用单例模式管理全局资源,确保只有一个服务器实例和唯一的请求逻辑处理实例,避免重复初始化资源和管理多个实例的问题。
  • 超时管理:通过 Boost.Asio 提供的定时器机制实现 HTTP 连接的超时控制,确保服务器能够及时关闭不活跃的连接,避免因连接泄漏导致的资源浪费。

2. 项目架构

2.1 架构概述

本项目采用了事件驱动的架构模型,基于 Boost.Asio 提供的异步 I/O 功能实现高效的请求处理。整个系统通过 CServer 启动并接受客户端的连接,HttpConnection 管理每个 HTTP 请求的连接,LogicSystem 处理请求的业务逻辑,利用 单例模式 确保请求处理逻辑的唯一性。各个模块协同工作,通过回调机制对请求进行处理。

服务器架构可以分为以下几个关键模块:

  • CServer:负责启动服务器,监听指定端口并接受客户端连接请求。
  • LogicSystem:使用单例模式管理 HTTP 请求的逻辑处理,负责路由注册与回调函数的执行。
  • HttpConnection:处理每个 HTTP 请求的连接,包括请求解析、响应构建以及连接超时管理。
  • Singleton:一个模板类,提供单例模式的实现,确保系统中逻辑处理系统和其他核心组件只有一个实例。
  • 回调函数:通过回调函数类型 HttpHandler 处理 HTTP 请求,支持 GET 和 POST 请求的灵活处理。

2.2 模块划分

1.网络通信模块

该模块基于 Boost.Asio 库实现,用于管理异步的 TCP 连接和 HTTP 请求的处理。CServer 负责监听端口并接受客户端连接,HttpConnection 负责处理每个连接的 HTTP 请求,采用非阻塞 I/O 操作来保证服务器的高效性能。

关键类:

  • CServer:负责创建 acceptor 并等待连接,管理 tcp::socket
  • HttpConnection:负责处理 HTTP 请求和响应,管理 TCP 连接。
2.HTTP 请求处理模块

该模块基于 Boost.Beast 实现,负责解析 HTTP 请求和构建 HTTP 响应。使用 http::requesthttp::response 类型来处理请求和响应内容。该模块还通过回调函数 HttpHandler 进行路由处理。

关键类:

  • HttpConnection:解析请求并构建响应。
  • LogicSystem:注册并调用处理 GET/POST 请求的回调函数。
3.单例模式模块

通过模板实现的 Singleton 类,确保了系统中 LogicSystem 类等重要组件的唯一性。它通过懒汉式单例模式来延迟初始化,避免了不必要的资源浪费,确保系统的高效运行。

关键类:

  • Singleton:模板类,用于实现 LogicSystem 等核心组件的单例模式。
4.超时管理模块

Boost.Asiosteady_timer 被用于处理连接超时。每个 HTTP 连接都配备了一个定时器,如果连接在规定时间内没有收到有效响应,则会自动关闭连接,防止资源泄漏。

关键类:

  • HttpConnection:内部持有一个 steady_timer,用于处理每个连接的超时。

2.3 数据流

项目的数据流过程如下:

  1. CServer 启动并监听指定端口,等待来自客户端的 TCP 连接。
  2. 客户端连接请求到来时,CServer 使用 acceptor 接受连接,并为每个连接创建一个 HttpConnection 实例。
  3. HttpConnection 启动异步读取操作,接收客户端发送的 HTTP 请求,并将请求数据存储在 beast::flat_buffer 中。
  4. 在接收到完整的 HTTP 请求后,HttpConnection 会解析请求,提取 URL 和请求方法(如 GET 或 POST)。
  5. HttpConnection 将请求转交给 LogicSystemLogicSystem 根据请求的 URL 查找对应的回调函数(HttpHandler),并执行该回调函数进行处理。
  6. 回调函数处理完请求后,HttpConnection 将生成相应的 HTTP 响应,并异步将响应数据发送回客户端。
  7. 如果连接在规定时间内未完成处理,HttpConnection 会触发定时器,主动关闭连接,避免资源浪费。

3. 模块详细设计

由于代码太长,源码我给出链接

源码下载地址,密码:bhmyicon-default.png?t=O83Ahttps://wwta.lanzoue.com/iqugu2k8shij

3.1 CServer 模块

CServer 类是整个 HTTP 服务器的入口,负责启动服务器,监听并接受来自客户端的连接。它依赖于 Boost.Asio 库提供的 tcp::acceptor 来监听指定的端口。当客户端连接到服务器时,CServer 会为每个连接创建一个新的 HttpConnection 对象来处理该连接。

关键函数:
  • Start():启动服务器并开始接受客户端连接。
  • Accept():异步接受客户端连接,当有新的连接请求时调用 HttpConnection 来处理。

CServer 的主要任务是创建和管理连接,每当有新的连接请求时,它会为该连接创建一个 HttpConnection 对象,后者将负责处理 HTTP 请求。

#ifndef CSERVER_H
#define CSERVER_H
#include "const.h"// CServer 类,负责接受客户端连接并处理连接请求
class CServer :public std::enable_shared_from_this<CServer> {
public:CServer(boost::asio::io_context& ioc, unsigned short& port);// 构造函数:初始化服务器并绑定到指定端口void Start(); // 启动服务器,开始接受连接
private:tcp::acceptor _acceptor;// 用于接受 TCP 连接的接受器net::io_context& _ioc;// 提供 I/O 服务的上下文对象tcp::socket _socket;// 用于与客户端通信的套接字
};
#endif

3.2 HttpConnection 模块

HttpConnection 类管理每一个客户端的 HTTP 连接。它负责异步读取客户端请求,解析 HTTP 请求,查找 URL 对应的回调函数,并生成 HTTP 响应返回给客户端。此外,HttpConnection 还负责超时管理,通过 Boost.Asiosteady_timer 来确保每个连接的生命周期不会过长,从而避免资源泄漏。

关键函数:
  • Start():启动连接,开始处理 HTTP 请求。
  • HandleReq():处理 HTTP 请求,包括解析请求内容并根据请求方法调用相应的回调函数。
  • CheckDeadline():检查当前连接是否超时,超时则关闭连接。
  • WriteResponse():将生成的 HTTP 响应数据写入客户端。

HttpConnection 的任务是在接收到请求后,解析出请求的方法(GET/POST)、URL 和参数,并将其传递给 LogicSystem 来进行后续的处理。最终,将服务器的响应发送给客户端。

#ifndef HTTPCONNECTION_H
#define HTTPCONNECTION_H
#include "const.h"// HttpConnection 类,负责与客户端的 HTTP 连接
// 提供处理 HTTP 请求、定时器管理等功能
class HttpConnection :public std::enable_shared_from_this<HttpConnection> {friend class LogicSystem;// 允许 LogicSystem 访问 HttpConnection 的私有成员
public:HttpConnection(tcp::socket socket);// 构造函数:接受 TCP 套接字,初始化连接void Start(); // 启动连接处理
private:void CheckDeadline();// 检查是否超时,定时器功能void WriteResponse();// 写入响应数据void HandleReq(); // 处理 HTTP 请求void PreParseGetParam();//处理参数解析tcp::socket _socket;// 客户端套接字beast::flat_buffer _buffer{ 8192 };// 接收数据的缓冲区,最大缓存 8192 字节http::request<http::dynamic_body> _request;// HTTP 请求对象,存储接收到的 HTTP 请求数据http::response<http::dynamic_body> _response;// HTTP 响应对象,存储响应数据并发送给客户端// 定时器,检查连接是否超时,60 秒后自动关闭连接net::steady_timer deadline_{_socket.get_executor(),std::chrono::seconds(60)};std::string _get_url; // 存储请求的 URLstd::unordered_map<std::string, std::string> _get_params;// 存储 GET 请求的查询参数,以键值对形式存储
};#endif

3.3 LogicSystem 模块

LogicSystem 类是整个系统的核心,负责管理 HTTP 请求的路由与回调函数。它采用 单例模式 确保系统中只有一个逻辑处理实例,并通过 std::map 存储 GET 和 POST 请求的回调函数。每当 HTTP 请求到来时,HttpConnection 会将请求的 URL 传递给 LogicSystem,然后根据请求方法(GET/POST)查找并执行对应的回调函数。

关键函数:
  • RegGet():注册 GET 请求的回调函数。
  • RegPost():注册 POST 请求的回调函数。
  • HandleGet():处理 GET 请求,执行对应的回调函数。
  • HandlePost():处理 POST 请求,执行对应的回调函数。

LogicSystem 是一个单例类,它为每个请求类型(GET/POST)提供了 URL 到回调函数的映射表。当请求到来时,LogicSystem 会根据请求的 URL 查找相应的回调函数并执行,从而实现不同 URL 对应不同的处理逻辑。

#ifndef LOGICSYSTEM_H
#define LOGICSTSTEM_H
#include "Singleton.h"
#include <functional>
#include <map>
#include "const.h"class HttpConnection;typedef std::function<void(std::shared_ptr<HttpConnection>)> HttpHandler;// 定义一个回调函数类型,处理 HTTP 请求
// HttpHandler 通过 shared_ptr 传递 HttpConnection 对象// LogicSystem 类,用于管理 HTTP 请求的逻辑处理
// 采用单例模式,确保系统只有一个实例
class LogicSystem : public Singleton<LogicSystem> {friend class Singleton<LogicSystem>; // 允许 Singleton 类访问 LogicSystem 的构造函数
public:~LogicSystem();// 析构函数,负责释放资源bool HandleGet(std::string path, std::shared_ptr<HttpConnection> con); // 处理GET请求的函数bool HandlePost(std::string path, std::shared_ptr<HttpConnection> con);//处理POST请求的函数void RegGet(std::string url, HttpHandler handler);// 注册 GET 请求的回调函数void RegPost(std::string url, HttpHandler handler);// 注册POST请求的回调函数
private:LogicSystem(); // 构造函数,私有化以防外部直接创建实例//key为路由,value为回调函数std::map<std::string, HttpHandler> _post_handlers; // 存储 POST 请求的处理函数std::map<std::string, HttpHandler> _get_handlers; // 存储 GET 请求的处理函数
};
#endif

3.4 Singleton 模块

Singleton 模块通过模板实现了单例模式,确保系统中的核心组件(如 LogicSystem)只有一个实例。该模板类使用懒汉式初始化,确保在首次访问时才创建实例,并且每次访问都返回同一个实例。

关键函数:
  • GetInstance():获取单例实例,如果实例尚未创建,则进行初始化。
  • PrintAddress():打印当前单例实例的地址,便于调试。

Singleton 模块保证了系统中只有一个实例,可以有效避免重复实例化带来的资源浪费。通过使用 std::shared_ptr 管理实例的生命周期,确保实例的销毁是在所有引用都释放后进行的。

#ifndef SINGLETON_H
#define SINGLETON_H
#include <mutex>
#include <iostream>
#include <memory>// Singleton 模板类,确保一个类只有一个实例
// 使用 std::shared_ptr 来管理实例生命周期
template <typename T>
class Singleton {
protected:Singleton() = default;  // 默认构造函数,防止外部实例化Singleton(const Singleton<T>&) = delete; // 禁止拷贝构造Singleton& operator=(const Singleton<T>& st) = delete; // 禁止拷贝赋值static std::shared_ptr<T> _instance;// 存储单例实例的静态变量
public:// 获取单例实例,线程安全的懒汉式初始化static std::shared_ptr<T> GetInstance() {static std::once_flag s_flag;// 用于确保单例实例只被创建一次std::call_once(s_flag, [&]() {// 创建单例实例并保存在 _instance 中_instance = std::shared_ptr<T>(new T);});return _instance;// 返回单例实例}// 打印当前单例实例的地址void PrintAddress() {std::cout << _instance.get() << std::endl;}// 析构函数,打印销毁信息~Singleton() {std::cout << "this is singleton destruct" << std::endl;}
};// 为单例提供静态变量的初始化
template<typename T>
std::shared_ptr<T>Singleton<T>::_instance = nullptr;
#endif

4.测试

输入http://localhost:8080/get_test

显示receive get_test req

输入http://localhost:8080/get_test?key1=value1&key2=value2

显示

receive get_test req
param1key iskey1, value isvalue1
param2key iskey2, value isvalue2 

相关文章:

基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)

已完成功能&#xff1a; 支持 GET 和 POST 请求的路由与回调处理。 解析URL请求。 单例模式 管理核心业务逻辑。 异步 I/O 技术和 定时器 控制超时。 通过回调函数注册机制&#xff0c;可以灵活地为不同的 URL 路由注册处理函数。 1. 项目背景 1.1 项目简介 本项目是一个基于…...

有机物谱图信息的速查技巧有哪些?

谱图信息是化学家解读分子世界的“语言”&#xff0c;它们在化学研究的各个领域都发挥着不可或缺的作用。它们是理解和确定分子结构的关键&#xff0c;对化学家来说极为重要&#xff0c;每一种谱学技术都提供了不同的视角来观察分子&#xff0c;从而揭示其独特的化学和物理特性…...

Eureka缓存机制

一、Eureka的CAP特性 Eureka是一个AP系统&#xff0c;它优先保证可用性&#xff08;A&#xff09;和分区容错性&#xff08;P&#xff09;&#xff0c;而不保证强一致性&#xff08;C&#xff09;。这种设计使得Eureka在分布式系统中能够应对各种故障和分区情况&#xff0c;保…...

【LC】78. 子集

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1…...

协同过滤算法私人诊所系统|Java|SpringBoot|VUE|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SpringBoot、Mybatis-Plus、VUE、jquery,html 5⃣️…...

Docker部署Naocs-- 超细教程

Docker 拉取镜像 docker pull nacos/nacos-server:v2.2.0 挂载目录 如果不是root账号 前面加sudo 或者 切换root账号 su root&#xff08;命令&#xff09; mkdir -p /mydata/nacos/logs/ #新建logs目录 mkdir -p /mydata/nacos/conf/ #新建conf目录 启动容器…...

[java基础-集合篇]优先队列PriorityQueue结构与源码解析

优先队列PriorityQueue 优先级队列表示为平衡二进制堆&#xff1a; queue[n] 的两个子级是 queue[2*n1] 和 queue[2*&#xff08;n1&#xff09;]。 注&#xff1a;左子节点index2*parentIndex1,右子节点index2*parentIndex2,源码中计算parent位置时就是这样反过来计算的 优…...

12. C语言 数组与指针(深入理解)

本章目录: 前言1. 什么是数组&#xff1f;2. 数组的声明与初始化声明数组初始化数组 3. 访问数组元素遍历数组 4. 获取数组长度使用 sizeof 获取长度使用宏定义简化 5. 数组与指针数组名与指针的区别使用指针操作数组 6. 多维数组遍历多维数组 7. 数组作为函数参数8. 高级技巧与…...

Postman接口测试基本操作

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman-获取验证码 需求&#xff1a;使用Postman访问验证码接口&#xff0c;并查看响应结果。 地址&#xff1a;http://kdtx-test.itheima.net/api/captchaIm…...

MySQL--2.1MySQL的六种日志文件

大家好&#xff0c;我们来说一下MySQL的6中日志文件。 1.查询日志 查询日志主要记录mysql的select查询的&#xff0c;改配置是默认关闭的。不推荐开启&#xff0c;因为会导致大量查询日志文件储存占用你的空间。 举例查询一下 select * from class&#xff1b; 开启查询日志的命…...

spring task使用

Spring Task 简介 Spring Task 是 Spring 框架原生自带的任务调度框架&#xff0c;它犹如一把瑞士军刀&#xff0c;为开发者提供了丰富多样的功能&#xff0c;助力轻松创建和管理定时任务。相较于其他一些第三方任务调度框架&#xff0c;Spring Task 最大的优势在于其与 Sprin…...

【FPGA】时序约束与分析

设计约束 设计约束所处环节&#xff1a; 约束输入 分析实现结果 设计优化 设计约束分类&#xff1a; 物理约束&#xff1a;I/O接口约束&#xff08;例如引脚分配、电平标准设定等物理属性的约束&#xff09;、布局约束、布线约束以及配置约束 时序约束&#xff1a;设计FP…...

LLM的MoE由什么构成:门控网络,专家网络

LLM的MoE由什么构成:门控网络,专家网络 目录 LLM的MoE由什么构成:门控网络,专家网络专家网络门控网络MoE在联邦学习中的使用及原理专家网络 定义与特点:是一组独立的模型,每个模型都负责处理某个特定的子任务或学习输入空间的特定部分。这些专家可以是简单的线性回归模型…...

HTML-多媒体标签

除了图像&#xff0c;网页还可以放置视频和音频。 1.<video> <video>标签是一个块级元素&#xff0c;用于放置视频。如果浏览器支持加载的视频格式&#xff0c;就会显示一个播放器&#xff0c;否则显示<video>内部的子元素。 <video src"example.…...

MySQL笔记大总结20250108

Day2 1.where (1)关系运算符 select * from info where id>1; select * from info where id1; select * from info where id>1; select * from info where id!1;(2)逻辑运算符 select * from info where name"吴佩奇" and age19; select * from info wh…...

stm32week3

stm32学习 二.外设 8.TIM输出比较 OC(output compare)输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系&#xff0c;来对输出电平进行置1、置0、翻转操作&#xff0c;用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的…...

uniapp 的uni.getRecorderManager() 录音功能小记

官网上明确说的是全局唯一并且只是获取对象&#xff0c;所以会导致一个问题就是&#xff0c;当你多个页面要用到这个对象的时候&#xff0c;会发现 onStop 方法会被覆盖&#xff0c;导致调用结果不是自己想要的 解决办法也简单粗暴&#xff0c;在需要用到的界面重新覆盖onStop…...

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法&#xff0c;主要考察开发经验与技术水平&#xff0c;回答不佳会影响面试印象。提供四个回答方向&#xff0c;准备其中一个方向即可。 1、设计模式应用方向 以登录为例&#xff0c;未…...

RT-DETR代码详解(官方pytorch版)——参数配置(1)

前言 RT-DETR虽然是DETR系列&#xff0c;但是它的代码结构和之前的DETR系列代码不一样。 它是通过很多的yaml文件进行参数配置&#xff0c;和之前在train.py的parser argparse.ArgumentParser()去配置所有参数不同&#xff0c;所以刚开始不熟悉代码的时候可能不知道在哪儿修…...

腾讯云AI代码助手编程挑战赛-凯撒密码解码编码器

作品简介 在CTFer选手比赛做crypto的题目时&#xff0c;一些题目需要自己去解密&#xff0c;但是解密的工具大部分在线上&#xff0c;而在比赛过程中大部分又是无网环境&#xff0c;所以根据要求做了这个工具 技术架构 python语言的tk库来完成的GUI页面设计&#xff0c;通过…...

搭建docker私有化仓库Harbor

Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…...

【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)

文章目录 S06L22 Search, Find, and Replace - Part One1 从光标位置起&#xff0c;正向定位到当前行的首个字符 b2 从光标位置起&#xff0c;反向查找某个字符3 重复上一次字符查找操作4 定位到目标字符的前一个字符5 单字符查找与 Vim 命令的组合6 跨行查找某字符串7 Vim 的增…...

GIC中断分组介绍(IMX6ull为例)

一、Cortex-A7内核中断 Cortex-A7内核具有多个中断类型&#xff0c;但其中最重要的是复位中断和IRQ&#xff08;普通中断请求&#xff09;中断。对于IMX6ULL而言&#xff0c;主要关注的是IRQ中断&#xff0c;因为外部设备和内部事件通常都会触发这类中断。 从左到右 中断控制…...

计算机网络期末复习(知识点)

概念题 在实际复习之前&#xff0c;可以看一下这个视频将网络知识串一下&#xff0c;以便更好地复习&#xff1a;【你管这破玩意叫网络&#xff1f;】 网络规模的分类 PAN&#xff08;个人区域网络&#xff09;&#xff1a;用于个人设备间的连接&#xff0c;如手机与蓝牙耳机…...

Apache XMLBeans 一个强大的 XML 数据处理框架

Apache XMLBeans 是一个用于处理 XML 数据的 Java 框架&#xff0c;它提供了一种方式将 XML Schema (XSD) 映射到 Java 类&#xff0c;从而使得开发者可以通过强类型化的 Java 对象来访问和操作 XML 文档。下面将以一个简单的案例说明如何使用 Apache XMLBeans 来解析、生成和验…...

飞凌嵌入式i.MX8M Mini核心板已支持Linux6.1

飞凌嵌入式FETMX8MM-C核心板现已支持Linux6.1系统&#xff0c;此次升级不仅使系统功能更加丰富&#xff0c;还通过全新BSP实现了内存性能的显著提升。 基于NXP i.MX8M Mini处理器设计开发的飞凌嵌入式FETMX8MM-C核心板&#xff0c;拥有4个Cortex-A53高性能核和1个Cortex-M4实时…...

【数据链电台】洛克希德·马丁(Lockheed Martin)

洛克希德马丁公司&#xff08;Lockheed Martin&#xff09;是全球领先的航空航天、国防、先进技术和安全领域的供应商之一。 公司为美军及盟国军队提供了广泛的通信系统&#xff0c;包括数据链电台和相关的通信系统。 洛克希德马丁的许多产品用于战术通信、卫星通信、电子战、…...

python关键字(保留字)用法、保留的标识符类(1)

python关键字(保留字)用法、保留的标识符类&#xff08;1&#xff09; 一、python保留字(关键字) 1.1、python关键字 以下标识符为保留字&#xff0c;或称 关键字&#xff0c;不可用于普通标识符&#xff0c;即我们不能把它们用作任何标识符名称。 python 保留字(关键字) 关键…...

Ubuntu平台虚拟机软件学习笔记

Ubuntu平台上常见虚拟机软件 VirtualBox [Download]KVM/QEMU 1. VirtualBox 1.1 查看安装版本 VBoxManage -V2. KVM/QEMU KVM: Kernel-based Virtual Machine QEMU: Quick EMUlator 通义千问&#xff1a; virt-manager 既不是QEMU也不是KVM&#xff0c;而是用于管理和创建…...

【数据库系统概论】数据库恢复技术

目录 11.1 事务的基本概念 事务的定义 事务的开始与结束 事务的ACID特性 破坏ACID特性的因素 11.2 数据库恢复概述 11.3 故障的种类 1. 事务内部的故障 2. 系统故障 3. 介质故障 4. 计算机病毒 11.4 恢复的实现技术 如何建立冗余数据 数据转储 登记日志文件 11…...

建设银行网站点击次数/关键词搜索排名工具

Flowable项目提供的第四个UI应用程序是Flowable Admin应用程序。此应用程序提供了查询BPMN&#xff0c;DMN和Form Engines中的部署的方法&#xff0c;还显示了具有活动任务和流程变量的流程实例的活动状态。它还提供了将任务分配给其他受理人并完成活动任务的操作。FlowableAdm…...

网站首页插入视频/全国疫情高峰时间表最新

C学习 十二、内存模型&#xff0c;作用域&#xff0c;名称空间 &#xff08;1&#xff09;多文件编译前言多文件编译模块化文件结构头文件.h头文件结构源文件.cpp后记前言 本篇继续C学习总结。 本篇将探讨C中&#xff0c;变量与函数的内存模型&#xff0c;以及在多文件程序中…...

wordpress注册接口/达州seo

上一篇博客&#xff1a;Java学习篇27_[网络编程]软件架构、CS/BS、网络通信三要素、TCP通信、Scoket套接字、ServertSocket 目录 Junit单元测试反射注解 开始 一、Junit单元测试&#xff1a; 1.1 测试分类&#xff1a; 黑盒测试&#xff1a;不需要写代码&#xff0c;给输入…...

wordpress编辑分类/旅游最新资讯 新闻

欢迎转载&#xff0c;转载请注明&#xff1a;本文出自Bin的专栏blog.csdn.net/xbinworld。 技术交流QQ群&#xff1a;433250724&#xff0c;欢迎对算法、技术、应用感兴趣的同学加入。 最近在复习经典机器学习算法的同时&#xff0c;也仔细看了一些深度学习的典型算法。深度学…...

手机网站制作要求/成都seo的方法

ProgressBar使用总结一、概述二、使用三、定制化一、概述 ProgressBar 就是进度条。该值应该随着进度定期更新。范围由from和to定义&#xff0c;这个定义的就是区间值&#xff0c;它们都可以包含任何值。 ProgressBar {value: 0.5}ProgressBar还支持一种特殊的不确定模式&#…...

wordpress 主题盗/网站服务器软件

arduino 推出了带有FPGA 的arduino 开发板 MKR VIDOR 4000。硬件创客带入了FPGA的时代&#xff0c;在这块开发板上带有Microchip SAMD21处理器&#xff08;cortex-M0&#xff09;&#xff0c;一个Intel 的Cyclone FPGA&#xff08;Cyclone 10CL016 FPGA &#xff09;。FPGA 芯片…...