操作系统|| 虚拟内存页置换算法
题目
写一个程序来实现 FIFO 和 LRU 页置换算法。首先,产生一个随机的页面引用序列,页面数从 0~9。将这个序列应用到每个算法并记录发生的页错误的次数。实现这个算法时要将页帧的数量设为可变。假设使用请求调页。可以参考所示的抽象类。
抽象类:
public abstract class ReplacementAlgorithm
{
protected int pageFaultCount; // the number of page faults
protected int pageFrameCount; // the number of physical page frame
// pageFrameCount the number of physical page frames
public ReplacementAlgorithm(int pageFrameCount) {
if (pageFrameCount <0)
throw new IllegalArgumentException();
this.pageFrameCount = pageFrameCount;
pageFaultCount= 0; }
// return - the number of page faults that occurred
public int getPageFaultCount() {
return pageFaultCount;
}
// int pageNumber - the page number to be inserted
public abstract void insert (int pageNumber);
}
采用 LRU 页置换算法,另一个采用 FIFO 算法。
有两个类可以在线测试你的算法。
(1)PageGenerator——该类生成页面引用序列,页面数从 0~9。引用序列
的大小可作为 PageGenerateor 构造函数的参数。在创建 PageGenerator 对象后,
可用方法 getReferenceString0 方法返回作为引用序列的整数数组。
(2)Test-用来测试你的基于 ReplacementAlgorithm 的两个类 FIFO 与 LRU。
Test 可按如下方法调用:
Java Test <reference string #> <# of page frames>
算法介绍
先进先出算法(FIFO):缺页中断发生时,系统选择在内存中驻留时间最长的页面淘汰。通常采用链表记录进入物理内存中的逻辑页面,链首时间最长。
该算法实现简单,但性能较差,调出的页面可能是经常访问的页面,而且进程分配物理页面数增加时,缺页并不一定减少(Belady 现象)。
优点 :实现简单,只需要维护一个先进先出队列,每次淘汰时直接操作队列头部即可。
缺点 :性能较差,因为被调出的页面可能是经常访问的页面。会发生 Belady 现象(颠簸现象),当进程分配的物理页面数增加时,缺页次数反而可能增加。
Java伪代码:
public class FIFO {private Queue<Integer> queue = new LinkedList<>();private Set<Integer> pageSet = new HashSet<>();private int capacity;public FIFO(int capacity) {this.capacity = capacity;}public void accessPage(int page) {if (pageSet.contains(page)) {// 页面已在内存中,不需要处理return;}if (pageSet.size() < capacity) {// 内存未满,将页面加入队列和集合queue.offer(page);pageSet.add(page);System.out.println("页面 " + page + " 调入内存");} else {// 内存已满,淘汰队首页面int evictPage = queue.poll();pageSet.remove(evictPage);System.out.println("页面 " + evictPage + " 被淘汰");// 将新页面加入队列和集合queue.offer(page);pageSet.add(page);System.out.println("页面 " + page + " 调入内存");}}public static void main(String[] args) {FIFO fifo = new FIFO(3);int[] pages = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5};for (int page : pages) {System.out.print("访问页面 " + page + ":");fifo.accessPage(page);System.out.println("当前内存中的页面:" + fifo.pageSet);System.out.println();}}
}
最近最久未使用算法(LRU):算法思想是缺页发生时,选择最长时间没有被引用的页面进行置换,如某些页面长时间未被访问,则它们在将来还可能会长时间不会访问。该算法的开销较大。
优点 :具有较好的性能,能够较好地预测页面的使用频率。
缺点 :实现相对复杂,需要记录每个页面的访问时间,并且每次访问都需要更新访问时间。
Java伪代码:
public class LRU {private Map<Integer, Integer> pageMap = new HashMap<>();private List<Integer> pageList = new ArrayList<>();private int capacity;public LRU(int capacity) {this.capacity = capacity;}public void accessPage(int page) {if (pageMap.containsKey(page)) {// 页面已在内存中,更新其位置pageList.remove(Integer.valueOf(page));pageList.add(page);System.out.println("页面 " + page + " 已在内存中,更新其位置");} else {if (pageList.size() < capacity) {// 内存未满,将页面加入列表和映射pageList.add(page);pageMap.put(page, pageList.size() - 1);System.out.println("页面 " + page + " 调入内存");} else {// 内存已满,淘汰最久未使用的页面(列表开头的页面)int evictPage = pageList.remove(0);pageMap.remove(evictPage);System.out.println("页面 " + evictPage + " 被淘汰");// 将新页面加入列表和映射pageList.add(page);pageMap.put(page, pageList.size() - 1);System.out.println("页面 " + page + " 调入内存");}}}public static void main(String[] args) {LRU lru = new LRU(3);int[] pages = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5};for (int page : pages) {System.out.print("访问页面 " + page + ":");lru.accessPage(page);System.out.println("当前内存中的页面:" + lru.pageList);System.out.println();}}
}
关键步骤
(1)在PageGenerator类中,构造函数PageGenerator(int count)中生成随机的页面引用序列。
public PageGenerator(int count) {if (count < 0)throw new IllegalArgumentException();java.util.Random generator = new java.util.Random();referenceString = new int[count];for (int i = 0; i < count; i++)referenceString[i] = generator.nextInt(RANGE + 1);
}
(2)在ReplacementAlgorithm抽象类的子类FIFO和LRU中,实现页面置换算法。
FIFO类:实现FIFO算法(First-In, First-Out):将最早插入的页面替换出去。
@Override
public void insert(int pageNumber) {boolean pageFault = true;// 检查页面是否已经在物理页面帧中for (int i = 0; i < pageFrameCount; i++) {if (pageFrames[i] == pageNumber) {pageFault = false;break;}}// 如果页面不在物理页面帧中,则发生页面错误if (pageFault) {pageFaultCount++;pageFrames[currentIndex] = pageNumber;currentIndex = (currentIndex + 1) % pageFrameCount;}
}
LRU类:实现LRU算法(Least Recently Used):将最长时间未被使用的页面替换出去
@Override
public void insert(int pageNumber) {boolean pageFault = true;int oldestTimestampIndex = 0;int oldestTimestamp = timestamps[0];// 检查页面是否已经在物理页面帧中for (int i = 0; i < pageFrameCount; i++) {if (pageFrames[i] == pageNumber) {pageFault = false;// 更新页面的时间戳timestamps[i] = getCurrentTimestamp();break;}// 找到最老的时间戳和对应的页面帧索引if (timestamps[i] < oldestTimestamp) {oldestTimestamp = timestamps[i];oldestTimestampIndex = i;}}// 如果页面不在物理页面帧中,则发生页面错误if (pageFault) {pageFaultCount++;pageFrames[oldestTimestampIndex] = pageNumber;timestamps[oldestTimestampIndex] = getCurrentTimestamp();}
}
(3)在Test类中,使用FIFO和LRU算法计算页面错误次数。
PageGenerator ref = new PageGenerator(new Integer(args[0]).intValue());int[] referenceString = ref.getReferenceString();/** Use either the FIFO or LRU algorithms */
ReplacementAlgorithm fifo = new FIFO(new Integer(args[1]).intValue());
ReplacementAlgorithm lru = new LRU(new Integer(args[1]).intValue());// 插入页面时输出消息
for (int i = 0; i < referenceString.length; i++) {// System.out.println("inserting " + referenceString[i]);lru.insert(referenceString[i]);
}// 插入页面时输出消息
for (int i = 0; i < referenceString.length; i++) {// System.out.println("inserting " + referenceString[i]);fifo.insert(referenceString[i]);
}// 报告页面错误总数
System.out.println("LRU faults = " + lru.getPageFaultCount());
System.out.println("FIFO faults = " + fifo.getPageFaultCount());
源码
/*** This class generates page references ranging from 0 .. 9** Usage:* PageGenerator gen = new PageGenerator()* int[] ref = gen.getReferenceString();*/public class PageGenerator
{private static final int DEFAULT_SIZE = 100;private static final int RANGE = 9;int[] referenceString;public PageGenerator() {this(DEFAULT_SIZE);}public PageGenerator(int count) {if (count < 0)throw new IllegalArgumentException();java.util.Random generator = new java.util.Random();referenceString = new int[count];for (int i = 0; i < count; i++)referenceString[i] = generator.nextInt(RANGE + 1);}public int[] getReferenceString() {/*** comment out the following two lines to* generate random reference strings*/int[] str = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//int[] str = {1,2,3,4,1,2,5,1,2,3,4,5};return str;/*** and uncomment the following line*/ //return referenceString;}
}
/*** ReplacementAlgorithm.java **/public abstract class ReplacementAlgorithm
{// the number of page faultsprotected int pageFaultCount;// the number of physical page frameprotected int pageFrameCount;/*** @param pageFrameCount - the number of physical page frames*/public ReplacementAlgorithm(int pageFrameCount) {if (pageFrameCount < 0)throw new IllegalArgumentException();this.pageFrameCount = pageFrameCount;pageFaultCount = 0;}/*** @return - the number of page faults that occurred.*/public int getPageFaultCount() {return pageFaultCount;}/*** @param pageNumber - the page number to be inserted*/public abstract void insert(int pageNumber);
}
public class FIFO extends ReplacementAlgorithm{private int[] pageFrames;private int currentIndex;public FIFO(int pageFrameCount){super(pageFrameCount);pageFrames = new int[pageFrameCount];currentIndex = 0;}@Overridepublic void insert(int pageNumber) {boolean pageFault = true;//check pages whether in pageFramesfor(int i =0;i<pageFrameCount;i++){if(pageFrames[i]==pageNumber){pageFault = false;break;}}//if pages not in pagesFrames,it happens faultsif(pageFault){pageFaultCount++;pageFrames[currentIndex] = pageNumber;currentIndex = (currentIndex+1)%pageFrameCount;}}
}
public class LRU extends ReplacementAlgorithm{private int[] pageFrames;private int[] timestamps;/*** @param pageFrameCount - the number of physical page frames*/public LRU(int pageFrameCount) {super(pageFrameCount);pageFrames = new int[pageFrameCount];timestamps = new int[pageFrameCount];}@Overridepublic void insert(int pageNumber) {boolean pageFault = true;int oldestTimestampIndex = 0;int oldestTimestamp = timestamps[0];//check pages whether in pagesFramesfor(int i =0;i<pageFrameCount;i++){if(pageFrames[i]==pageNumber){pageFault = false;//upgrade pageTimestapstimestamps[i] = getPageFaultCount();break;}if(timestamps[i]<oldestTimestamp){oldestTimestamp = timestamps[i];oldestTimestampIndex = i;}}//if not in pagesFrame,happen faultsif(pageFault){pageFaultCount++;pageFrames[oldestTimestampIndex]=pageNumber;timestamps[oldestTimestampIndex]=getCurrentTimestamp();}}//acquire current timestampprivate int getCurrentTimestamp(){return pageFaultCount+1;}
}
/*** Test harness for LRU and FIFO page replacement algorithms**/public class Test
{public static void main(String[] args) {if (args.length != 2) {System.err.println("Usage: java Test <reference string size> <number of page frames>");System.exit(-1);}PageGenerator ref = new PageGenerator(Integer.valueOf(args[0]).intValue());int[] referenceString = ref.getReferenceString();/** Use either the FIFO or LRU algorithms */ReplacementAlgorithm fifo = new FIFO(Integer.valueOf(args[1]).intValue());ReplacementAlgorithm lru = new LRU(Integer.valueOf(args[1]).intValue());// output a message when inserting a pagefor (int i = 0; i < referenceString.length; i++) {//System.out.println("inserting " + referenceString[i]);lru.insert(referenceString[i]);}// output a message when inserting a pagefor (int i = 0; i < referenceString.length; i++) {//System.out.println("inserting " + referenceString[i]);fifo.insert(referenceString[i]);}// report the total number of page faultsSystem.out.println("LRU faults = " + lru.getPageFaultCount());System.out.println("FIFO faults = " + fifo.getPageFaultCount());}
}
运行结果
参数设置 20-3
参数设置 20-4
思考
在实现了 FIFO 与 LRU 算法后,给定引用序列,试验不同页帧的数量所产
生的缺页次数。并分析:一个算法比另一好么?对给定引用序列,页帧的最佳数
量是多少?假设给定引用序列 1,2,3,4,1,2,5,1,2,3,4,5,当页帧
数分别为 3 和 4 时,用 FIFO 置换算法时缺页中断分别为多少?
根据代码,可以通过修改 Test 类的 main 方法中的 args 数组来改变页面帧的数量和引用序列的大小。以下是分别使用 FIFO 和 LRU 置换算法对给定引用序列进行测试的结果:
(1)当页帧数为 3 时:
使用 FIFO 置换算法,缺页次数为 9
使用 LRU 置换算法,缺页次数为 9
相关文章:
操作系统|| 虚拟内存页置换算法
题目 写一个程序来实现 FIFO 和 LRU 页置换算法。首先,产生一个随机的页面引用序列,页面数从 0~9。将这个序列应用到每个算法并记录发生的页错误的次数。实现这个算法时要将页帧的数量设为可变。假设使用请求调页。可以参考所示的抽象类。 抽象类&…...
AGI大模型(19):下载模型到本地之ModelScope(魔搭社区)
1 安装模块 魔塔社区提供了下载的模块,如下: pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple 2 模型下载 from modelscope import snapshot_download model_dirsnapshot_download(LLM-Research/Meta-Llama-3-8B,cache_dirrD:\…...
常见面试题
1.stringbuffer和stringbuilder的区别,stringbuffer是通过什么实现线程安全的? StringBuffer 和 StringBuilder 都是用于处理可变字符串的类,但它们的主要区别在于 线程安全性。 StringBuffer 的线程安全是通过方法加锁(synchronized&…...
【视觉任务】深度估计(Depth Estimation)介绍(2025年更新)
文章目录 1. 任务定义与意义2. 按输入类型的分类2.1 单目深度估计(Monocular Depth Estimation)2.2 双目与多视图深度估计(Stereo / Multi-view)2.3 深度相机输入(RGB-D)2.4 主动与被动方法 3. 核心方法概述…...
Python 在Excel单元格中应用多种字体样式
文在数据处理和报表生成场景中,Excel 文件的格式设置至关重要。合理的字体格式不仅能提升表格的可读性,还能突出关键数据。本文将详细介绍如何使用免费库Free Spire.XLS for Python,在 Excel 单元格中灵活应用多种字体格式,包括字…...
C++:字符串操作函数
strcpy() 功能:把一个字符串复制到另一个字符串。 #include <iostream> #include <cstring> using namespace std;int main() {char src[] "Hello";char dest[10];strcpy(dest, src);cout << "Copied string: " << …...
Spark,SparkSQL操作Mysql, 创建数据库和表
SparkSQL操作Mysql 1.查看系统内是否有mysql [roothadoop100 ~]# rpm -aq | grep mariadb mariadb-libs-5.5.68-1.el7.x86_64 2.想我上面输出了有结果的即证明有,使用下列命令删除即可 [roothadoop100 ~]# rpm -e --nodeps mariadb-libs 3.进入我们常用存放压缩包…...
降低学习成本,1 天掌握 Java 开发核心技能
在当今数字化浪潮中,Java 编程语言凭借其卓越的跨平台性与稳定性,在企业级系统搭建、移动端应用开发以及大数据处理等领域占据着举足轻重的地位。但不可忽视的是,Java 开发链条冗长,从需求剖析到代码落地的全流程充满挑战…...
类模板的简单实例
author: hjjdebug date: 2025年 05月 16日 星期五 15:06:00 CST description: 类模板的简单实例 文章目录 1.实例代码:2. 模板类写法2.1 模板类的构造函数.2.2 模板类中的语句 3. 模板类的实例化过程.3.1 实例化的进一步试验. 4. 怎样调试constexpr 修饰的函数? 类模…...
描述性统计图表
一、核心图表类型与用途 1、直方图(Histogram) (1)定义:用连续矩形表示数据分布,横轴为数据区间,纵轴为频数或频率。 (2)用途:展示数据分布形态(对称、偏态)、识别离群值。 (3)适用场景:分析连续型变量的分布特征,如收入分布、考试成绩分布。 2、箱线图(Box P…...
【Golang笔记01】Goland基础语法规则
Golang笔记:快速学习Golang基础语法规则 一、基础语法 1.1、环境安装 第一步需要安装go的运行环境,从官网下载安装包:https://golang.google.cn/dl/。 第二步需要安装go的开发工具,可以使用vscode、goland。这里推荐使用golan…...
STM32 ADC+DMA+TIM触发采样实战:避坑指南与源码解析
知识点1【TRGO的介绍】 1、TRGO的概述 TRGO:Trigger Output(触发输出),是定时器的一种功能。 它可以作为外设的启动信号,比如ADC转换,DAC输出,DMA请求等。 对于ADC来说,可以通过…...
Gmsh 读取自定义轮廓并划分网格:深入解析与实践指南
一、Gmsh 简介 (一)Gmsh 是什么 Gmsh 是一款功能强大的开源有限元网格生成器,广泛应用于工程仿真、数值模拟以及计算机图形学等领域。它为用户提供了从几何建模到网格划分的一整套解决方案,能够有效处理复杂几何形状,生成高质量的二维和三维网格,满足多种数值方法的需求…...
Elasticsearch/OpenSearch 中doc_values的作用
目录 1. 核心作用 2. 适用场景 3. 与 index 参数的对比 4. 典型配置示例 场景 1:仅用于聚合,禁止搜索 场景 2:优化大字段存储 5. 性能调优建议 6. 底层原理 doc_values 是 Elasticsearch/OpenSearch 中用于优化查询和聚合的列式存储结…...
如何在 Windows 10 或 11 上使用命令提示符安装 PHP
我们可以在 Windows 上从其官方网站下载并安装 PHP 的可执行文件,但使用命令提示符或 PowerShell 更方便。 PHP 并不是一种新的或不为人知的脚本语言,它已经存在并被全球数千名网络开发人员使用。它以开源许可并分发,广泛用于 LAMP 堆栈中。然而,与 Linux 相比,它在 Wind…...
SZU 编译原理
总结自 深圳大学《编译原理》课程所学相关知识。 文章目录 文法语法分析自顶向下的语法分析递归下降分析LL(1) 预测分析法FIRST 集合FOLLOW 集合 文法 乔姆斯基形式语言理论: 表达能力:0型文法 > 1型文法 > 2型文法 > 3型文法。 0 型文法&am…...
灌区量测水自动化监测解决方案
一、方案背景 随着社会发展和人口增长,水资源需求不断增大。我国水资源总量虽然丰富,但时空分布不均,加之农业用水占比大且效率偏低,使得水资源短缺问题日益凸显。农业用水一直是我国的耗水大户,占全部耗水总量的60%以…...
CVE-2017-8046 漏洞深度分析
漏洞概述 CVE-2017-8046 是 Spring Data REST 框架中的一个高危远程代码执行漏洞,影响版本包括 Spring Data REST < 2.5.12、2.6.7、3.0 RC3 及关联的 Spring Boot 和 Spring Data 旧版本。攻击者通过构造包含恶意 SpEL(Spring Expression Language&…...
1基·2台·3空间·6主体——蓝象智联解码可信数据空间的“数智密码”
近日,由全国数据标准化技术委员会编制的《可信数据空间 技术架构》技术文件正式发布,标志着我国数据要素流通体系向标准化、规范化迈出关键一步。该文件从技术功能、业务流程、安全要求三大维度对可信数据空间进行系统性规范,为地方、行业及企…...
MySQL的存储过程
这一部分比较重要,加油!!!部分代码忘记保存了,嘻嘻,练习代码在最后,大家共勉!!! 通俗来讲,视图是死的,但是这个可以根据传入的参数不同…...
spring学习->sprintboot
spring IoC(控制翻转): 控制:资源的控制权(资源的创建,获取,销毁等) 反转:和传统方式不一样(用上面new什么),不用new让ioc来发现你用什么,然后我来给什么 DI:(依赖注入) 依赖:组件的依赖关系。如newsController依赖NewsServi…...
如何排查阻塞语句
文章目录 文档用途详细信息 文档用途 查询阻塞当前sql的语句,并结束阻塞语句。 详细信息 1、通过pg_stat_activity视图和pg_blocking_pids函数查找阻塞sql。 highgo# select pid,pg_blocking_pids(pid),wait_event_type,wait_event,query from pg_stat_activity…...
TIP-2021《SRGAT: Single Image Super-Resolution With Graph Attention Network》
推荐深蓝学院的《深度神经网络加速:cuDNN 与 TensorRT》,课程面向就业,细致讲解CUDA运算的理论支撑与实践,学完可以系统化掌握CUDA基础编程知识以及TensorRT实战,并且能够利用GPU开发高性能、高并发的软件系统…...
【AI学习】AI大模型技术发展研究月报的生成提示词
AI大模型技术发展研究月报生成提示词 请输出AI大模型技术发展研究月报,要求如下: —————————— 任务目标 在今天({{today}})往前连续 30 天内,检索已正式公开发表的、与AI大模型(参数量 ≥10B&am…...
深入理解 Git 分支操作的底层原理
在软件开发的世界里,Git 已经成为了版本控制的标配工具。而 Git 分支功能,更是极大地提升了团队协作和项目开发的效率。我们在日常开发中频繁地创建、切换和合并分支,但是这些操作背后的底层原理是怎样的呢?在之前的博客探秘Git底…...
泰迪杯特等奖案例深度解析:基于多模态融合与小样本学习的工业产品表面缺陷智能检测系统
(第九届泰迪杯数据挖掘挑战赛特等奖案例全流程拆解) 一、案例背景与核心挑战 1.1 工业质检痛点分析 在3C电子、汽车零部件等高端制造领域,产品表面缺陷(划痕、凹陷、氧化等)检测是质量控制的核心环节。传统人工目检存在效率低(平均检测速度3秒/件)、漏检率高(约15%)…...
Go语言爬虫系列教程 实战项目JS逆向实现CSDN文章导出教程
爬虫实战:JS逆向实现CSDN文章导出教程 在这篇教程中,我将带领大家实现一个实用的爬虫项目:导出你在CSDN上发布的所有文章。通过分析CSDN的API请求签名机制,我们将绕过平台限制,获取自己的所有文章内容,并以…...
轨道炮--范围得遍历,map巧统计
1.思路很难想,但代码一看一下就明白了,就是模拟时间,map存起来遍历也不受10*6影响 2.每次先统计点对应的直线,再动这个点,map一遍历实时更新ma统计max,AC!!!! https://www.luogu.com.cn/problem/P8695 #i…...
python中集合的操作
Python中的集合(Set)是一种无序、可变且元素唯一的数据结构,主要用于去重和数学运算。以下是核心操作分类: 1. 集合创建 大括号创建:s {1, 2, 3}(空集合必须用set())构造函数:…...
常见激活函数——作用、意义、特点及实现
文章目录 激活函数的意义常见激活函数及其特点1. Sigmoid(Logistic 函数、S型函数)2. Tanh(双曲正切函数)3. ReLU(Rectified Linear Unit修正线性单元)4. Softmax5. Swish(Google 提出ÿ…...
FC7300 Trigger MCAL配置引导
FC7300包含4个触发器选择(TRGSELs)。详细的连接信息将在章节中描述。Trigger Select (TRGSEL)源。TRGSEL模块允许软件为外设选择触发器源。 TRGSEL提供了一种极其灵活的机制,用于将各种触发器源连接到多个引脚/外设。 在TRGSEL中,每个控制寄存器最多支持4个输出触…...
组件导航 (HMRouter)+flutter项目搭建-混合开发+分栏效果
组件导航 (Navigation)flutter项目搭建 接上一章flutter项目的环境变量配置并运行flutter 1.flutter创建项目并运行 flutter create fluter_hmrouter 进入ohos目录打开编辑器先自动签名 编译项目-生成签名包 flutter build hap --debug 运行项目 HMRouter搭建安装 1.安…...
WAS和Tomcat的对比
一、WAS和Tomcat的对比 WebSphere Application Server (WAS) 和 Apache Tomcat 是两款常用的 Java 应用服务器,但它们有许多显著的区别。在企业级应用中,它们扮演不同的角色,各自有其特点和适用场景。以下是它们在多个维度上的详细对比&…...
GPU Runtime Suspend 调试与验证:从 sysfs 到 perf 分析
选题背景:在基于 NXP i.MX8MP 平台调试 GPU 时,常常需要确认 Vivante GPU2D/ Vivante GPU2D/\uGPU3D 是否已经进入 runtime suspend ,以降为一篇完整的验证和分析步骤,适合用于实战调试与面试表达。 一、什么是 Runtime Suspend&a…...
响应式布局
布局方式 固定宽度布局:主流的宽度有960px/980px/1190px/1210px等。移动端用户需要缩放查看页面内容 流式布局:百分比设置相对宽度。在不同设备上都能完整显示。兼容性一般,可能发生错位 响应式布局:一套代码自动适配不同终端。检测设备信息,根据设备调整布局。用户体验最…...
简单入门RabbitMQ
本章将带大家来写一个简单的程序,使用 Java 创建RabbitMQ 的生产者和消费者 依赖引入 在 Maven 仓库中输入 amqp-client: 找到第一个 RabbitMQ Java Client ,点击进去找到一个合适的版本然后将依赖引入到我们项目中的 pom.xml 文件中。 …...
金属加工液展|切削液展|2025上海金属加工液展览会
2025上海金属加工液展览会 时间:2025年12月2-4日 地点:上海新国际博览中心 2025上海金属加工液展规划30000平方米展览规模,预设展位1200个,将为国内外加工液产业提供一个集“展示、合作、交易、发展”于一体的综合性平台&#…...
前端实现流式输出《后端返回Markdown格式文本,前端输出类似于打字的那种》
一、使用插件 插件名称:marked 版本:15.0.11 安装插件:npm install marked15.0.11 作用:marked 是一个用于将 Markdown 语法转换为 HTML 的 JavaScript 库 插件2名称:dompurify 版本:3.2.5 安装插件&…...
Python字符串常用方法详解
文章目录 Python字符串常用方法详解一、字符串大小写转换方法(常用)1. 基础大小写转换2. 案例:验证码检查(不区分大小写) 二、字符串查找与替换方法1. 查找相关方法2. 替换相关方法 三、字符串判断方法1. 内容判断方法 四、字符串分割与连接方…...
深度学习中的归一化:提升模型性能的关键因素
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型辅助完成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认…...
【C++】 —— 笔试刷题day_30
一、爱吃素 题目解析 这道题,简单来说就是给定两个数a和b,然后让我们判断a*b是否是素数。 算法思路 这道题还是比较简单的 首先,输入两个数a和b,这两个数的数据范围都是[1, 10^11];10的11次方,那a*b不就是…...
WebMvcConfigurer介绍-笔记
1.WebMvcConfigurer功能简介 org.springframework.web.servlet.config.annotation.WebMvcConfigurer 是 Spring MVC 提供的一个接口,用于自定义 Web 应用的配置。通过实现该接口,开发者可以灵活地添加拦截器(Interceptors)、配置…...
简单图像自适应亮度对比度调整
一、背景介绍 继续在刷对比度调整相关算法,偶然间发现了这个简单的亮度/对比度自适应调整算法,做个简单笔记记录。也许后面用得到。 二、自适应亮度调整 1、基本原理 方法来自论文:Adaptive Local Tone Mapping Based on Retinex for High Dynamic Ran…...
[SpringBoot]Spring MVC(2.0)
紧接上文,这篇我们继续讲剩下的HTTp请求 传递JSON数据 简单来说:JSON就是⼀种数据格式,有⾃⼰的格式和语法,使⽤⽂本表⽰⼀个对象或数组的信息,因此JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换 JSON的语法 1. 数据在 键值对(Key/Value) …...
GDB 高级调试技术深度解析
1. 引言 GNU调试器(GDB)是软件开发和逆向工程领域中不可或缺的工具。它为开发者提供了一个强大的环境,用于检查正在运行的程序或程序崩溃后产生的核心转储文件的内部状态。虽然许多开发者熟悉GDB的基本命令,如设置断点和单步执行,但GDB的真正威力在于其丰富的高级功能集。…...
【Kuberbetes】详谈网络(第三篇)
目录 前言 一、K8S的三种网络 1.1 Pod 内容器与容器之间的通信 1.2 同一个 Node 内 Pod 之间的通信 1.3 不同 Node 上 Pod 之间的通信 1.4 汇总 二、K8S的三种接口 三、VLAN 和 VXLAN 的区别 3.1 使用场景不同 3.2 支持的数量不同 3.3 是否记录到MAC地址表中…...
【科普】具身智能
一、具身智能的基本概念与理论框架 具身智能(Embodied Intelligence, EI)是指智能体通过物理身体与环境的实时交互,实现感知、决策和行动的能力。其核心思想是“智能源于身体与环境的互动”,而非仅仅依赖于抽象的计算或符号处理。…...
java -jar命令运行 jar包时如何运行外部依赖jar包
java -jar命令运行 jar包时如何运行外部依赖jar包 场景: 打包发不完,运行时。发现一个问题, java java.lang.NoClassDefFoundError: org/apache/commons/lang3/ArrayUtils 显示此,基本表明,没有这个依赖,如果在开发…...
Linux进程信号(一)之信号的入门
文章目录 信号入门1. 生活角度的信号2. 技术应用角度的信号3. 注意4. 信号概念5.用kill -l命令可以察看系统定义的信号列表6. 信号处理常见方式 信号入门 1. 生活角度的信号 你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也…...
腾讯云MCP数据智能处理:简化数据探索与分析的全流程指南
引言 在当今数据驱动的商业环境中,企业面临着海量数据处理和分析的挑战。腾讯云MCP(Managed Cloud Platform)提供的数据智能处理解决方案,为数据科学家和分析师提供了强大的工具集,能够显著简化数据探索、分析流程,并增强数据科学…...