【操作系统】深入理解Linux物理内存
物理内存的组织结构
我们平时所称的内存也叫随机访问存储器也叫 RAM 。RAM 分为两类:
- 一类是静态 RAM( SRAM ),这类 SRAM 用于 CPU 高速缓存 L1Cache,L2Cache,L3Cache。其特点是访问速度快,访问速度为 1 - 30 个时钟周期,但是容量小,造价高。
- 另一类则是动态 RAM ( DRAM ),这类 DRAM 用于我们常说的主存上,其特点的是访问速度慢 (相对高速缓存),访问速度为 50 - 200 个时钟周期,但是容量大,造价便宜些(相对高速缓存)。
器模块通常以 64 位为单位( 8 个字节)传输数据到存储控制器上或者从存储控制器传出数据。
多个存储器模块连接到存储控制器上,就聚合成了主存。
DRAM 芯片就包装在存储器模块中,每个存储器模块中包含 8 个 DRAM 芯片,依次编号为0-7:
每一个 DRAM 芯片的存储结构是一个二维矩阵,二维矩阵中存储的元素称为超单元(supercell),每个 supercell 大小为一个字节(8 bit),每个 supercell 都有一个坐标地址(i,j)。
i 表示二维矩阵中的行地址,在计算机中行地址称为 RAS (row access strobe,行访问选通脉冲)。 j 表示二维矩阵中的列地址,在计算机中列地址称为 CAS (column access strobe,列访问选通脉冲)。
DRAM 芯片的访问
DRAM 芯片的 IO 单位为一个 supercell ,也就是一个字节(8 bit)。
CPU 如何读写主存
CPU 从内存读取数据过程
假设 CPU 现在需要将物理内存地址为 A 的内容加载到寄存器中进行运算。
对于第三步,存储控制器如何通过物理内存地址 A 从主存中读取出对应的数据 X 的?
存储控制器会将物理内存地址转换为 DRAM 芯片中 supercell 在二维矩阵中的坐标地址(RAS,
CAS),并将这个坐标地址发送给对应的存储器模块。随后存储器模块会将 RAS 和 CAS 广播到存储器模块中的所有 DRAM 芯片。依次通过 (RAS,CAS) 从 DRAM0 到 DRAM7 读取到相应的supercell 。
我们知道一个 supercell 存储了一个字节( 8 bit ) 数据,这里我们从 DRAM0 到 DRAM7 依次读
取到了 8 个 supercell 也就是 8 个字节,然后将这 8 个字节返回给存储控制器,由存储控制器将数
据放到存储总线上。
- CPU 总是以 word size 为单位从内存中读取数据,在 64 位处理器中的 word size 为 8 个字节。64 位的内存每次只能吞吐 8 个字节。
- CPU 每次会向内存读写一个 cache line 大小的数据( 64 个字节),但是内存一次只能吞吐 8 个字节。
所以在物理内存地址对应的存储器模块中,DRAM0 芯片存储第一个低位字节( supercell ),DRAM1 芯片存储第二个字节,......依次类推 DRAM7 芯片存储最后一个高位字节。
由于存储器模块中这种由 8 个 DRAM 芯片组成的物理存储结构的限制,内存读取数据只能是按照
物理内存地址,8 个字节 8 个字节地顺序读取数据。所以说内存一次读取和写入的单位是 8 个字
节。
CPU 向内存写入数据过程
注:CPU 只会访问虚拟内存地址,总线上传输的是物理内存地址,在操作总线之前,需要通过一个地址转换硬件将虚拟内存地址转换为物理内存地址,然后将物理内存地址作为地址信号在总线上传输。
从 CPU 角度看物理内存模型
FLATMEM 平坦内存模型
将物理内存划分成连续的内存页,每页的大小是固定的,用一个数组来组织这些连续的物理内存页 struct page 结构,其在数组中对应的下标即为 PFN。这种内存模型就叫做平坦内存模型。
内核中使用了一个 mem_map 的全局数组用来组织所有划分出来的物理内存页。mem_map 全局
数组的下标就是相应物理页对应的 PFN 。
在平坦内存模型下 ,page_to_pfn 与 pfn_to_page 的计算逻辑非常简单,本质就是基于mem_map 数组进行偏移操作。
Linux 早期使用的就是这种内存模型,因为在 Linux 发展的早期所需要管理的物理内存通常不大
(比如几十 MB),那时的 Linux 使用平坦内存模型 FLATMEM 来管理物理内存就足够高效了。
内核中的默认配置是使用 FLATMEM 平坦内存模型。
DISCONTIGMEM 非连续内存模型
SPARSEMEM 稀疏内存模型
随着内存技术的发展,内核可以支持物理内存的热插拔了,这样一来物理内存的不连续就变为常态了,在 DISCONTIGMEM 内存模型中,其实每个 node 中的物理内存也不一定都是连续的,而且每个 node 中都有一套完整的内存管理系统,如果 node 数目多的话,那这个开销就大了。
SPARSEMEM 稀疏内存模型已经完全覆盖了前两个内存模型的所有功能,因此稀疏内存模型可被用于所有内存布局的情况。
什么是物理内存热插拔?
对于 SPARSEMEM 内存模型,每个 mem_section 都可以在系统运行时改变 offline ,online 状态,以便支持内存的热插拔(hotplug)功能。 当 mem_section offline 时, 内核会把这部分内存隔离开, 使得该部分内存不可再被使用, 然后再把 mem_section 中已经分配的内存页迁移到其他 mem_section 的内存上。
从 CPU 角度看物理内存架构
一致性内存访问 UMA 架构
非一致性内存访问 NUMA 架构
注:NUMA 节点中可能会包含多个 CPU,这些 CPU 均是物理 CPU。
在 NUMA 架构下,只有 DISCONTIGMEM 非连续内存模型和 SPARSEMEM 稀疏内存模型是可用的。而 UMA 架构下,前面介绍的三种内存模型都可以配置使用。
NUMA 的内存分配策略
NUMA 的内存分配策略是指在 NUMA 架构下 CPU 如何请求内存分配的相关策略。
内核如何管理 NUMA 节点
内核如何统一组织 NUMA 节点
在内核 2.4 版本之前,内核使用一个单链表将这些 NUMA 节点串联起来;内核 2.4 版本之后,内核使用了一个全局数组来管理所有的 NUMA 节点。
UMA 架构下,内核中只用一个 NUMA 节点来管理所有物理内存。
NUMA 节点物理内存区域的划分
内核会根据各个物理内存区域的功能不同,将 NUMA 节点内的物理内存主要划分为以下四个物理内存区域:
除了上面四种物理内存区域,还有两个区域:
既然有了这些实际的物理内存区域,那么内核为什么又要划分出一个 ZONE_MOVABLE 这样的虚拟内存区域呢 ?
内核中请求分配的物理页面数只能是 2 的次幂。
CPU 高速缓存
程序局部性原理表现为:时间局部性和空间局部性。时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某块数据被访问,则不久之后该数据可能再次被访问。空间局部性是指一旦程序访问了某个存储单元,则不久之后,其附近的存储单元也将被访问。
相关文章:
【操作系统】深入理解Linux物理内存
物理内存的组织结构 我们平时所称的内存也叫随机访问存储器也叫 RAM 。RAM 分为两类: 一类是静态 RAM( SRAM ),这类 SRAM 用于 CPU 高速缓存 L1Cache,L2Cache,L3Cache。其特点是访问速度快,访…...
K8s组件
一、Kubernetes 集群架构组件 K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。 主节点一般被称为 Master 节点,master节点上有 apis…...
【ESP32接入国产大模型之Deepseek】
【ESP32接入国产大模型之Deepseek】 1. Deepseek大模型1.1 了解Deepseek api1.2 Http接口鉴权1.3. 接口参数说明1.3.1 请求体(request)参数1.3.2 模型推理 2. 先决条件2.1 环境配置2.2 所需零件 3. 核心代码3.1 源码分享3.2 源码解析3.3 连续对话修改后的代码代码说明示例输出注…...
Vue 2 路由指南:从基础到高级
注意:对于代码看不清的部分,用鼠标选中就能看到了,背景颜色和字体颜色过于接近,我也不知道怎么调,只能这样子先看着了 一、Vue Router 是什么? Vue Router 是 Vue.js 官方的路由管理器,它允许…...
2025最新深度学习pytorch完整配置:conda/jupyter/vscode
从今天开始,开始一个新的专栏,更新深度学习相关的内容,从入门到精通,首先的首先是关于环境的配置指南:工欲善其事必先利其器! PyTorch 是由 Facebook(现 Meta)开发的 开源深度学习框…...
Python教学-最常用的标准库之一——OS库
os 库是 Python 标准库中的一个模块,它提供了一种方便的方式来使用操作系统相关的功能。os 模块提供了很多函数,可以用来处理文件和目录、访问环境变量、执行系统命令等。以下是一些常用的 os 模块的功能和示例: 1. 文件和目录操作 1.1 当前…...
尚硅谷爬虫note006
一、ajax的get请求 1. ajax的get请求—豆瓣电影第一页 # _*_ coding : utf-8 _*_ # Time : 2025/2/13 15:14 # Author : 20250206-里奥 # File : demo23_ajax的get请求 # Project : PythonProject10-14import urllib.requestfrom demo17_qingqiuduixaingdedingzhi import hea…...
LeetCode刷题---字符串---859
亲密字符串 859. 亲密字符串 - 力扣(LeetCode) 题目: 给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。 交换字母的定义是&…...
探索大数据处理:利用 Apache Spark 解锁数据价值
探索大数据处理:利用 Apache Spark 解锁数据价值 大家好,我是你们熟悉的大数据领域自媒体创作者Echo_Wish。今天,我们来聊聊如何利用Apache Spark进行大规模数据处理。Apache Spark作为一个快速、通用的集群计算框架,以其出色的性…...
伯克利 CS61A 课堂笔记 08 —— Strings and Dictionaries
本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Strings 字符串 Ⅰ Strings are An Abstraction. Ⅱ Strings Literals have Three Forms Ⅲ String are Sequences 02 Dictionaries 字典 …...
V93K测试机
爱德万V9300(又称V93K)是Advantest公司推出的高端可扩展SoC测试平台,在半导体测试领域具有标杆地位。以下为该设备的详细介绍: ### 一、核心性能与技术优势 1. **高速高精度测试能力** V9300支持高达112 Gbps PAM4信号&…...
在 CentOS 上更改 SSH 默认端口以提升服务器安全性
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...
基于逻辑概率的语义信道容量(Semantic Channel Capacity)和语义压缩理论(Semantic Compression Theory)
基于逻辑概率的语义信道容量(Semantic Channel Capacity)和语义压缩理论(Semantic Compression Theory)是语义通信(Semantic Communication, SemCom)的核心研究方向,它们旨在优化通信效率&#…...
Golang GORM系列:GORM事务及错误处理
在数据库管理领域,确保数据完整性至关重要。GORM是健壮的Go对象关系映射库,它为开发人员提供了维护数据一致性和优雅地处理错误的基本工具。本文是掌握GORM事务和错误处理的全面指南。我们将深入研究如何使用事务来保证原子性,并探索有效处理…...
51单片机-C语言扩展及最小系统
1、C-51的数据类型扩充定义 sfr:特殊功能寄存器声明 sfr:变量名地址值; 特殊功能寄存器在reg51.H这个头文件里面都帮我们定义好了,所以平时我们就不要自己去定义寄存器的名字。 sbit:特殊功能位声明sbit 变量名地址…...
日常问题-pnpm install执行没有node_modules生成
日常问题-pnpm install执行没有node_modules生成 1.问题2.解决方法 1.问题 执行pnpm i后,提示Scope: all 3 workspace projects Done in 503ms,而且没有node_modules生成。很奇怪 2.解决方法 确保根目录有 pnpm-workspace.yaml 文件: 把这…...
FreeRTOS低功耗总结
前言 Cortex-M核的MCU一般支持以下三种低功耗方式: ● 睡眠(Sleep)模式 ● 停止(Stop)模式 ● 待机(Standby)模式 睡眠模式 进入睡眠模式有两种指令:WFI(等待中断)和WFE(等待事件), WFI进入睡眠模式后,任意中断都可唤醒。 WFE进…...
UniApp 实现炫酷导航栏:选中图标上移并隐藏文字
在移动应用开发中,导航栏是用户与应用交互的重要组成部分,一个美观且交互性强的导航栏能大大提升用户体验。本文将详细介绍如何使用 UniApp 实现一个独特的导航栏,当用户选中某个导航项时,对应的图标会上移并隐藏文字,…...
Django 操作表中的数据(增删改查)
1.新建数据 我之前已经在数据库中创建了两张表,如下 在urls.py文件中添加一行代码,然后再在views.py文件中编写函数 (将 URL 路径 orm/ 映射到 Django 视图函数 views.orm,当用户访问 orm/ 时,Django 会调用 orm 视图…...
优选驾考小程序
第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言,有很好的特征,在安全方面、性能方面等。非常适合在Internet环境中使用,也是目前企业级运用中最常用的一个编程语言,具有很大…...
vue开发06:前端通过webpack配置代理处理跨域问题
1.定义 在浏览器尝试请求不同源(域名、协议、端口号不同)的资源时,浏览器的同源策略会阻止这种跨域请求。(比如前端端口15500,后端端口5050,前端界面不可以直接调用5050端口) 2.解决方案 使用前…...
C++基础 | 线程`std::thread`
什么是std::thread? std::thread是C11中引入的一个类,用于表示和管理线程。通过std::thread,我们可以创建一个新的线程来执行指定的任务。线程是操作系统调度的基本单位,多个线程可以并发执行,从而提高程序的效率。 创…...
体验 DeepSeek-R1:解密 1.5B、7B、8B 版本的强大性能与应用
文章目录 🍋引言🍋DeepSeek 模型简介🍋版本更新:1.5B、7B、8B 的区别与特点🍋模型评估🍋体验 DeepSeek 的过程🍋总结 🍋引言 随着大规模语言模型的持续发展,许多模型在性…...
2024年认证杯SPSSPRO杯数学建模A题(第二阶段)保暖纤维的保暖能力全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 A题 保暖纤维的保暖能力 原题再现: 冬装最重要的作用是保暖,也就是阻挡温暖的人体与寒冷环境之间的热量传递。人们在不同款式的棉衣中会填充保暖材料,从古已有之的棉花、羽绒到近年来各种各样的人造纤维。不…...
P1878 舞蹈课(详解)c++
题目链接:P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 1.题目解析 1:我们可以发现任意两个相邻的都是异性,所以他们的舞蹈技术差值我们都要考虑,4和2的差值是2,2和4的差值是2,4和3的差值是1,根…...
或非门组成的SR锁存器真值表相关问题
PS:主要是给大家抛砖引玉,不喜勿喷。 问题描述:或非门组成的SR锁存器,为什么当SD和RD等于0时候的真值表一个是Q0,Q0.一个结果是Q1,Q1?...
机器学习算法 - 随机森林之决策树初探(1)
随机森林是基于集体智慧的一个机器学习算法,也是目前最好的机器学习算法之一。 随机森林实际是一堆决策树的组合(正如其名,树多了就是森林了)。在用于分类一个新变量时,相关的检测数据提交给构建好的每个分类树。每个…...
webpack构建流程
文章目录 [TOC](文章目录) 运行流程初始化流程编译构建流程compile编译make 编译模块build module 完成模块编译 输出流程seal输出资源emit输出完成 小结 运行流程 是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会广播事件,插件只…...
服务器之连接简介(Detailed Explanation of Server Connection)
一台服务器最大能支持多少连接?一台客户端机器最多能发起多少条连接?? 我们知道TCP连接,从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】(这里也对应着TCP四元组:源IP、源端口、…...
第1章大型互联网公司的基础架构——1.5 服务发现
讲到这里,我们已经对一个客户端请求进入业务HTTP服务的过程有了较为详细的了解。业务HTTP服务在处理请求的过程中免不了与其他下游服务通信——可能会调用其他业务服务,可能需要访问数据库,可能会向消息中间件投递消息等,所以业务…...
uniapp PDF 预览和下载
创建 index.vue <template><view><view class"box"><view class"item" ><view class"title"><span></span><text>文件</text></view><view class"list" v-for"(…...
ubuntu服务器部署
关闭欢迎消息 服务器安装好 ubuntu 系统后,进行终端登录,会显示出很多的欢迎消息 通过在用户的根目录下执行 touch .hushlogin 命令,再次登录终端就不会出现欢迎消息 修改hostname显示 修改 /etc/hostname 文件内容为主机名,保…...
Deepseek 本地部署
准备环境 设备:家用笔记本电脑,8核/16G/1Tb SSD/无独显 系统:windows10 软件环境(非源码部署不需要):conda 4.8.5、python3.7、git2.13 步骤 下载安装Ollama 下载地址:OllamaGet up and r…...
[Linux][问题处理]修改密码报You must wait longer to change your password
一、问题描述 在Linux控制台中修改密码,键入旧密码,设置并确认新密码后,却提示You must wait longer to change your password(您必须等待更长时间才能更改密码) 二、原因 当前修改时间 < Minimum number of da…...
《刚刚问世》系列初窥篇-Java+Playwright自动化测试-22- 操作鼠标拖拽 - 下篇(详细教程)
1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,其次有人私信宏哥说是有那种…...
SpringBoot3使用Swagger3
版本 springboot3.4.2 JAVA 17 一、引入Swagger3依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.0.4</version> </dependency> 二、快速启…...
HCIA综合项目之多技术的综合应用实验
十五 HCIA综合实验 15.1 IP规划 #内网分配网段192.168.1.0 24#内网包括骨干链路和两个用户网段,素以需要划分三个,借两位就够用了192.168.1.0 26--骨干192.168.1.64 26---R1下网络192.168.1.128 26---R2下网络192.168.1.192 26--备用192.168.1.64 26--…...
燕千云ITSM已支持DeepSeek对接!AI能力持续升级
春节期间,DeepSeek火爆全网,引发热议,作为国产AI大模型的黑马,DeepSeek凭借独特的训练方法、先进的模型架构和强大的联网推理能力,正不断拓展AI技术的应用边界。其“快思考”能力,可在极短时间内完成复杂决…...
Windows 自动主题:Windows AutoTheme
Windows 自动主题:Windows AutoTheme 链接:https://pan.xunlei.com/s/VOJ2ZG5t8QjL7_fGVIBgyxJQA1?pwdgbie# 自动切换:根据日出、日落时间自动切换 Windows 主题模式。高效轻量:使用 Rust 提供高效的系统调用,保证运…...
自定义Spring Cloud Gateway过滤器:记录慢请求
在构建微服务架构时,API网关是一个关键组件,它负责路由、负载均衡、安全验证等多种功能。Spring Cloud Gateway提供了强大的扩展能力,允许开发者通过自定义过滤器来增强其功能。本文将详细介绍如何实现一个自定义过滤器,用于记录响…...
python 浅拷贝和深拷贝
浅拷贝(Shallow Copy)语法示例代码 1示例代码 2 深拷贝(Deep Copy)语法示例代码 浅拷贝与深拷贝的区别示例:浅拷贝与深拷贝的对比 浅拷贝:只复制外层容器,内层嵌套对象仍然是共享的,…...
uni-app 学习(一)
一、环境搭建和运行 (一)创建项目 直接进行创建 (二)项目结构理解 pages 是页面 静态资源 打包文件,看我们想输出成什么格式 app.vue 页面的入口文件 main.js 是项目的入口文件 存放对打包文件的配置 pages 存放整…...
unity学习37:新版的动画器:动画状态机 Animator
目录 1 给游戏物体添加,新版的动画器 Animator 2 关于 Animator 3 创建 动画器的控制器 Animator Controller 4 打开动画编辑器 Animator 5 动画编辑器 还是Animation 5.1 创建新的动画 5.2 创建第2个动画 5.3 测试2个动画均可用 6 再次打开动画编辑器 A…...
FFmpeg+SDL实现简易视频播放器
参考链接 https://blog.csdn.net/qq_26611129/article/details/98732561 https://www.cnblogs.com/Azion/p/17756274.html https://avmedia.0voice.com/?id49050 https://blog.csdn.net/qq_44825209/article/details/133760652 https://www.cnblogs.com/Azion/p/17525955.htm…...
Vue3实现优雅的前端版本更新提示
背景 在前端项目开发中,当我们发布了新版本后,需要及时通知用户刷新页面以获取最新代码。本文将介绍一种优雅的实现方案。 实现原理 在项目根目录维护一个version.json文件,记录当前版本号前端定期请求version.json检查版本对比本地存储的版本号,如有更新则提示用户 核心代…...
vim常用快捷键
正常模式 在打开文件进入 Vim 后,默认处于正常模式,该模式下的快捷键主要用于光标移动、文本操作等。 光标移动 基本移动:h(左移)、j(下移)、k(上移)、l(右移…...
P1226 【模板】快速幂
P1226 【模板】快速幂 题目描述 给你三个整数 a , b , p a,b,p a,b,p,求 a b m o d p a^b \bmod p abmodp。 输入格式 输入只有一行三个整数,分别代表 a , b , p a,b,p a,b,p。 输出格式 输出一行一个字符串 a^b mod ps,其中 a , b…...
【gRPC-gateway】是否有拦截器的情况添加健康检查的细节,与多路复用runtime.NewServeMux和gRPC区别讲解,与跨域功能,go案例
健康检查详解 什么是健康检查? 健康检查(Health Checking)是一种机制,用于监控服务的状态,确保服务在运行时是健康的、可用的。通过健康检查,系统可以自动检测服务是否正常工作,并在出现问题时…...
vue开发时,用localStorage常用方法及存储数组方法。
localStorage 可以让你在浏览器中存储键值对,并且在页面关闭后数据依然保留。localStorage 中存储的数据会一直保存在客户端,直到被手动删除或者清除浏览器缓存。 localStorage 中存储的数据在同一浏览器的不同窗口之间是共享的,而 sessionSt…...
HashMap详解+简单手写实现(哈希表)
1. 什么是 HashMap? HashMap是Java集合框架中的一种数据结构,它实现了Map接口,用于存储键值对(Key-Value Pair)。HashMap允许null键和null值,并且不保证元素的顺序。 --- 2. HashMap 的工作原理 2.1 内…...