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

操作系统 3.5-内存换入-请求调页

案例分析内存换入

内存换入分析:

内存换入(Swapping)是指操作系统将不常使用的内存页从物理内存(RAM)移动到磁盘上的交换空间(Swap Space),以释放物理内存供其他进程使用。当需要访问这些被换出的内存页时,操作系统会将它们重新加载到物理内存中,这个过程称为换入(Swapping In)。

在图中所示的内存管理模型中,内存换入的过程可以如下分析:

  1. 识别不活跃的内存页

    • 操作系统通过监控内存使用情况,识别哪些内存页不常被访问或可以暂时移除。

  2. 选择换出目标

    • 根据一定的策略(如最近最少使用LRU算法),选择需要换出的内存页。

  3. 写入磁盘

    • 将选定的内存页写入到磁盘上的交换空间。

  4. 更新页表

    • 在页表中标记这些页为不在物理内存中(例如,设置页表项的状态位)。

  5. 释放物理内存

    • 释放这些内存页占用的物理内存,供其他进程使用。

  6. 换入请求

    • 当进程需要访问被换出的内存页时,触发缺页中断。

  7. 从磁盘读取

    • 操作系统从磁盘上的交换空间读取所需的内存页。

  8. 更新页表

    • 在页表中更新这些页的状态,标记为在物理内存中。

  9. 分配物理内存

    • 为这些内存页分配新的物理内存空间。

  10. 继续执行

    • 进程可以继续访问这些内存页,操作系统确保内存访问的透明性。

Swap In的实现原理

在操作系统中,用户眼里的内存是一个连续的、大小为4GB的虚拟内存空间,这个空间被分为不同的段,如用户栈段、用户代码段、用户数据段和操作系统段。

用户可以随意使用这个虚拟内存空间,而不需要关心它如何映射到物理内存。

这种内存管理方式提供了内存使用的灵活性和抽象性,但同时也需要操作系统来管理内存的映射和物理内存的实际使用。

虚拟内存的实现原理---换入与映射机制

这张图解释了操作系统如何通过换入(Swap In)和换出(Swap Out)机制以及映射(Mapping)来实现“大内存”的幻象。即使物理内存有限,操作系统也能让程序感觉它们拥有比实际物理内存更大的内存空间。以下是图中信息的详细解释:

虚拟内存与物理内存:

  • 虚拟内存:用户程序看到的是一个大的、连续的内存空间,图中显示为4GB。

  • 物理内存:实际的硬件内存,图中显示为1GB。

换入换出实现大内存:

  1. 映射机制

    • 当程序访问虚拟内存的某个部分时(例如,访问地址p=0G-1G),操作系统将这部分虚拟内存映射到物理内存。

    • 这个过程是动态的,只有在程序请求访问某个内存区域时才进行映射。

  2. 分部分映射

    • 由于物理内存有限(图中为1GB),操作系统只能将虚拟内存的一部分映射到物理内存。

    • 当程序访问虚拟内存的另一部分(例如,p=3G-4G)时操作系统会将之前映射的部分换出,并将新的部分映射到物理内存。

  3. 按需映射

    • 操作系统只在程序请求访问某个内存区域时才进行映射,这样可以有效地利用有限的物理内存。

虚拟内存的实现原理:

  • 换入换出:当物理内存不足时,操作系统会将一些不常使用的内存页换出到磁盘上的交换空间(Swap Space),并在需要时将它们换入到物理内存。

换入与映射机制的分析:

  • 换入:当程序访问一个不在物理内存中的内存页时,操作系统会从交换空间将该页加载到物理内存。

  • 映射:操作系统更新页表或段表,将虚拟地址映射到新的物理地址。

  • 换出:当物理内存需要为新的内存页腾出空间时,操作系统会选择一些不常使用的内存页换出到交换空间。

实现请求调页的理论原理

请求调页的实现步骤

  1. 地址生成

    • 程序运行时,根据段号和偏移(例如,段寄存器cs和指令指针ip)生成逻辑地址。

  2. 地址转换

    • 逻辑地址通过段表和页表转换为虚拟地址。

  3. 页表查找

    • 操作系统查找页表,确定虚拟地址对应的页是否已在物理内存中。

  4. 缺页中断

    • 如果页不在物理内存中,触发缺页中断。此时,CPU停止当前程序的执行,并跳转到缺页中断处理程序。

  5. 页错误处理

    • 缺页中断处理程序运行,首先保存当前程序的状态(例如,将寄存器值压栈)。

  6. 读取磁盘

    • 从磁盘上的交换空间(Swap Space)中读取所需的页到物理内存。

  7. 页表更新

    • 更新页表,将虚拟页映射到新的物理页。

  8. 恢复执行

    • 恢复程序状态,继续执行导致缺页中断的指令。

图示解释

  1. 逻辑地址生成

    • 用户程序通过段号和偏移生成逻辑地址。

  2. 页表查找

    • 逻辑地址转换为虚拟地址后,操作系统查找页表。

  3. 缺页处理

    • 如果页不在物理内存中,操作系统通过页错误处理程序从磁盘读取页,并更新页表。

  4. 物理内存映射

    • 页加载到物理内存后,页表更新,将虚拟页映射到物理页。

  5. 程序继续执行

    • 页表更新完成后,程序可以继续执行。

请求调页的代码实现

从中断开始

提取的代码

void trap_init(void)
{set_trap_gate(14, &page_fault);
}
​
#define set_trap_gate(n, addr) \_set_gate(&idt[n], 15, 0, addr);

代码解释

  1. 函数 trap_init

    • 这个函数用于初始化函数(trap),在这里特指页错误中断的处理。

    • 它调用 set_trap_gate 函数,将中断号为14的中断(页错误中断)关联到 page_fault 处理函数。

  2. 宏定义 set_trap_gate

    • 这是一个宏,用于设置中断描述符表(IDT)中的一个条目。

    • n 是中断号,addr 是中断处理函数的地址。

    • _set_gate 函数用于设置IDT中的一个门描述符,这里设置的是陷阱门(trap gate)。

    • 第二个参数15表示中断门,第三个参数0通常表示门描述符的特权级,最后一个参数 addr 是中断处理函数的地址。

页缺失中断处理

图中展示的是Linux操作系统中处理页错误(Page Fault)中断的汇编代码。这段代码位于 linux/mm/page.s 文件中,是内核的一部分,用于处理页错误中断。以下是提取的代码和总结:

提取的代码:

.globl _page_fault
_page_fault:// 取出错码到 eax。错误码被压入栈中,这里将其与 eax 交换位置。xchgl %eax, (%esp)  // 将栈顶的错误码与 eax 交换,此时 eax 中保存错误码// 保存寄存器状态,以便后续恢复pushl %ecx          // 保存 ecx 寄存器pushl %edx          // 保存 edx 寄存器push %ds            // 保存 ds 段寄存器push %es            // 保存 es 段寄存器push %fs            // 保存 fs 段寄存器// 设置内核数据段选择符,确保后续操作在内核空间进行movl $0x10, %edx    // 内核数据段选择符为 0x10mov %dx, %ds        // 设置 ds 段寄存器为内核数据段选择符mov %dx, %es        // 设置 es 段寄存器为内核数据段选择符mov %dx, %fs        // 设置 fs 段寄存器为内核数据段选择符// 获取引起页面异常的线性地址movl %cr2, %edx     // cr2 寄存器保存引起页面异常的线性地址// 压入参数,将线性地址和错误码压入栈中,作为将调用函数的参数pushl %edx          // 压入线性地址pushl %eax          // 压入错误码// 测试标志 P(位 0),判断是否为缺页异常testl $1, %eax      // 测试错误码的最低位(P 标志)jne 1f              // 如果不是缺页异常,跳转到标签 1// 调用缺页处理函数 _do_no_pagecall _do_no_page    // 处理缺页异常jmp 2f              // 跳转到标签 2,清理堆栈并恢复寄存器1:  // 如果是写保护异常call _do_wp_page    // 调用写保护处理函数2:  // 清理堆栈并恢复寄存器addl $8, %esp       // 弹出压入的两个参数(线性地址和错误码)pop %fs             // 恢复 fs 段寄存器pop %es             // 恢复 es 段寄存器pop %ds             // 恢复 ds 段寄存器popl %edx           // 恢复 edx 寄存器popl %ecx           // 恢复 ecx 寄存器popl %eax           // 恢复 eax 寄存器iret                // 返回用户模式

代码解释:

  1. 全局标签 _page_fault

    • 定义了一个全局标签 _page_fault,这是页错误中断的处理函数。

  2. 寄存器保存

    • 使用 xchg 指令将 %eax 寄存器的值与栈顶的值交换,并将 %eax 的原始值压入栈中。

    • 依次将 %ecx%edx%ds%es%fs 寄存器的值压入栈中,以保存当前的寄存器状态。

  3. 设置段寄存器

    • 0x10(内核数据段的选择子)加载到 %edx 寄存器中,并将 %edx 的值写入 %ds%es%fs 寄存器,以设置内核数据段。

  4. 获取页错误线性地址

    • 使用 movl %cr2, %edx 指令将页错误线性地址加载到 %edx 寄存器中。

  5. 压入参数

    • %edx%eax 寄存器的值压入栈中,作为函数调用的参数。

  6. 测试标志

    • 使用 testl %eax, %eax 指令测试 %eax 寄存器的值,并根据测试结果跳转到不同的代码段。

  7. 调用处理函数

    • 如果 %eax 寄存器的值为零,则调用 _do_no_page 函数处理页错误。

    • 否则,调用 _do_wp_page 函数处理写保护错误。

  8. 恢复现场

    • 在函数调用完成后,使用 add $8, %esp 指令调整栈指针,以移除压入栈中的参数。

    • 依次弹出保存的寄存器值,恢复现场。

  9. 中断返回

    • 使用 iret 指令从中断返回,恢复程序的执行。

总结:

页缺失中断处理是操作系统虚拟内存管理中的一个关键环节,它最终实现了以下几个主要功能:

  1. 内存访问合法性检查

    • 确认触发页缺失中断的内存访问是否合法,例如检查访问的地址是否在程序的地址空间内。

  2. 页面置换

    • 如果当前进程的物理内存不足以加载所需的页面,则可能需要从物理内存中移除(置换)某个页面,以便为新页面腾出空间。

  3. 页面分配

    • 为缺失的页面分配物理内存(页框)。

  4. 页面调入

    • 从磁盘上的交换区或文件系统中将缺失的页面内容读入到分配的物理内存中。

  5. 页表更新

    • 更新页表以反映新的虚拟地址到物理地址的映射关系。

  6. 内存保护

    • 确保进程只能访问其地址空间内的合法内存区域,防止进程间内存非法访问。

  7. 错误处理

    • 如果页缺失是由于错误(如访问了无效的内存地址)引起的,操作系统需要进行相应的错误处理。

  8. 提高内存利用率

    • 通过将不常使用的页面换出到磁盘,操作系统可以提高物理内存的利用率,允许更多的进程同时运行。

没有页面映射的情况

图中展示的是Linux操作系统中处理页错误(Page Fault)时调用的 do_no_page 函数的C代码。这段代码位于 linux/mm/memory.c 文件中,用于处理没有页面映射的情况。以下是提取的代码和总结:

提取的代码:

// 在linux/mm/memory.c中
void do_no_page(unsigned long error_code, unsigned long address)
{address &= 0xfffff000;  // 页面地址tmp = address - current->start_code;  // 页面对应的偏移
​if (!current->executable || tmp >= current->end_data) {get_empty_page(address);return;}
​page = get_free_page();bread_page(page, current->executable->i_dev, nr);put_page(page, address);
}
​
void get_empty_page(unsigned long address)
{unsigned long tmp = get_free_page();put_page(tmp, address);
}

代码解释:

  1. 函数 do_no_page

    • 这个函数处理没有页面映射的情况,即页错误中断。

    • address 参数是发生页错误的虚拟地址。

  2. 页面地址计算

    • 使用 address &= 0xfffff000 将地址转换为页面地址(清除低12位,因为页面大小为4KB)。

  3. 页面偏移计算

    • 计算页面相对于程序代码段的偏移量。

  4. 检查页面范围

    • 检查偏移量是否在程序的可执行代码范围内。如果不在范围内,调用 get_empty_page 获取一个空页面并返回。

  5. 获取空闲页面

    • 调用 get_free_page 获取一个空闲页面。

  6. 读取页面内容

    • 调用 bread_page 从文件系统中读取页面内容到空闲页面。

  7. 映射页面

    • 调用 put_page 将页面映射到指定的虚拟地址。

  8. 函数 get_empty_page

    • 这个函数用于获取一个空页面并将其映射到指定的虚拟地址。

有没有页面映射的情况

图中展示的是Linux操作系统中 put_page 函数的C代码,该函数用于将一个物理页面映射到指定的虚拟地址。以下是提取的代码和总结:

提取的代码:

// 在linux/mm/memory.c中
unsigned long put_page(unsigned long page, // 物理地址unsigned long address)
{unsigned long tmp, *page_table;page_table = (unsigned long *)(((address >> 20) & 0xffc));
​if ((*page_table) & 1)page_table = (unsigned long *)(0xfffff000 & *page_table);else {tmp = get_free_page();*page_table = tmp | 7;page_table = (unsigned long *)tmp;}page_table[(address >> 12) & 0x3ff] = page | 7;return page;
}

代码解释:

  1. 函数定义

    • put_page 函数接受两个参数:page(物理地址)和address(虚拟地址)。

  2. 计算页目录项

    • 使用 address 的高20位(通过右移20位并和 0xffc 进行位与操作)来计算页目录项的地址。

  3. 检查页目录项

    • 检查页目录项的最低位是否为1,这表示该项是否已经指向一个页表。

  4. 页表地址计算

    • 如果页目录项已经指向一个页表,则直接计算页表的地址。

    • 如果页目录项未指向页表,则需要分配一个新页表,并更新页目录项。

  5. 分配页表

    • 如果页表不存在,则调用 get_free_page 函数分配一个新的页表,并更新页目录项。

  6. 设置页表项

    • 计算页表项的索引(通过 address 的中间12位)。

    • 将物理页面地址和一些属性(如存在位、读写位等)设置到页表项中。

  7. 返回物理页面

    • 函数返回物理页面地址。

相关文章:

操作系统 3.5-内存换入-请求调页

案例分析内存换入 内存换入分析: 内存换入(Swapping)是指操作系统将不常使用的内存页从物理内存(RAM)移动到磁盘上的交换空间(Swap Space),以释放物理内存供其他进程使用。当需要访…...

stm32工程,拷贝到另一台电脑编译,错误提示头文件找不到cannot open source input file “core_cm4.h”

提示 cannot open source input file “core_cm4.h” ,找不到 [ core_cm4.h ] 这个头文件 . 于是我在原电脑工程文件里找也没有找到这个头文件 接下来查看原电脑keil的头文件引入配置,发现只引入了工程文件下的头文件, 那么core_cm4.h到底哪里来的? (到现在我也不清楚怎…...

使用platformio如何定位hard fault错误

这里写自定义目录标题 前言过程记录结语前言 hard fault是单片机开发过程中经常会遇到的问题,通常是内存溢出、野指针访问等导致,对于有经验的工程师,在代码改动不大的情况下,一般可以通过代码审查定位到问题原因,但也有很多情况下需要借助调试工具进行定位,像Keil就有比…...

全局异常处理器的基本使用

那使用全局异常处理器可以么? 是的,使用全局异常处理器是一个非常好的选择,因为它可以将异常处理逻辑集中化,避免在 Service 层或 Controller 层中重复编写异常处理代码。以下是使用全局异常处理器来处理添加用户时 username 唯一…...

python入门:简单介绍和python和pycharm软件安装/学习网址/pycharm设置(改成中文界面,主题,新建文件)

Python 目前是 AI 开发的首选语言 软件安装 python解释器 官网下载 Python |Python.org 勾选 Add python.exe to PATH 将python.exe添加到PATH 勾选这个选项会将Python的可执行文件路径添加到系统的环境变量PATH中。这样做的好处是,你可以在命令行中从任何位置直…...

众趣科技助力商家“以真示人”,让消费场景更真实透明

在当今的消费环境中,消费者权益保护问题日益凸显。无论是网购商品与实物不符、预定酒店民宿与图文描述差异大,还是游览景区遭遇“照骗”,这些问题不仅让消费者在消费和决策过程中倍感困扰,也让商家面临信任危机。 消费者在享受便…...

【Redis】string类型

目录 1、介绍2、底层实现【1】SDS【2】int编码【3】embstr编码【4】raw编码【5】embstr和raw的区别 3、常用指令【1】字符串基本操作:【2】批量操作【3】计数器【4】过期时间【5】不存在就插入 4、使用场景 1、介绍 string是redis中最简单的键值对形式,…...

EPLAN许可证更新教程

随着电气设计软件的不断更新和优化,确保您的EPLAN许可证始终是最新版本对于顺畅的项目管理至关重要。本文将为您提供一份详尽的EPLAN许可证更新教程,帮助您轻松完成更新操作,确保您的软件始终保持最佳状态。 一、为什么需要更新EPLAN许可证&…...

学习笔记五——Rust 控制流全解析

📚 目录 什么是控制流?Rust 有什么特别?if 表达式完整语法loop / while / for 三种循环写法match 表达式 _ 通配符深入解释if let 表达式用法与场景Option、Some、None 全面通俗讲解 "Tom" 和 "Tom".to_string() 有啥本…...

远程桌面协议(RDP)详解:原理、优势与局限和优化方案分享

文章目录 导言一. RDP的工作原理二. RDP的优势三. RDP的局限性四. RDP的优化与替代方案五. 内网穿透远程访问总结 导言 远程桌面协议(RDP)是一种微软开发的专有协议,允许用户通过网络连接到另一台计算机,并像操作本地计算机一样进行操作。它广泛应用于远…...

Linux 系统管理常用命令

以下是 Linux 系统管理常用命令 的详细介绍,涵盖 IP地址查看、端口管理、进程监控 等核心操作,并附上实际示例: 一、查看网卡 IP 地址 1. 使用 ip 命令 # 查看所有网络接口信息(包括 IP 地址) ip addr show# 查看特定…...

蓝桥杯篇---客观题

文章目录 前言 前言 本文简单介绍了蓝桥杯中客观题各个部分的知识点。 一、单片机相关 IAP15F2K61S2单片机的定时器0具有4种工作模式,当采用外部12MHz晶振时,定时器最大定时长度65535us。8051单片机的P0口,当使用外部存储器时它是一个传输低…...

RK3568 基于Gstreamer的多媒体调试记录

文章目录 1、环境介绍2、概念理清3、提前准备4、GStreamer编译5、GStreamer基础介绍6、视频播放初体验7、视频硬编码7.1、h2647.2、h265 8、视频硬解码8.1、解码视频并播放解码视频并播放带音频 1、环境介绍 硬件:飞凌ok3568-c开发板 软件:原厂rk356x …...

ZYNQ笔记(五):AXI GPIO 中断

版本:Vivado2020.2(Vitis) 任务:使用 AXI GPIO IP 核以中断方式实现按键 KEY 控制 LED 亮灭翻转(两个都在PL端) 目录 一、介绍 二、硬件设计 三、软件设计 四、效果 一、介绍 AXI GPIO 中断通常…...

C++23 多维下标运算符:探索 P2128R6 提案

文章目录 一、背景与动机二、语法与实现2.1 语法2.2 实现方式 三、应用场景3.1 多维数组3.2 自定义数据结构3.3 并行计算 四、性能影响4.1 编译时优化4.2 自定义数据结构的优化 五、总结 C23 引入了许多新特性,其中之一便是多维下标运算符(P2128R6&#…...

原理图设计准备:页面栅格模板应用设置

一、页面大小的设置 (1)单页原理图页面设置 首先,选中需要更改页面尺寸的那一页原理图,鼠标右键,选择“Schmatic Page Properties”选项,进行页面大小设置。 (2)对整个原理图页面设…...

LeeCode 409.最长回文串

给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s "abccccdd" 输出:7 解释: 我们可以构造的…...

保护PCBA的不同方法:喷三防漆 vs 镀膜

PCBA(印刷电路板组件)的防护工艺中,喷三防漆和镀膜(如Parylene气相沉积)是两种常见技 术。它们在防护目的上类似,但在具体实现方式和应用场景上有显著差异。以下从外观、工艺、性 能、物理性质和成本五个…...

XILINX FPGA万兆光电口PXIE板卡设计

主要性能指标 1、 FPGA 型号: XC7K325-TFFG676-2 ; 2、 网络端口速率 : 10Gbps/1Gbps/2.5Gbps ; 3、 网络端口形式 : 3 路 SFP 万兆光电口 ; 4、 内存数量: 4Gb 4 ; 5、 内存带宽&…...

LangChain4j实战-Java AI应用开源框架之LangChain4j和Spring AI

今天这篇文章我来分享LangChain4j实战-Java AI应用开源框架之LangChain4j和Spring AI。 在贝恩聊架构AI专栏中通过学习如何使用Java相关AI应用开源框架,到后续开发企业级Java AI应用,将大型语言模型和AI工具集成到现有系统中。我们将重点介绍如何使用Sp…...

机器学习十大算法全解析机器学习,作为人工智能的基石,涵盖了众多高效的算法。今天,我们就来深入探讨其中的十大核心算法!

1️⃣ 线性回归:通过最小化误差的平方和来寻找最佳函数匹配。 2️⃣ 逻辑回归:用于分类问题,通过逻辑函数来预测事件发生的概率。 3️⃣ 决策树:基于特征选择和阈值来构建树形结构,用于分类和回归。 4️⃣ 朴素贝叶…...

day26图像处理OpenCV

文章目录 一、OpenCV1.介绍2.下载3.图像的表示4.图像的基本操作4.1图片读取或创建4.1.1读取4.1.2创建 4.2创建窗口4.3显示图片4.3.1设置读取的图片4.3.2设置显示多久4.3.3释放 4.4.保存图片4.5图片切片(剪裁)4.6图片大小调节 5.在图像中绘值5.1绘制直线5…...

怎么查询SQL Server AlwaysOn

1. SQL Server AlwaysOn 是什么? SQL Server AlwaysOn 是 Microsoft 提供的高可用性(High Availability, HA)和灾难恢复(Disaster Recovery, DR)解决方案,包含以下两个核心技术: 组件描述故障…...

10分钟做了一个投资回报计算器,欢迎大家使用

一、背景 今天突然想算一下1万本金,2%利率存2年情况下的投资回报收益情况,但是发现手上没有计算器,想着自己做一个网页简单实现一下,于是有了这个小工具(FutureValueCalculator——未来价值计算器)。 二、…...

报错:mount: unknown filesystem type ‘vfat’

服务器重启之后 进入 Ctrl D 界面 界面报错是 FAILED to mount /boot/efi 输入密码进去之后 (py38) [rootlocalhost data]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 1.5T 0 disk ├─sda1 8:1 0 50M 0 part /bo…...

Java学习手册:面向对象编程核心概念

面向对象编程(OOP)是Java语言的核心编程范式,它强调通过对象之间的交互来实现程序功能。OOP的核心思想是将现实世界中的事物抽象为对象,通过对象的属性和行为来描述和操作这些事物。本文将深入探讨Java中面向对象编程的三大核心概…...

工厂模式(简单工厂,工厂方法,抽象工厂)

工厂模式 工厂模式是java中最常用的设计模式,主要是用来完成对象的创建,使得对象创建过程和对象使用过程分离。 简单来说是取消对象创建者和使用者的耦合,简化new 对象的创建。 优势 :对象的属性创建完整。 缺点: 创建…...

【实际项目分享】多相机取图存图问题

1、项目介绍 针对 ​​5路相机同步取图​​ 场景,设计了一套高并发、低延迟的图像数据管理方案,重点解决多线程环境下的数据竞争与存储效率问题。 2、设计目标​​ ​​高并发写入​​:支持5个相机线程同时写入数据,无锁冲突​​…...

LLMs基础学习(七)DeepSeek专题(1)

LLMs基础学习(七)DeepSeek专题(1) 文章目录 LLMs基础学习(七)DeepSeek专题(1)DeepSeek 相关资料官方资料与基础文档实践指南和技术解析 热启动与冷启动**热启动(主流&…...

安装vllm

ubuntu 22.04, RTX3080, cuda 12.1, cudnn 8.9.7,cuda和cudnn的安装参考:https://blog.csdn.net/m0_52111823/article/details/147154526?spm1001.2014.3001.5501。 查看版本对应关系,下载12.1对应的whl包,https://github.com/vl…...

SVMSPro分布式综合安防管理平台--地图赋能智慧指挥调度新高度

SVMSPro分布式综合安防管理平台–地图赋能智慧指挥调度新高度 在智慧城市建设和公共安全需求日益增长的背景下,SVMSPro分布式综合安防管理平台凭借其强大的地图功能与多协议兼容能力,正在成为公安、司法、消防、城管、交通等领域的指挥调度“智慧大脑”…...

科技快讯 | OpenAI:向Plus和Pro用户推出ChatGPT记忆提升功能;我国成功发射通信技术试验卫星十七号;芯片国产化率超九成

继 OpenAI 后,谷歌 Gemini 模型将支持 Anthropic 的 MCP 协议 4月10日,谷歌DeepMind宣布将支持Anthropic的模型上下文协议(MCP),以实现大语言模型与外部数据源的集成。MCP由Anthropic推出,旨在建立安全双向…...

【教学类-102-08】剪纸图案全套代码08——Python点状虚线优化版本02(有空隙)+制作1图2图6图24图

背景需求 代码实现了点状虚线的全套流程,但是图片中主体图案和虚线与左右两边粘连。 【教学类-102-07】剪纸图案全套代码07——Python点状虚线优化版本01(无空隙)+制作1图2图6图24图-CSDN博客文章浏览阅读665次,点赞11次,收藏11次。【教学类-102-07】剪纸图案全套代码07…...

深入解析 Microcom:嵌入式串口调试利器

在嵌入式系统开发中,串口通信是调试和与外部设备交互的核心手段之一。Linux 系统中,Minicom 是一个广为人知的串口调试工具,但其依赖较多库(如 libncurses),在资源受限的嵌入式环境中可能显得臃肿。 而 Mi…...

算法驱动的场景识别:规则引擎与机器学习的强大结合

引言 在智能驾驶系统、交通分析和安全监控等领域,场景识别是一项核心技术。传统的场景识别方法主要依赖人工标注,不仅耗时耗力,还容易受主观因素影响。随着技术的发展,算法驱动的场景识别方法逐渐兴起,通过结合规则引…...

typescript开发心得

语法知识点 回调地狱问题 用await,或者有些库提供了sync方法 yield 用法跟python的一样。 yield只能用于生成器里,生成器是function*,例如: export function* filter(rootNode: ts.Node, acceptedKind: ts.SyntaxKind) {for…...

淘宝开放平台 API 调用全解析:商品详情数据采集接口接入教程

一、引言 在电商领域蓬勃发展的当下,淘宝作为行业领军者,其平台上琳琅满目的商品蕴含着海量有价值的信息。无论是电商从业者想要精准把握竞品动态、优化自身商品策略,还是数据分析师试图挖掘消费趋势、洞察市场需求,亦或是科研人…...

SQL注入(SQL Injection)深度解析

SQL注入是一种利用Web应用程序与数据库交互机制缺陷的网络攻击技术,其核心在于通过恶意构造的输入参数篡改原始SQL查询逻辑,进而实现对数据库的非授权操作。以下从定义、攻击原理、技术分类、危害及防御体系多维度展开分析: 一、定义与本质 技…...

MCP基础学习四:MCP在AI应用中的集成(MCP在AI应用中的完整架构图)

MCP在AI应用中的集成 文章目录 MCP在AI应用中的集成一,学习目标二,学习内容1. 在AI应用中配置和使用MCP服务1.1 不同AI工具连接方式与部署模式1.1.1 了解不同的MCP传输模式1.1.2 掌握如何在AI客户端中配置MCP服务Cursor 客户端中配置MCP服务Cherry Studio AI客户端中…...

K8S-证书过期更新

K8S证书过期问题 K8S证书过期处理方法 Unable to connect to the server: x509: certificate has expired or is not yet valid 1、查看证书有效期: # kubeadm certs check-expiration2、备份证书 # cp -rp /etc/kubernetes /etc/kubernetes.bak3、直接重建证书 …...

蓝桥杯考前复盘

明天就是考试了,适当的停下刷题的步伐。 静静回望、思考、总结一下,我走过的步伐。 考试不是结束,他只是检测这一段时间学习成果的工具。 该继续走的路,还是要继续走的。 只是最近,我偶尔会感到迷惘,看…...

BERT - MLM 和 NSP

本节代码将实现BERT模型的两个主要预训练任务:掩码语言模型(Masked Language Model, MLM) 和 下一句预测(Next Sentence Prediction, NSP)。 1. create_nsp_dataset 函数 这个函数用于生成NSP任务的数据集。 def cr…...

mysql 与 sqlite 数学运算 精度 问题

mysql 与 sqlite 数学运算 精度 问题 在 Excel 中,浮点运算得到的结果可能不准确 https://learn.microsoft.com/zh-cn/office/troubleshoot/excel/floating-point-arithmetic-inaccurate-result 本文讨论 Microsoft Excel 如何存储和计算浮点数。 由于存在舍入或…...

MySQL的数据库性能分析利器Percona toolkit

目录 简介使用场景 使用示例Mysql 慢查询分析诊断临时开启慢SQL持久化开启慢SQL日志 使用包管理器安装包管理器安装 percona-release使用相应的包管理器安装 Percona Toolkit pt-query-digest 安装安装 pt-query-digest案例实战之慢查询分析诊断查看慢SQL日志使用pt-query-dige…...

力扣HOT100之链表: 148. 排序链表

这道题直接用蠢办法来做的&#xff0c;直接先遍历一遍链表&#xff0c;用一个哈希表统计每个值出现的次数&#xff0c;由于std::map<int, int>会根据键进行升序排序&#xff0c;因此我们将节点的值作为键&#xff0c;其在整个链表中的出现次数作为值&#xff0c;当所有元…...

Azure AI Foundry 正在构建一个技术无障碍的未来世界

我们习以为常的街道和数字世界&#xff0c;往往隐藏着被忽视的障碍——凹凸不平的路面、不兼容的网站、延迟的字幕或无法识别多样化声音的AI模型。这些细节对某些群体而言&#xff0c;却是日常的挑战。正如盲道不仅帮助视障者&#xff0c;也优化了整体城市体验&#xff0c;信息…...

AlmaLinux9.5 修改为静态IP地址

查看当前需要修改的网卡名称 ip a进入网卡目录 cd /etc/NetworkManager/system-connections找到对应网卡配置文件进行修改 修改配置 主要修改ipv4部分&#xff0c;改成自己的IP配置 [ipv4] methodmanual address1192.168.252.129/24,192.168.252.254 dns8.8.8.8重启网卡 …...

P8754 [蓝桥杯 2021 省 AB2] 完全平方数

题目描述 思路 一看就知道考数学&#xff0c;直接看题解试图理解(bushi) 完全平方数的质因子的指数一定为偶数。 所以 对 n 进行质因数分解&#xff0c;若质因子指数为偶数&#xff0c;对结果无影响。若质因子指数为奇数&#xff0c;则在 x 中乘以这个质因子&#xff0c;保证指…...

QT Sqlite数据库-教程001 创建数据库和表-上

【1】创建数据库 #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlRecord> QString path QDir::currentPath(); QApplication::addLibraryPath(pathQString("/release/plugins")); QPluginLoader loader(pathQSt…...

安卓手机怎样开启双WiFi加速

1. 小米/Redmi手机 路径&#xff1a; 设置 → WLAN → 高级设置 → 双WLAN加速 操作&#xff1a; 开启功能后&#xff0c;可同时连接一个2.4GHz WiFi和一个5GHz WiFi&#xff08;或两个不同路由器&#xff09;。 可选择“智能选择”或手动指定辅助网络。 2. 华为/荣耀手机…...