【系统架构设计师】操作系统 ② ( 存储管理 | 页式存储 | 逻辑地址 与 物理地址 | 页表结构 | 物理内存淘汰机制 )
文章目录
- 一、页式存储
- 1、CPU 调用数据
- 2、内存存储数据弊端
- 3、分页存储
- 4、逻辑地址 和 物理地址 的结构
- 5、逻辑地址 和 物理地址 的结构 示例
- 6、页式存储 优缺点
- 二、逻辑地址 与 物理地址
- 1、逻辑地址
- 2、物理地址
- 3、逻辑地址 与 物理地址 区别
- 4、逻辑地址 与 物理地址 的转换
- 三、页表结构 和 物理内存淘汰机制
- 1、页表的结构简介
- 2、物理内存 的 淘汰机制
- 3、物理内存 的 淘汰机制 总结
- 4、案例分析
- 逻辑地址 转 物理地址 案例计算
- 物理地址 页面淘汰 案例计算
一、页式存储
1、CPU 调用数据
存储系统 中 , 操作系统 会将 外存 ( 磁盘 ) 中的数据 , 调入 内存 ( 内存条 ) 中 , 内存中的数据 再 给 CPU 调用 , CPU 中有涉及到 三级高速缓存 和 寄存器 的数据传递 ;
如果 CPU 调用的 数据 不在 内存中 , 此时 CPU 会产生 " 缺页中断 " , 从 外存 调数据 到 内存 中 , 内存数据 就绪后 返回到 中断位置 继续执行 ;
2、内存存储数据弊端
如果磁盘中的文件有 50G , 内存只有 16G , 显然 内存 中只能存放 部分 磁盘数据 , 此外 内存 中的 可用空间 也不一定是连续的 ;
- 内存的 可用空间 不一定够用 ;
- 内存的 可用空间 的 地址不一定是连续的 ;
外存中的数据 , 要 先将数据进行切割 , 然后 在 内存 中 分散放置 切割后的数据 ;
切割方式 不同 , 内存 中 的 数据 的 存储调用 方式 也是 不同的 , 根据切割方式 , 内存的存储方式分为 :
- 页式存储
- 段式存储
3、分页存储
分页存储 , 又称为 页式存储 , 将 用户程序的逻辑地址空间 与 物理内存空间 划分成 相同大小的 块 , 一般是 4KB 或 8KB , 这个区域 称为 " 页 " ;
该 分页 机制 , 避免了 连续分配内存 造成的 碎片问题 , 每个 " 内存页数据 “ 可以 单独映射 到不同的 ” 用户程序 逻辑地址空间 中的 物理页框 " 中 ;
" 用户程序 中的 页 “ 与 ” 物理内存 中的 页 “ , 需要通过 ” 页表 " 对应起来 , 页面中 最基础的内容如下 :
- 页号 : 用户程序 中的 页号 , 又称为 " 逻辑页号 " , 用户程序中的地址 称为 逻辑地址 ;
- 块号 : 物理内存 中的 块号 , 又称为 " 页帧号 " , 物理内存中的地址 称为 物理地址 ;
4、逻辑地址 和 物理地址 的结构
" 用户程序 " 中 查询 内存中的数据 , 程序 中 已知 数据的 " 逻辑地址 " 由 CPU 生成 , 根据 逻辑地址 查询该地址在 哪个 " 内存页 " , 然后再 到 " 页表 " 中 查询 该内存页 " 页号 " 对应的 " 块号 " , 然后到 内存块 中查询 内存块 对应的 " 物理地址 " ;
- 逻辑地址 由两部分组成 : 页号 + 页内地址 ;
- 页号 : 表示 逻辑地址空间中的具体页 ;
- 页内地址 : 表示页内的具体位置 , 又称为 " 页内偏移 " ;
- 物理地址 由两部分组成 : 块号 + 页内地址 ;
- 块号 : 表示 物理地址空间中的具体块 , 又称为 " 页帧号 " 或 " 页框号 " ;
- 页内地址 : 表示页内的具体位置 , 又称为 " 页内偏移 " ;
逻辑地址 / 物理地址 分为高位 和 低位 , 高位是 页号 或 块号 , 低位是 业内地址 ;
数据 的 逻辑地址 与 物理地址 , 页内地址 是不变的 , 变化的只是前面的 页号 或 块号 , 逻辑地址 高位是 页号 , 物理地址 高位 是 物理内存 的 块号 ;
5、逻辑地址 和 物理地址 的结构 示例
假设 页大小 为 4KB = 4096 Byte , 也就是 2 12 = 4096 2^{12} = 4096 212=4096 字节 ;
4096 个 存储单元 ( Byte ) 如果使用二进制表示 , 需要 使用 0 ~ 4095 闭区间来表示 ;
4095 对应的二进制数字 就是 0b 1111 1111 1111 , 该二进制数字是 12 个 1 ;
4096 个存储单元的取值范围是 0b 0000 0000 0000 ~ 0b 1111 1111 1111 ;
页内地址 / 页内偏移 必须要 12 位 二进制数 才能 表示 ,
如果 页大小是 8KB , 则需要 13 位 二进制数 才能 作为该页的 页内地址 / 页内偏移 ;
给定 4KB 的页大小 的 逻辑地址 , 低位 12 位是其 页内地址 或 页内偏移 , 高位就是 页号 ;
给定一个逻辑地址 , 计算 物理地址 : 页大小 4 KB , 逻辑地址 为 0b 10 1100 1101 1110 , 参考下面的页表 , 计算出其物理地址 ;
逻辑地址 是 0b 10 1100 1101 1110 ,
- 低 12 位是 0b 1100 1101 1110 , 这是 页内地址 / 页内偏移
- 高 2 位 是 0b 10 , 这是页号 , 对应十进制数为 2 , 参考页表 , 页号为 2 的 内存页 对应 块号 为 6 ;
则 物理地址 的高位是 0b 110 , 低位是页内地址 0b 1100 1101 1110 , 拼接物理地址为 0b 110 1100 1101 1110 ;
6、页式存储 优缺点
页式存储 优缺点 :
- 优点 :
- 利用率高 : 页式存储 页面大小 比较小 , 一般都是 4KB / 8KB 等 , 内存的空间利用率较高 ;
- 内存碎片小 : 内存页很小 , 因此造成的碎片也很小 ;
- 分配管理简单 : 通过页表实现 内存管理 , 该结构比较简单 ;
- 缺点 :
- 系统开销大 : 内存页小 , 太过于零碎 , 导致 操作系统每次都需要查表 根据 页号 找 块号 , 造成很多系统开销 ;
- 性能抖动 : 内存调度 时 , 可能产生 性能抖动的现象 , 如 : 由于 系统开销问题 导致 的 分配更多的内存导致系统性能下降的情况 ;
下面的表格中 整理的 页式存储 优缺点 更加全面 :
方面 | 优点 | 缺点 |
---|---|---|
内存利用率 | 减少外部碎片,提高内存利用率 | 可能导致内部碎片 |
管理复杂度 | 简化内存分配和回收 | 页表和多级页表增加了复杂性 |
虚拟内存 | 支持虚拟内存,运行比物理内存更大的程序 | 页面置换引入 I/O 开销 |
内存保护 | 提供内存保护和进程隔离 | 需要额外的硬件和软件支持 |
多任务并发 | 支持多任务并发运行 | 页表切换可能引入额外开销 |
硬件支持 | 现代硬件(如 MMU、TLB)提供高效支持 | TLB 未命中时性能下降 |
地址分配 | 进程地址空间可以非连续存放 | 地址转换开销大,依赖 TLB 加速 |
共享机制 | 方便进程共享内存,减少重复存储 | 共享页可能导致数据同步问题 |
二、逻辑地址 与 物理地址
物理地址 与 逻辑地址 :
- 物理地址 是 内存的实际地址 ;
- 逻辑地址 是 应用程序的 逻辑内存地址 , 每个逻辑地址都有与之对应的 内存条中的 物理地址 , 由 CPU 生成 ;
1、逻辑地址
逻辑地址 定义 : 逻辑地址是 由 应用程序 生成的地址 , 也称为 " 虚拟地址 " , 是程序在执行时使用的地址 , 应用程序通过 逻辑地址 来访问数据或指令 , 而 不需要 直接操作物理内存 ;
逻辑地址 来源 : 逻辑地址 是 在 用户应用程序 运行过程中 由 CPU 生成的地址 , 开发者 或 编译器 并不直接关心物理内存的具体位置 , 只关注逻辑地址的空间 ;
逻辑地址 到 物理地址 的 映射 : 操作系统通过 虚拟内存管理机制 将 逻辑地址 映射到 物理地址 , CPU 发出的 逻辑地址 需要通过 页表、段表 等 映射机制 转换成物理地址 ;
2、物理地址
物理地址 定义 : 物理地址 是 计算机 内存 中实际的地址 , 指向系统物理内存中的具体位置 , 所有 实际的 存储操作 最终都会转化为物理地址 ;
物理地址 来源 : 物理地址 对应的是 计算机硬件 层面内存的真实位置 , 通常 由 操作系统 和 内存管理单元 ( MMU , Memory Management Unit ) 来管理 ;
物理地址 被 内存控制器 用来访问实际的内存单元 , 程序虽然使用逻辑地址 , 但内存访问最终都依赖物理地址 ;
3、逻辑地址 与 物理地址 区别
比较项 | 逻辑地址(虚拟地址) | 物理地址 |
---|---|---|
定义 | 由CPU生成的程序地址,独立于物理内存 | 计算机物理内存中的实际地址 |
别名 | 虚拟地址(Virtual Address) | 真实地址(Real Address) |
访问方式 | 程序访问的地址,由CPU生成 | 经过地址映射后访问的最终内存地址 |
地址空间 | 每个进程有自己的逻辑地址空间 | 由计算机硬件决定的物理内存空间 |
管理方式 | 由操作系统和MMU(内存管理单元)映射到物理地址 | 由内存控制器直接管理 |
转换方式 | 需要通过页表、段表或MMU转换 | 无需转换,直接用于访问内存 |
可变性 | 在程序运行时可变化,由操作系统动态管理 | 由硬件固定分配,通常不会改变 |
示例 | 进程访问地址 0x12345 | 物理内存地址 0xABCD345 |
4、逻辑地址 与 物理地址 的转换
在 应用程序 中 , 如果要 查询 内存中的数据 , 首先 要找到数据在 用户程序 中的 逻辑地址 , 然后 去 页表中查询 该 逻辑地址 对应的 物理内存 中的 物理地址 ;
逻辑地址 与 物理地址 之间的转换 由 内存管理单元 ( MMU , Memory Management Unit ) 完成 的 , 转换过程如下 :
- CPU 生成逻辑地址 : 用户应用程序 给出要访问的 逻辑地址 , 并将其传递到 CPU , 逻辑地址 由 页号 和 页内偏移 组成 , 页号 用于查找对应的物理页框 , 页内偏移在页框中保持不变 ;
逻辑地址 = [页号] + [页内偏移]
- 查找页表 : CPU 根据 当前进程 的 页表 将 逻辑地址 转换为 物理地址 , 操作系统维护一个 页表 , 用于记录逻辑页号与物理页框号的映射关系 , CPU 取出 逻辑地址 中的 页号 , 然后查找页表 , 找到对应的物理页框号 ;
- 生成物理地址 : 物理地址由 页框号 加上 页内偏移 组成 , 上个步骤得到了 页框号 , 直接与 页内偏移 组合成 物理地址 ;
物理地址 = [物理页框号] + [页内偏移]
- 访问物理内存 :
- 如果所需的 内存页 在 内存中 , 则直接访问该 物理地址即可 ;
- 如果所需的 内存页 不在 内存中 , 操作系统会触发一个 缺页中断 ( Page Fault ) , 并将该页面从磁盘加载到内存中 , 最终得到的 物理地址 指向实际的内存位置 ;
三、页表结构 和 物理内存淘汰机制
1、页表的结构简介
页表 ( Page Table ) 是 页式存储 管理中的关键数据结构 , 用于管理 逻辑地址 到 物理地址 的映射 ;
每个 进程 都有自己的页表 , 页表 存储在内存中 , 由 MMU ( Memory Management Unit , 内存管理单元 ) 负责 查询 和 转换 地址 ;
页表 结构 字段如下 :
- 页号 ( Page Number ) : 逻辑地址 中的 索引 , 用于 查找页表项 ;
- 页帧号 ( Page Frame Number, PFN ) : 物理内存中的 页框号 , 指向数据所在的物理页 ;
- 状态位 ( Valid/Invalid Bit ) : 指示该页是否有效(有效页 = 1,不在内存 = 0), 记录该 内存页 是否 从 磁盘 ( 外存 ) 中 加载到了 内存 中 ;
- 如果为 0 , 表示 内存页面 没有在内存中 ;
- 如果为 1 , 表示 内存页面 在内存中 ;
- 访问位 ( Accessed Bit ) : 记录该页 最近 是否被访问过 , 操作系统可用它进行页面置换 ;
- 如果为 1 , 表示 内存页面 最近有被访问过 ;
- 如果为 0 , 表示 内存页面 最近没有被访问过 ;
- 时间限制 : 如果 之前有被访问过 , 值为 1 , 但是经过一段时间内没有被访问 , 则会被 置为 0 ;
- 修改位 ( Dirty Bit ) : 记录该页是否被修改过 ( 1 = 已修改,需要写回磁盘 ) ;
- 如果为 1 , 表示 内存页面 最近有被修改过 ;
- 如果为 0 , 表示 内存页面 最近没有被修改过 ;
页表是逻辑地址到物理地址转换的核心 , 利用状态位、访问位、修改位进行内存管理和页面置换 ;
在现代计算机中 , 通常采用 多级页表 或 反向页表 优化存储和访问性能 ;
2、物理内存 的 淘汰机制
下图中 , 操作系统 只为该 进程 分配了 4 个 物理内存页 ;
对 上述表格 的 状态位 进行分析 :
系统为该 进程 的 1 / 1 / 2 / 5 页号 逻辑内存页 , 分配了 2 / 3 / 5 / 6 页帧号 对应的 物理内存页 ,
3 / 4 页号 的 逻辑内存页 对应的 物理内存页 对应的数据 没有被加载到 物理内存中 , 这部分数据 在 外存 ( 磁盘 ) 中 ;
要访问的 数据 没有加载到 物理内存 的情况 :
如果 想要访问 3 号页 逻辑内存 中的数据 , 但是其 对应的 数据不在 物理内存 中 ,
想要将 3 号页 对应的数据 从 磁盘 加载到 内存 中 , 需要淘汰掉当前的一个 物理内存 页 , 然后再加载对应的 磁盘数据 ;
淘汰 物理内存 页 是有一定的规则标准的 ;
已分配 的 物理内存页 的淘汰原则 :
要淘汰的 是 状态位 为 1 的 物理内存页 , 状态位 为 0 说明没有为 该逻辑内存 分配 ,
之后 根据 访问位 和 修改位 来决定要淘汰哪个 物理内存页 ;
优先淘汰 访问位 为 0 的物理页 ;
如果有多个 物理页 访问位 为 0 , 则继续看 修改位 , 优先淘汰 修改位 为 0 的物理页 ;
3、物理内存 的 淘汰机制 总结
物理页面 淘汰原则总结 :
- 状态位为 1 : 这是 前提条件 ;
- 访问位为 0 : 访问位 为 0 的 页面 优先淘汰 ;
- 修改位为 0 : 如果出现多个 访问位 为 0 的页面 , 考虑 优先淘汰 修改位 为 0 的页面 ;
- 因为 修改位 为 1 , 系统开销更大 , 将内存数据进行修改 , 会消耗更多的 资源和性能 , 消耗了这么多修改数据 , 将其直接淘汰 不划算 ;
4、案例分析
某个 用户进程 有 8 个 逻辑页面 , 页号为 0 ~ 7 , 每个 内存页大小为 4KB ;
操作系统 为 该 用户进程 分配了 4 个 物理内存 存储块 , 进程的 当前 页表 数据如下 :
逻辑地址 转 物理地址 案例计算
计算进程的 逻辑地址 0x 5148 对应的物理地址 :
页大小为 4KB = 4096 Byte , 也就是 2 12 = 4096 2^{12} = 4096 212=4096 字节 , 4096 个存储单元的取值范围是 0b 0000 0000 0000 ~ 0b 1111 1111 1111 ;
页内地址 / 页内偏移 必须要 12 位 二进制数 才能 表示 ,
给定 4KB 的页大小 的 逻辑地址 , 低位 12 位是其 页内地址 或 页内偏移 , 高位就是 页号 ;
0x 5148 对应的二进制数为 0b 0101 0001 0100 1000 ,
- 低 12 位 为 0b 0001 0100 1000 , 这是 页内偏移 ;
- 高 4 位 为 0b 0101 , 这是 页号 , 对应十进制为 5 , 逻辑页号为 5 ;
查询 页表 , 逻辑页号 5 对应的 物理页帧号为 3 , 对应二进制为 0b 0011 页帧号 , 与 低 12 位 的 页内偏移 0b 0001 0100 1000 组合 ,
得到的 物理地址 为 0b 0011 0001 0100 1000 , 转为 16 进制为 0x 3148 ;
物理地址 页面淘汰 案例计算
计算 如果要访问 逻辑页面 6 , 需要淘汰的页面 :
从 状态位 为 1 的 内存页 中查找 要淘汰的页面 , 逻辑页号 1 / 2 / 5 / 7 对应的页面是已经分配 物理内存 的页面 ;
上述 四个页面中 , 逻辑页 2 的 访问位 为 0 , 说明最近没有访问 , 淘汰掉 逻辑页 2 ;
相关文章:
【系统架构设计师】操作系统 ② ( 存储管理 | 页式存储 | 逻辑地址 与 物理地址 | 页表结构 | 物理内存淘汰机制 )
文章目录 一、页式存储1、CPU 调用数据2、内存存储数据弊端3、分页存储4、逻辑地址 和 物理地址 的结构5、逻辑地址 和 物理地址 的结构 示例6、页式存储 优缺点 二、逻辑地址 与 物理地址1、逻辑地址2、物理地址3、逻辑地址 与 物理地址 区别4、逻辑地址 与 物理地址 的转换 三…...
STM32自学记录(八)
STM32自学记录 文章目录 STM32自学记录前言一、ADC杂记二、实验1.学习视频2.复现代码 总结 前言 ADC 一、ADC杂记 ADC其实就是一个电压表,把引脚的电压值测出来,放在一个变量里。 ADC:模拟——数字转换器。 ADC可以将引脚上连续变化的模拟电…...
Vim 多窗口编辑及文件对比
水平分割 :split 默认使用水平分割的方式。 :split :sp 垂直分割 :vsplit :vs 带文件的分割 :split 文件名 :sp 文件名 在光标所在的窗口,输入分割窗口命令就会对那个窗口进行分割。 切换窗口 Ctrlw 切换正在编辑的窗口 快速分割窗口 Ctrlwn 快速分割当前…...
基于深度学习的人工智能量化衰老模型构建与全流程应用研究
一、引言 1.1 研究背景与意义 1.1.1 人口老龄化现状与挑战 人口老龄化是当今全球面临的重要社会趋势之一,其发展态势迅猛且影响深远。根据联合国的相关数据,1980 年,全球 65 岁及以上人口数量仅为 2.6 亿,到 2021 年,这一数字已翻番,达到 7.61 亿,而预计到 2050 年,…...
第八届大数据与应用统计国际学术研讨会(ISBDAS 2025)
重要信息 官网:www.is-bdas.org 时间:2025年2月28-3月2日 地点:中国 广州 主办单位:广东省高等教育学会人工智能与高等教育研究分会 协办单位:北京师范大学人工智能与未来网络研究院、人工智能与大数据科研基地 …...
链表专题-03
链表专题(三) 两数相加 问题 [力扣2] 2. 两数相加 - 力扣(LeetCode) 问题描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加ÿ…...
Ollama下载安装教程
一、去官网下载Ollama 点击前往Ollama官网 进去后点击下载 根据不同的系统去选择 由于服务器在国外可能下载界面进不去或者下载非常慢,可以去网盘获取 点击下方蓝色字体直达 点击前往夸克网盘下载 点击前往百度网盘下载 下载好后双击应用程序安装即可 点击ins…...
SQL Server查询计划操作符(7.3)——查询计划相关操作符(6)
7.3. 查询计划相关操作符 48)Key Lookup:该操作符对一个有簇索引的表进行书签查找。参数列包含簇索引的名字和用于查找簇索引中数据行的簇键。该操作符总是伴随一个Nested Loops操作符。如果其参数列中出现WITH PREFETCH子句,则查询处理器已决定使用异步预取(预读,read-ah…...
IDEA查看项目依赖包及其版本
一.IDEA将现有项目转换为Maven项目 在IntelliJ IDEA中,将现有项目转换为Maven项目是一个常见的需求,可以通过几种不同的方法来实现。Maven是一个强大的构建工具,它可以帮助自动化项目的构建过程,管理依赖关系,以及其他许多方面。 添加Maven支持 如果你的项目还没有pom.xm…...
网络分析工具—WireShark的安装及使用
Wireshark 是一个广泛使用的网络协议分析工具,常被网络管理员、开发人员和安全专家用来捕获和分析网络数据包。它支持多种网络协议,能够帮助用户深入理解网络流量、诊断网络问题以及进行安全分析。 Wireshark 的主要功能 数据包捕获与分析: …...
【LeetCode 刷题】贪心算法(2)-进阶
此博客为《代码随想录》贪心算法章节的学习笔记,主要内容为贪心算法进阶的相关题目解析。 文章目录 135. 分发糖果406. 根据身高重建队列134. 加油站968. 监控二叉树 135. 分发糖果 题目链接 class Solution:def candy(self, ratings: List[int]) -> int:n l…...
网络工程师 (25)OSI模型—服务访问点
前言 OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是国际标准化组织(ISO)提出的一个旨在使各种计算机在世界范围内互连为网络的标准框架。 一、定义 服务访问点&a…...
如何在RTACAR中配置IP多播(IP Multicast)
一、什么是IP多播 IP多播(IP Multicast)是一种允许数据包从单一源地址发送到多个目标地址的技术,是一种高效的数据传输方式。 多播地址是专门用于多播通信的IP地址,范围从 224.0.0.0到239.255.255.255 与单播IP地址不同&#x…...
使用docker搭建FastDFS文件服务
1.拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/fastdfs:latest2.使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用) docker run -dti --networkhost --name tracker -v /data/fdfs/tracker:/var/fdfs -…...
VC播放mp3的方法
1、使用msi库 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") .......//打开文件MCI_OPEN_PARMS mciOpen; mciOpen.lpstrDeviceType _T("mpegvideo"); mciOpen.lpstrElementName _T("c://1.mp3"); MCIERROR mciError mci…...
【读书笔记·VLSI电路设计方法解密】问题46:什么是bug覆盖率
在IC设计项目的验证过程中,功能测试(通过使用测试平台)有助于定位设计错误或漏洞。这个验证过程有三个阶段:构建和启动测试平台、验证基本测试用例以及验证边界情况。 在前两个阶段,漏洞很容易被检测到,因…...
sqli-lab靶场学习(五)——Less15-17(post方法盲注、修改密码)
前言 第11-14关开始用post方法,15-17关会用到盲注,post方法盲注和get方法类似。 Less15 这关是单引号闭合,有报错但没有具体情况的回显,因此适合使用错误盲注。 在用户名密码框分别输入 账号:admin and 11 -- asd…...
1、http介绍
一、HTTP 和 HTTPS 简介 HTTP(HyperText Transfer Protocol) 用途:用于网页数据传输(不加密)。协议特性:以明文形式传输数据,默认端口 80,无身份验证和完整性保护。典型场景…...
Vim跳转文件及文件行结束符EOL
跳转文件 gf 从当前窗口打开那个文件的内容,操作方式:让光标停在文件名上,输入gf。 Ctrlo 从打开的文件返回之前的窗口 Ctrlwf 可以在分割的窗口打开跳转的文件,不过在我的实验不是次次都成功。 统一行尾格式 文本文件里存放的…...
LLM:DeepSeek 系列(二)
原文链接 3、DeepSeek-V2 DeepSeek-V2 发布于 2024 年 5 月,为多领域专家(MoE)语言模型,包含总共 2360 亿个参数,其中每个词元激活 210 亿个参数,并支持 12.8 万个词元的上下文长度。DeepSeek-V2 采用包括…...
订单超时设计(1)--- 如何使用redis实现订单超时实时关闭功能
如何使用redis实现订单超时实时关闭功能 准备工作实现步骤解释注意事项(重点) 使用Redis实现订单超时实时关闭功能,可以利用Redis的延时队列(使用Sorted Set实现)和过期键(使用TTL和Keyspace Notifications…...
【0401】Postgres内核 CREATE DATABASE database-name 源码实现 ①
文章目录 1. CREATE DATABASE 语句1.1 CREATE DATABASE 语法1.2 CREATE DATABASE 调用栈2. CREATE DATABASE 内核实现2.1 从 CreatedbStmt 节点树 提取 options2.2 获取 datdba(proposed owner) OID2.3 当前用户具有 create DB 权限?2.4 获取 database template1. CREATE DA…...
Termux安装ssh实现电脑ssh
Termux下载 点击下载 在 Termux 中安装并使用 SSH,按照以下步骤操作: 1. 更新软件包列表 pkg update && pkg upgrade2. 安装 OpenSSH pkg install openssh3. 设置 SSH 密码(必须,否则无法使用 SSH 服务器)…...
nexus部署及配置https访问
1. 使用docker-compose部署nexus docker-compose-nexus.yml version: "3" services:nexus:container_name: my-nexusimage: sonatype/nexus3:3.67.1hostname: my-nexusnetwork_mode: hostports:- 8081:8081deploy:resources:limits:cpus: 4memory: 8192Mreservations…...
【MySQL】表操作
表操作 一、创建表 1、语句2、语句介绍3、注意事项4、介绍5、示例 二、查看表结构 1、语句2、介绍3、返回的信息4、示例 三、添加字段 1、语句2、语句介绍3、示例 四、修改 1、语句2、语句介绍3、示例 五、删除 1、语句2、示例 六、修改表名 1、语句2、语句介绍3、示例 七、删…...
浅析Ruby类污染及其在Sinatra框架下的利用
和JavaScript中的原型链污染类似,Ruby中也存在类似的概念——类污染,两者都是对象进行不安全的递归合并导致的。 网上也没有相关的分析文章,只有下面这篇文章应该是第一次谈到这个问题 Class Pollution in Ruby: A Deep Dive into Exploiti…...
iPhone 在华销量大幅下挫
iPhone在乔布斯时代缔造的神话在中国正逐渐走向没落,挤牙膏式的升级方式类似于诺基亚的N70系列,毫无新意的创新能力,求稳着陆的经营理念,工艺和美学不再独领风骚,甚至拍照领域和AI增强计算,折叠屏等技术领域…...
Fedora 的 2025 年展望:AI 集成与 HDR 支持打造强大 Linux 桌面体验
Fedora 项目已经从节庆活动中恢复,准备在未来几个月推出一系列关键计划。Red Hat 软件工程总监 Christian Schaller 在他的博客文章中分享了 2025 年 Fedora 发行版的重点发展方向和优先事项,涵盖了人工智能集成、Wayland、HDR 协议、PipeWire 等多个领域…...
mysql 学习11 事务,事务简介,事务操作,事务四大特性,并发事务问题,事务隔离级别
一 事务简介, 数据库准备: create table account(id int auto_increment primary key comment 主键ID,name varchar(128) not null comment 姓名,backaccountnumber char(18) unique comment 银行账号,money float comment 余额 )comment 银行账号表;…...
C# Winform怎么设计串口,客户端和相机控件界面显示
首先我们必须把这个类创建好 INIAPI using System; using System.Text; using System.Runtime.InteropServices;namespace Ini {public class IniAPI{#region INI文件操作/** 针对INI文件的API操作方法,其中的节点(Section)、键(KEY&#x…...
【场景题】架构优化 - 解耦Redis缓存与业务逻辑
1. 需求分析 某公司需要将原有的Redis缓存抽离出来,并且还要要实现: 可配置热拔插高可用高通用 请问你会如何实现? 2. 思路 话不多说直接上思路: 自定义缓存注解,当容器扫描到该注解自动调用AOP想应的增强方法为…...
WGCLOUD监控系统部署教程
官网地址:下载WGCLOUD安装包 - WGCLOUD官网 第一步、环境配置 #安装jdk 1、安装 EPEL 仓库: sudo yum install -y epel-release 2、安装 OpenJDK 11: sudo yum install java-11-openjdk-devel 3、如果成功,你可以通过运行 java …...
linux——网络计算机{序列化及反序列化(JSON)(ifdef的用法)}
linux——网络(服务器的永久不挂——守护进程)-CSDN博客 目录 一、序列化与反序列化 1. 推荐 JSON 库 2. 使用 nlohmann/json 示例 安装方法 基础用法 输出结果 3. 常见操作 4. 其他库对比 5. 选择建议 二、ifdef宏的用法 基本语法 核心用途…...
Android 开发APP中参数配置与读取总结
以使用MQTT配置的参数 MQTT_BROKER_UR 、MQTT_USER_NAME、 MQTT_PASSWORD为例,说明配置设置和读取应用 项目中使用系统参数(如环境变量和gradle.properties文件中的属性)在Gradle构建脚本中,以下是一个详细的操作文档资料&…...
Web应用国际化(i18n)实现详解 python
Web应用国际化(i18n)实现详解 1. 设计理念 本项目的国际化(Internationalization)解决方案基于Python的gettext模块,提供了一个灵活、可扩展的多语言支持系统。 2. 语言支持 2.1 支持的语言列表 项目支持超过35种…...
mysql mvcc 锁 关系
多版本并发控制(MVCC)是一种用于数据库并发控制的机制,它可以在保证数据一致性的同时,提高数据库的并发性能。下面结合 MVCC 机制,详细阐述常见的四种事务隔离级别(读未提交、读已提交、可重复读、串行化&a…...
【银河麒麟高级服务器操作系统】系统日志Call trace现象分析及处理全流程
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://document.kylinos.cn 服务器环境以及配置 系统环境 物理机/虚拟机/云…...
新能源产业的质量革命:六西格玛培训如何重塑制造竞争力
在新能源行业狂飙突进的今天,企业若想在全球供应链中占据高地,仅靠技术突破已远远不够。制造效率的毫厘之差,可能成为市场话语权的千里之距。某光伏巨头曾因电池片良率低于行业均值1.5%,导致年损失超2.3亿元——这恰恰印证了六西格…...
【ArcGIS】R语言空间分析、模拟预测与可视化技术
R语言在空间数据挖掘中具有广泛的应用,以下是一些关键内容和常用包的介绍: R语言空间数据挖掘的关键技术 空间数据类型 矢量数据:包括点(Point)、线(Line)、面(Polygon)等…...
单例模式几种实现
静态内部类holder实现(推荐) public class UniqueIdGenerator {public static final UniqueIdGenerator INSTANCE Holder.INSTANCE;// Private holder class for lazy initializationprivate static class Holder {static final UniqueIdGenerator INS…...
什么是Prompt工程?
什么是提示工程? Prompt一词,在英语中主要用作动词、形容词、名词和副词,主要意思包括“促使,导致;鼓励,提示;迅速的,立刻的;准时地”等。 在人工智能的语境下…...
C++,设计模式,【单例模式】
文章目录 一、模式定义与核心价值二、模式结构解析三、关键实现技术演进1. 基础版(非线程安全)2. 线程安全版(双重检查锁)3. 现代C++实现(C++11起)四、实战案例:全局日志管理器五、模式优缺点深度分析✅ 核心优势⚠️ 潜在缺陷六、典型应用场景七、高级实现技巧1. 模板化…...
详解SQLAlchemy的函数relationship
在 SQLAlchemy 中,relationship 是一个非常重要的函数,用于定义模型之间的关系。它用于在 ORM 层面上表示数据库表之间的关联关系(如 1 对 1、1 对多和多对多)。relationship 的主要作用是提供一个高级接口,用于在模型…...
vue 的 watch 和 computed 有什么区别?
在 Vue.js 中,watch 和 computed 都是用于响应式数据处理的功能,但它们有不同的用途和实现方式。以下是二者的主要区别: 1. 用途 computed 计算属性:用于基于已有数据计算出新的值。它们是基于依赖的数据变化而自动重新计算的,通常用于模板中显示的派生状态。缓存:计算…...
WPS如何接入DeepSeek(通过第三方工具)
WPS如何接入DeepSeek 一、下载并安装OfficeAI插件二、配置OfficeAI插件三、使用DeepSeek功能 本文介绍如何通过 WPS 的第三方工具调用 DeepSeek 大模型,实现自动化文本扩写、校对和翻译等功能。 一、下载并安装OfficeAI插件 1、访问OfficeAI插件下载地址ÿ…...
学习 PostgreSQL 流复制
PostgreSQL 流复制 PostgreSQL数据库异常中止后,数据库刚重启时,会重放停机前最后一个checkpoint点之后的 WAL日志,在把数据库恢复到停机的状态后,自动进入正常的状态,可以接收其他用户的查询和修改。 想象另一个场景…...
零基础学习书生.浦语大模型--基础岛
第二关:玩转书生[多模态对话]和[AI搜索]产品 任务一:使用MindSearch 任务二:尝试使用书生.浦语 尝试让其写一段Self-Attention网络模块代码 import torch import torch.nn as nn import torch.nn.functional as Fclass SelfAttention(nn.Module):def _…...
MySQL中DDL操作是否支持事务
MySQL中DDL不支持事务。 传统MySQL(5.7及以前版本): DDL操作不支持事务执行DDL操作时会隐式提交当前会话的事务无法回滚DDL操作 MySQL 8.0版本: 引入了原子DDL特性(Atomic DDL)DDL操作变为原子性的&…...
QQ自动发送消息
QQ自动发送消息 python包导入 import time import pandas as pd import pyautogui import pyperclip图像识别函数封装 本程序使用pyautogui模块控制鼠标和键盘来实现QQ自动发送消息,因此必须得到需要点击位置的坐标(当然也可以在程序中将位置写死&…...
css:怎么设置图片不变形
问: main元素中有一个img元素,这个img src‘/assets/images/tupian.png’css设置了img元素width:50% height:50%但是图片变形了,我应该怎么设置保持图片样式不变形 回答: 为了确保图片在调整大小时不变形࿰…...