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

操作系统实验习题解析 上篇

孤村落日残霞,轻烟老树寒鸦,一点飞鸿影下。

青山绿水,白草红叶黄花。

                                        ————《天净沙·秋》 白朴 【元】


目录

实验一:

代码:

解析:

 运行结果:

实验二:

代码解析

1. 类设计

2. 主要功能

3. 主函数

 运行结果:


今天带来操作系统的两道实验题目的解析

实验一:

这里对于上述的要求进行编译,其中的第一题我们都知道这里的优先级算法(非抢占)和时间片算法是核心。所以我们先来过一遍这两个核心的基础概念。

优先级算法:所有的进程按照优先级的大小来进行排序,然后运行进程(在队列里)。这种算法比较浪费时间,所以有了下面这个算法。

时间片算法:我们首先定义一个大小合适的时间片,不宜大(如果时间片太大,那么就起不到该有的作用)。然后对于再队列里的进程按顺序进行运行(运行的时间就是时间片规定的),将已经运行结束的进程结束,提出队列;对于没有运行结束的进程放在队列的最后,排在之前最后一个的后面,按顺序等待运行。

代码:

#include <iostream>
#include <string>
#include <cstdlib>  // rand()
#include <Windows.h> // 控制台颜色
#include <queue>
#include <vector>
using namespace std;// 最大进程数量
const int N = 10;
int n; // 用户输入的进程数量// 进程控制块 PCB
struct PCB {string name;   // 进程名字int time;      // 初始需要执行的时间int priority;  // 优先级int status;    // -1: 就绪, 0: 运行中, 1: 完成int runtime;   // 已运行时间int lefttime;  // 剩余执行时间
};// 优先队列比较器 (优先级高的在上, 如果一样则等待时间长的在上)
struct cmp {bool operator()(const PCB& a, const PCB& b) const {if (a.priority == b.priority)return a.time > b.time; // 优先等待时间长的return a.priority < b.priority; // 优先级高的优先}
};// 三个队列
priority_queue<PCB, vector<PCB>, cmp> q1; // 优先级调度就绪队列
queue<PCB> q2; // 时间片轮转就绪队列
queue<PCB> q3; // 完成队列 (两种算法共用)// 控制台颜色
enum ConsoleColor {DEFAULT = 7, GREEN = 10
};// 设置控制台颜色
void setConsoleColor(ConsoleColor color) {HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hConsole, color);
}// 恢复默认颜色
void resetConsoleColor() {setConsoleColor(DEFAULT);
}// 初始化优先级队列
void init_priority() {for (int i = 0; i < n; i++) {PCB t;t.name = string(1, 'A' + i); // 名字用大写字母t.priority = (rand() % 20) + 50; // 优先级范围: 50~69t.time = (rand() % 20) + 1; // 执行时间范围: 1~20t.status = -1; // 初始状态为就绪t.lefttime = t.time;t.runtime = 0;q1.push(t);}
}// 初始化时间片轮转法队列
void init_timeturn() {for (int i = 0; i < n; i++) {PCB t;t.name = string(1, 'A' + i);t.time = (rand() % 20) + 1;t.status = -1;t.lefttime = t.time;t.runtime = 0;q2.push(t);}
}// 打印优先级调度中的就绪队列
void print_priority(priority_queue<PCB, vector<PCB>, cmp> q) {cout << "名字\t时间\t优先级\t状态\t运行时间\t剩余时间" << endl;while (!q.empty()) {PCB t = q.top();cout << t.name << '\t' << t.time << '\t' << t.priority << '\t'<< t.status << '\t' << t.runtime + 1 << "\t\t" << t.lefttime - 1 << endl;q.pop();}cout << endl;
}// 打印时间片轮转法中的就绪队列
void print_timeturn(queue<PCB> q) {cout << "名字\t时间\t状态\t运行时间\t剩余时间" << endl;while (!q.empty()) {PCB t = q.front();cout << t.name << '\t' << t.time << '\t' << t.status << '\t'<< t.runtime + 1 << "\t\t" << t.lefttime - 1 << endl;q.pop();}cout << endl;
}// 打印完成队列(优先级调度)
void print_finish1(queue<PCB> q) {cout << "完成队列过程如下:" << endl;cout << "名字\t时间\t优先级\t状态\t运行时间\t剩余时间" << endl;while (!q.empty()) {PCB t = q.front();cout << t.name << '\t' << t.time << '\t' << t.priority << '\t'<< t.status << '\t' << t.runtime << "\t\t" << t.lefttime << endl;q.pop();}
}// 打印完成队列(时间片轮转)
void print_finish2(queue<PCB> q) {cout << "完成队列过程如下:" << endl;cout << "名字\t时间\t状态\t运行时间\t剩余时间" << endl;while (!q.empty()) {PCB t = q.front();cout << t.name << '\t' << t.time << '\t' << t.status << '\t'<< t.runtime << "\t\t" << t.lefttime << endl;q.pop();}
}// 执行优先级调度算法
void run_priority() {while (!q1.empty()) {print_priority(q1);PCB t = q1.top();q1.pop();t.lefttime--;t.runtime++;t.status = (t.lefttime == 0) ? 1 : -1;if (t.lefttime <= 0) {q3.push(t);}else {q1.push(t);}}cout << "所有进程均已执行完毕!" << endl << endl;
}// 执行时间片轮转法
void run_timeturn() {while (!q2.empty()) {print_timeturn(q2);PCB t = q2.front();q2.pop();t.lefttime--;t.runtime++;t.status = (t.lefttime == 0) ? 1 : -1;if (t.lefttime <= 0) {q3.push(t);}else {q2.push(t);}}cout << "所有进程均已执行完毕!" << endl << endl;
}// 主函数
int main() {SetConsoleOutputCP(936); // 支持中文输出setConsoleColor(GREEN);cout << "------------------------------" << endl;cout << "--------- 选择调度算法 : 1.优先级法 2.时间片轮转法 ---------" << endl;cout << "------------------------------" << endl;resetConsoleColor();int select;cout << "请输入选择 (1 或 2) : ";cin >> select;cout << "请输入进程个数 (最多10个) : ";cin >> n;cout << endl;if (n <= 0 || n > N) {cout << "进程个数输入错误, 程序退出!" << endl;return 0;}cout << "NOTICE: -1代表就绪, 0代表运行, 1代表完成" << endl << endl;if (select == 1) {init_priority();cout << "就绪队列初始化完成!" << endl;run_priority();print_finish1(q3);}else if (select == 2) {init_timeturn();cout << "就绪队列初始化完成!" << endl;run_timeturn();print_finish2(q3);}else {cout << "无效选择, 程序退出!" << endl;}return 0;
}

解析:

  • 1. 全局变量和常量
  • const int N = 10;:定义了最大进程数量。

  • int n;:用户输入的进程数量。

  • struct PCB:进程控制块,包含进程的基本信息。

  • priority_queue<PCB, vector<PCB>, cmp> q1;:优先级调度的就绪队列。

  • queue<PCB> q2;:时间片轮转的就绪队列。

  • queue<PCB> q3;:完成队列,用于存储已完成的进程。

  • 2. 优先级队列比较器
  • struct cmp:定义了优先级队列的比较规则。优先级高的进程排在前面,如果优先级相同,则等待时间长的进程排在前面。
  • 3初始化函数
  • init_priority:初始化优先级调度的就绪队列,随机生成进程的优先级和执行时间。

  • init_timeturn:初始化时间片轮转的就绪队列,随机生成进程的执行时间。

  • print_priorityprint_timeturn:分别打印优先级调度和时间片轮转的就绪队列。

  • print_finish1print_finish2:分别打印优先级调度和时间片轮转的完成队列。

  • run_priority:优先级调度算法。每次从优先级队列中取出优先级最高的进程执行,直到所有进程完成。

  • run_timeturn:时间片轮转调度算法。每次从队列中取出一个进程执行,执行完成后将其放回队列尾部,直到所有进程完成。

  • 提示用户选择调度算法,并输入进程数量。

  • 根据用户选择初始化相应的队列,并调用对应的调度算法。

  • 最后打印完成队列。

  • run_priority:优先级调度算法。每次从优先级队列中取出优先级最高的进程执行,直到所有进程完成。

  • run_timeturn:时间片轮转调度算法。每次从队列中取出一个进程执行,执行完成后将其放回队列尾部,直到所有进程完成。

 运行结果:

  

以上是在VS2022中运行的结果。

实验二:

 

我们这个实验的目的就是测试进程的死锁,也就是我们进程之间分配的资源合理的性。

我们要知道一个进程的最大需求,系统已分配,剩余需求,这三个量,保证之间的一个平衡就没问题。所以这就是关键。然后我们还要设计一个检查系统的进程之间的函数,保证我们可以第一时间了解,防止死锁的出现。

#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>using namespace std;class Process {
private:int id;vector<int> max;      // 最大资源需求vector<int> allocated; // 已分配资源vector<int> need;      // 需求资源
public:Process(int id, int resourceTypes) {this->id = id;max.resize(resourceTypes);allocated.resize(resourceTypes, 0);need.resize(resourceTypes);// 随机生成最大需求量和初始已分配资源for (int i = 0; i < resourceTypes; ++i) {max[i] = rand() % 20 + 1; // 最大需求在 1 到 20 之间allocated[i] = rand() % (max[i] + 1); // 已分配资源在 0 到 max[i] 之间need[i] = max[i] - allocated[i]; // 需求 = 最大需求 - 已分配资源}}int getId() const { return id; }const vector<int>& getMax() const { return max; }const vector<int>& getAllocated() const { return allocated; }const vector<int>& getNeed() const { return need; }// 资源分配void allocate(const vector<int>& resources) {for (int i = 0; i < resources.size(); ++i) {allocated[i] += resources[i];need[i] -= resources[i];}}// 资源释放void release(const vector<int>& resources) {for (int i = 0; i < resources.size(); ++i) {allocated[i] -= resources[i];need[i] += resources[i];}}
};class ResourceTracker {
private:vector<int> availableResources; // 系统可用资源vector<Process> processes;       // 系统中的进程
public:ResourceTracker(int resourceTypes, int processCount) {// 随机生成可用资源availableResources.resize(resourceTypes);for (int i = 0; i < resourceTypes; ++i) {availableResources[i] = rand() % 20 + 1; // 可用资源在 1 到 20 之间}// 随机生成进程for (int i = 0; i < processCount; ++i) {processes.push_back(Process(i, resourceTypes));}}void addProcess(const Process& process) {processes.push_back(process);}// 检查系统是否处于安全状态bool isSafeState(vector<int>& safeSequence) {vector<bool> finished(processes.size(), false);vector<int> work = availableResources;int count = 0;while (count < processes.size()) {bool found = false;for (size_t i = 0; i < processes.size(); ++i) {if (!finished[i]) {const Process& process = processes[i];bool canAllocate = true;// 检查进程的需求是否小于或等于当前可用资源for (size_t j = 0; j < work.size(); ++j) {if (process.getNeed()[j] > work[j]) {canAllocate = false;break;}}// 如果可以分配资源if (canAllocate) {for (size_t j = 0; j < work.size(); ++j) {work[j] += process.getAllocated()[j];}finished[i] = true;safeSequence.push_back(i);++count;found = true;}}}// 如果没有找到可以分配的进程,说明系统不安全if (!found) {return false;}}return true;}// 请求资源bool requestResources(int processId, const vector<int>& request) {// 检查进程ID是否有效if (processId < 0 || processId >= (int)processes.size()) {cout << "错误: 无效的进程ID。" << endl;return false;}// 检查请求是否超过可用资源或需求资源for (size_t i = 0; i < request.size(); ++i) {if (request[i] > availableResources[i]) {cerr << "错误: 请求的资源超过了可用资源。" << endl;return false;}if (request[i] > processes[processId].getNeed()[i]) {cerr << "错误: 请求的资源超过了进程的需求资源。" << endl;return false;}}// 临时分配资源for (size_t i = 0; i < request.size(); ++i) {availableResources[i] -= request[i];vector<int> tempReq(1, request[i]);processes[processId].allocate(tempReq);}// 检查系统是否仍处于安全状态vector<int> safeSequence;if (isSafeState(safeSequence)) {cout << "资源分配成功。安全序列: ";for (size_t i = 0; i < safeSequence.size(); ++i) {cout << safeSequence[i] << " ";}cout << endl;return true;}else {// 如果不安全,回滚分配for (size_t i = 0; i < request.size(); ++i) {availableResources[i] += request[i];vector<int> tempReq(1, request[i]);processes[processId].release(tempReq);}cerr << "错误: 资源分配会导致系统进入不安全状态,已回滚。" << endl;return false;}}// 释放资源void releaseResources(int processId, const vector<int>& resources) {// 检查进程ID是否有效if (processId < 0 || processId >= (int)processes.size()) {cerr << "错误: 无效的进程ID。" << endl;return;}// 检查释放量是否合法for (size_t i = 0; i < resources.size(); ++i) {if (resources[i] > processes[processId].getAllocated()[i]) {cerr << "错误: 尝试释放的资源超过已分配量。" << endl;return;}}// 执行释放for (size_t i = 0; i < resources.size(); ++i) {availableResources[i] += resources[i];vector<int> tempRes(1, resources[i]);processes[processId].release(tempRes);}cout << "资源释放成功。" << endl;}// 打印系统状态void printSystemState() {cout << "\n当前系统状态:" << endl;cout << "可用资源: ";for (size_t i = 0; i < availableResources.size(); ++i) {cout << availableResources[i] << " ";}cout << endl;cout << "进程状态 (ID | 最大需求 | 已分配 | 需求):" << endl;for (size_t i = 0; i < processes.size(); ++i) {const Process& process = processes[i];cout << "P" << process.getId() << " | ";// 打印最大需求const vector<int>& max = process.getMax();for (size_t j = 0; j < max.size(); ++j) {cout << max[j] << " ";}cout << "| ";// 打印已分配const vector<int>& allocated = process.getAllocated();for (size_t j = 0; j < allocated.size(); ++j) {cout << allocated[j] << " ";}cout << "| ";// 打印需求const vector<int>& need = process.getNeed();for (size_t j = 0; j < need.size(); ++j) {cout << need[j] << " ";}cout << endl;}}
};// 显示菜单
void displayMenu() {cout << "\n----- 资源管理系统 -----" << endl;cout << "1. 检查系统安全性并显示安全序列" << endl;cout << "2. 请求资源" << endl;cout << "3. 释放资源" << endl;cout << "4. 显示系统状态" << endl;cout << "5. 退出" << endl;
}int main() {srand(time(0)); // 设置随机数种子int resourceTypes = 3; // 资源类型数int processCount = 5; // 进程数ResourceTracker manager(resourceTypes, processCount);while (true) {displayMenu();int choice;cout << "请输入您的选择: ";cin >> choice;switch (choice) {case 1: {vector<int> safeSequence;if (manager.isSafeState(safeSequence)) {cout << "系统处于安全状态" << endl;cout << "安全序列: ";for (size_t i = 0; i < safeSequence.size(); ++i) {cout << safeSequence[i] << " ";}cout << endl;}else {cout << "系统处于不安全状态" << endl;}break;}case 2: {int processId;cout << "请输入进程ID (0-" << processCount - 1 << "): ";cin >> processId;vector<int> request(resourceTypes);cout << "请输入请求的资源 (3种类型,用空格分隔): ";for (int i = 0; i < resourceTypes; ++i) {cin >> request[i];}manager.requestResources(processId, request);break;}case 3: {int processId;cout << "请输入进程ID (0-" << processCount - 1 << "): ";cin >> processId;vector<int> release(resourceTypes);cout << "请输入释放的资源 (3种类型,用空格分隔): ";for (int i = 0; i < resourceTypes; ++i) {cin >> release[i];}manager.releaseResources(processId, release);break;}case 4: {manager.printSystemState();break;}case 5:cout << "退出系统..." << endl;return 0;default:cout << "无效的选择,请重新输入。" << endl;}}return 0;
}

代码解析

1. 类设计

  • Process

    • 表示一个进程,包含进程的 id、最大资源需求 max、已分配资源 allocated 和需求资源 need

    • 提供了资源分配和释放的方法。

  • ResourceTracker

    • 管理系统中的资源和进程。

    • 提供了检查系统是否处于安全状态、请求资源、释放资源和打印系统状态的方法。

2. 主要功能

  • 随机生成资源和进程

    • ResourceTracker 的构造函数随机生成可用资源和进程的资源需求。

  • 检查安全状态

    • isSafeState 方法通过银行家算法检查系统是否处于安全状态,并返回安全序列。

  • 请求资源

    • requestResources 方法允许进程请求资源,并检查请求是否会导致系统进入不安全状态。

  • 释放资源

    • releaseResources 方法允许进程释放资源。

  • 打印系统状态

    • printSystemState 方法打印当前系统状态,包括可用资源和每个进程的状态。

3. 主函数

  • 提供了一个简单的菜单,允许用户选择不同的操作:

    • 检查系统安全性并显示安全序列。

    • 请求资源。

    • 释放资源。

    • 显示系统状态。

    • 退出系统。

我们检查一下系统是否安全,然后就开始分配资源,成功之后还可以清除之前分配的资源,然后还可以检查一下系统的安全。 灵活运用保证自己分配的资源不会造成死锁。

 运行结果:

 

这就是今天的内容:求一个赞;这对我真的很重要。

下期预告:操作系统实验习题 下篇

 

相关文章:

操作系统实验习题解析 上篇

孤村落日残霞&#xff0c;轻烟老树寒鸦&#xff0c;一点飞鸿影下。 青山绿水&#xff0c;白草红叶黄花。 ————《天净沙秋》 白朴 【元】 目录 实验一&#xff1a; 代码&#xff1a; 解析&#xff1a; 运行结果&#xff1a; 实验二&#xff1a; 代码解析 1. 类设计 …...

复习javascript

1.修改元素内的内容 ​ <div>zsgh</div> <script> const box1document.querySelector("div") box1.innerText"ppp" box1.innerHtml<h1>修改</h1> </script>​ 2.随机点名练习 <!DOCTYPE html> <html lang…...

基于Arduino Nano的DIY示波器

基于Arduino Nano的DIY示波器&#xff1a;打造属于你的口袋实验室 前言 在电子爱好者的世界里&#xff0c;示波器是不可或缺的工具之一。它能够帮助我们观察和分析各种电子信号的波形&#xff0c;从而更好地理解和调试电路。然而&#xff0c;市面上的示波器价格往往较高&…...

渠道销售简历模板范文

模板信息 简历范文名称&#xff1a;渠道销售简历模板范文&#xff0c;所属行业&#xff1a;其他 | 职位&#xff0c;模板编号&#xff1a;KRZ3J3 专业的个人简历模板&#xff0c;逻辑清晰&#xff0c;排版简洁美观&#xff0c;让你的个人简历显得更专业&#xff0c;找到好工作…...

JAVA练习题(1) 卖飞机票

import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println("请输入飞机的票价&#xff1a;");int pricesc.nextInt();System.out.println("请输入月份&#xff1a;");…...

杆件的拉伸与压缩变形

杆件的拉伸与压缩 第一题 Q u e s t i o n \mathcal{Question} Question 图示拉杆沿斜截面 m − m m-m m−m由两部分胶合而成。设在胶合面上许用拉应力 [ σ ] 100 MPa [\sigma]100\text{MPa} [σ]100MPa&#xff0c;许用切应力 [ τ ] 50 MPa [\tau]50\text{MPa} [τ]50MP…...

深入解析Vue3中ref与reactive的区别及源码实现

深入解析Vue3中ref与reactive的区别及源码实现 前言 Vue3带来了全新的响应式系统&#xff0c;其中ref和reactive是最常用的两个API。本文将从基础使用、核心区别到源码实现&#xff0c;由浅入深地分析这两个API。 一、基础使用 1. ref import { ref } from vueconst count…...

Makefile中 链接库,同一个库的静态库与动态库都链接了,生效的是哪个库

Makefile中 链接库&#xff0c;同一个库的静态库与动态库都链接了&#xff0c;生效的是哪个库 在 Makefile 中同时链接同一个库的静态库&#xff08;.a&#xff09;和动态库&#xff08;.so&#xff09;时&#xff0c;具体哪个库生效取决于链接顺序和编译器行为。以下是详细分析…...

企业开发平台大变革:AI 代理 + 平台工程重构数字化转型路径

在企业数字化转型的浪潮中&#xff0c;开发平台正经历着前所未有的技术革命。从 AST&#xff08;抽象语法树&#xff09;到 AI 驱动的智能开发&#xff0c;从微服务架构到信创适配&#xff0c;这场变革不仅重塑了软件开发的底层逻辑&#xff0c;更催生了全新的生产力范式。本文…...

《汽车噪声控制》复习重点

题型 选择 填空 分析 计算 第一章 噪声定义 不需要的声音&#xff0c;妨碍正常工作、学习、生活&#xff0c;危害身体健康的声音&#xff0c;统称为噪声 噪声污染 与大气污染、水污染并称现代社会三大公害 声波基本概念 定义 媒质质点的机械振动由近及远传播&am…...

Linux——MySQL约束与查询

表的约束 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合 法性&#xff0c;从业务逻辑角度保证数据的正确性。比如有一个字段是email&#xff0c;要求是唯一的。 表的约束是为了防止插入不合法的…...

Asp.Net Core IIS发布后PUT、DELETE请求错误405

一、方案1 1、IIS管理器&#xff0c;处理程序映射。 2、找到aspNetCore&#xff0c;双击。点击请求限制...按钮&#xff0c;并在谓词选项卡上&#xff0c;添加两者DELETE和PUT. 二、方案2 打开web.config文件&#xff0c;添加<remove name"WebDAVModule" />&…...

STL-to-ASCII-Generator 实用教程

参阅&#xff1a;STL-to-ASCII-Generator 使用教程 开源项目网址 下载 STL-to-ASCII-Generator-main.zip 解压到 D:\js\ index.html 如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta id"ascii&q…...

关于数据库查询速度优化

本人接手了一个关于项目没有任何文档信息的代码&#xff0c;代码也没有相关文档说明信息&#xff01;所以在做数据库查询优化的时候不敢改动。 原因1&#xff1a; 老板需要我做一个首页的统计查询。明明才几十万条数据&#xff0c;而且我加了筛选条件为什么会这么慢&#xff…...

sql serve 多表联合查询,根据一个表字段值动态改变查询条件

在SQL Server中进行多表联合查询时&#xff0c;如果需要根据一个表的字段值动态改变查询条件&#xff0c;可以采用几种不同的方法来实现这一需求。这里介绍两种常用的方法&#xff1a;CASE表达式和动态SQL。 方法1: 使用 CASE 表达式 这种方法适合于查询条件可以在单个SQL语句…...

巡检机器人数据处理技术的创新与实践

摘要 随着科技的飞速发展&#xff0c;巡检机器人在各行业中逐渐取代人工巡检&#xff0c;展现出高效、精准、安全等显著优势。当前&#xff0c;巡检机器人已从单纯的数据采集阶段迈向对采集数据进行深度分析的新阶段。本文探讨了巡检机器人替代人工巡检的现状及优势&#xff0c…...

国产linux系统(银河麒麟,统信uos)使用 PageOffice 在线打开Word文件,并用前端对话框实现填空填表

不管是政府机关、公司企业&#xff0c;还是金融行业、教育行业等单位&#xff0c;在办公过程中都经常需要填写各种文书和表格&#xff0c;比如通知、报告、登记表、计划表、申请表等。这些文书和表格往往是用Word文件制作的模板&#xff0c;比方说一个通知模板中经常会有“关于…...

Kubernetes应用发布方式完整流程指南

Kubernetes&#xff08;K8s&#xff09;作为容器编排领域的核心工具&#xff0c;其应用发布流程体现了自动化、弹性和可观测性的优势。本文将通过一个Tomcat应用的示例&#xff0c;详细讲解从配置编写到高级发布的完整流程&#xff0c;帮助开发者掌握Kubernetes应用部署的核心步…...

视频编解码学习8之视频历史

视频技术的发展历史可以追溯到19世纪&#xff0c;至今已跨越近200年。以下是视频技术发展的主要阶段和里程碑&#xff1a; 1. 早期探索阶段&#xff08;19世纪-1920年代&#xff09; 1832年&#xff1a;约瑟夫普拉托&#xff08;Joseph Plateau&#xff09;发明"费纳奇镜&…...

RabbitMQ-高级特性1

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消息确认机制介绍手动确认方法代码前言代码编写消息确认机制的演示自动确认automanual 持久化介绍交换机持久化队列持久化消息持久化 持久化代码持久化代码演示…...

青藏高原东北部祁连山地区250m分辨率多年冻土空间分带指数图(2023)

时间分辨率&#xff1a;10年 < x < 100年空间分辨率&#xff1a;100m - 1km共享方式&#xff1a;开放获取数据大小&#xff1a;24.38 MB数据时间范围&#xff1a;近50年来元数据更新时间&#xff1a;2023-10-08 数据集摘要 多年冻土目前正在经历大规模的退化&#xff0c…...

论文分享➲ arXiv2025 | TTRL: Test-Time Reinforcement Learning

TTRL: Test-Time Reinforcement Learning TTRL&#xff1a;测试时强化学习 https://github.com/PRIME-RL/TTRL &#x1f4d6;导读&#xff1a;本篇博客有&#x1f9a5;精读版、&#x1f407;速读版及&#x1f914;思考三部分&#xff1b;精读版是全文的翻译&#xff0c;篇幅较…...

【计算机网络-传输层】传输层协议-TCP核心机制与可靠性保障

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;传输层协议-UDP 下篇文章&#xff1a; 网络层 我们的讲解顺序是&…...

项目管理从专家到小白

敏捷开发 Scrum 符合敏捷开发原则的一种典型且在全球使用最为广泛的框架。 三个角色 产品负责人Product Ower&#xff1a;专注于了解业务、客户和市场要求&#xff0c;然后相应地确定工程团队需要完成的工作的优先顺序。 敏捷教练Scrum Master&#xff1a;确保 Scrum 流程顺…...

InnoDB结构与表空间文件页的详解

目录 1.InnoDB的概览 表空间文件在哪里&#xff1f; 为什么要设计成内存结构和磁盘结构&#xff1f; 表空间与表空间文件关系&#xff1f; 用户数据如何在表空间文件存储&#xff1f; 2.页 如何设置页的大小&#xff1f; 页的结构及在表空间的位置&#xff1f; 页头包…...

世界无人机大会将至,大势智慧以“AI+实景三维”赋能低空经济

近日&#xff0c;“2025第九届世界无人机大会暨国际低空经济与无人系统博览会和第十届深圳国际无人机展览会”组委会召开新闻发布会&#xff0c;宣布本届大会主题为“步入低空经济新时代”&#xff0c;将于5月23-25日在深圳会展中心&#xff08;福田&#xff09;举行&#xff0…...

AI 驱动数据库交互技术路线详解:角色、提示词工程与输入输出分析

引言 在人工智能与数据库深度融合的趋势下&#xff0c;理解AI在数据库交互流程中的具体角色、提示词工程的运用以及各步骤的输入输出情况&#xff0c;对于把握这一先进技术路线至关重要。本文将对其展开详细剖析。 一、AI 在数据库交互流程中的角色 &#xff08;一&#xff0…...

AI 助力,轻松进行双语学术论文翻译!

在科技日新月异的今天&#xff0c;学术交流中的语言障碍仍然是科研工作者面临的一大挑战。尤其是对于需要查阅大量外文文献的学生、科研人员和学者来说&#xff0c;如何高效地理解和翻译复杂的学术论文成为了一大难题。然而&#xff0c;由Byaidu团队推出的开源项目PDFMathTrans…...

stm32错误记录

1.使用LCD屏幕时&#xff0c;只用st-link时&#xff0c;亮度很暗&#xff0c;需要用usb数据线额外给屏幕供电&#xff1b; 2.移植freertos到f103c8t6芯片时&#xff0c;工程没有错误&#xff0c;但单片机没有反应&#xff1b; 需要将堆的大小改成10*1024&#xff1b; 3.在找已经…...

Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”

Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机” Baumer工业相机​为什么偏爱“黑白相机”&#xff1f;​工业视觉中为什么倾向于多使用黑白相机黑白相机在工业视觉中的应用场景有哪些&#xff1f; Baumer工业相机 工业相机是常用与工业视觉领域的常用专业视觉…...