『 Linux 』内存管理与文件系统
文章目录
- 交换分区
- 页与页框(页帧)
- 交换分区与内存之间的交换
- 操作系统如何管理内存
- 物理地址转换页号与页内偏移量
- 内存管理,文件系统与文件管理之间的联系
交换分区

在Linux的安装过程中,用户将会被提示创建一个交换分区;
这是一个特殊的分区,其大小可以由用户根据系统内存需求和推荐进行决定;
若是存在交换分区,通常在Linux中交换分区在文件系统当中并不会挂载,因此它不会在默认的文件浏览器中被显示未一个可访问的驱动器或者是目录;
一般来说一个分区中应当存在一个文件系统,而交换分区虽然被称为分区但其并不存在文件系统;

这块空间虽然在磁盘空间中,但实际上这块空间是交由内存管理所运用;
-
交换分区与文件系统的关系:
-
独立性:
交换分区通常不包含一个文件系统,其并不是用来存储文件或者目录结构的;
它将直接由操作系统进行管理,用于存放被换出的内存页;
-
专用性:
由于交换分区是专门用于内存管理的,因此它与用于存储文件的常规文件系统分区有着本质的区别;
操作系统将直接在交换分区上操作内存页而不是文件或文件系统结构;
-
-
内存管理运用:
-
内存扩展
交换分区相当于是物理内存的一个拓展,提供了一种机制,允许系统使用硬盘空间来模拟额外的RAM从而增加了可用的内存资源;
-
内存释放
当系统的物理内存不足时操作系统可以将不活跃的内存页移交到交换分区并释放内存空间给其他更需要紧急处理的程序或是数据;
-
页与页框(页帧)

在内存管理中存在两个概念,分别为页与页框(页帧);
页是进程地址空间中的最小单位,一般为4kb大小;
而页框(页帧)是物理内存当中的最小单位,其大小等于页的大小;
页通过页表映射至不同页框(页帧)中以实行内存管理;
-
页(Page)
-
定义:
页是虚拟内存中的一个固定大小的块,时进程地址空间中的最小单位;
-
大小:
通常为4kb,但在某些系统重也可以是2MB或者更大(大页或巨页);
-
作用:
页用于将进程地址空间中的虚拟地址划分为若干个固定大小的块从而方便对其进行管理与映射至物理内存;
-
-
页框/页帧(Page Frame)
-
定义:
页框或页帧是物理内存中的一个固定大小的块,其大小与页的大小相同;
-
大小:
通常为4kb,与页的大小相同;
-
作用:
页框用于存储页的内容;
-
页框/页帧的大小可以进行修改,但是其大小的修改只能重新选择操作系统的编译选项对操作系统进行重新编译才能生成;
虚拟内存中的页通过页表映射到物理内存中的页框;

页表记录了每个页对应的页框的信息;
当CPU访问一个虚拟地址时候,内存管理单元MMU将通过页表将虚拟地址转化为物理地址从而方位物理内存中的数据;
其中页表中存储的数据被称为页表项;
页表项是页表中的基本单元,每一个页表项对应一个页,记录了该页在物理内存中的映射信息(页框/页帧);
同通常地址转换过程如下:
-
虚拟地址
虚拟地址由两部分组成,页号(Page Number)和页内偏移量(Offset);
-
页表查找
页号用于索引页表,并找到对应的页表项;
-
物理地址
从页表项中获取页框号,然后与页内偏移量组合形成物理地址;
-
内存访问
CPU使用物理地址访问物理内存中的数据;
当需要访问一个被交换到磁盘上的页面时将会触发缺页中断;
操作系统会将所需的页面从交换分区中换回物理内存,并重新更新页表以反映新的映射关系从而结局缺页中断的问题;
交换分区与内存之间的交换

当存在交换分区且物理内存不足等情况后,操作系统将会将部分没有必要的 页框/页帧 换出至磁盘中的交换分区中,这种交换被称为页面置换;
这是通过页面置换的算法实现的;
通常页面置换的算法包括:
-
最近最少使用
操作系统将选择最近最少使用的页面进行置换;
-
先进先出
操作系统将选择最早加载到内存中的页进行置换;
-
最不常用
操作系统将选择使用频率最低的页面进行置换;
通常被换出的大小为一个页框/页帧的大小,由于局部性原理,置换的页面可能是连续的,所以对于资源的浪费上一般只有最后一个页才会被浪费;
同时由于空间局部性原理,当在访问一个页时将会有很大的概率去访问该页的上下文,所以当在进行交换时将会有一个预加载机制,固定大小可以有效的进行这个预加载机制;
同时交换大小的固定可以减少内部碎片;
操作系统如何管理内存

在计算机当中操作系统可以直接看到物理内存并直接或间接对物理内存进行内存管理;
操作系统将把物理内存看做是若干个"页框/页帧";
且将通过 “先描述,再组织” 的方式对物理内存进行管理;
在操作系统内存中存在名为struct page的结构体;
这个结构体用于表示无力内存中的一个"页框/页帧",每个物理"页框/页帧"都有一个对应的 struct page 结构体实例,操作系统内核将通过这些结构体来管理物理内存;
其主要的字段如下:
-
flags该字段用于存储页的状态标志,如是否被锁定,是否为脏页等;
-
count引用计数,表示该页框被引用的次数;
如在进行子进程的创建时,其子进程将为父进程的一份拷贝,其进程地址空间中所映射的物理内存在未进行写入操作的状态下为同一个物理内存;
而该引用计数即为维护页框被引用的次数;
-
mapping指向该页所属的地址空间;
-
private用于存储与页框相关的私有数据;
-
virtual当页框被页映射时该字段将存储页框的虚拟地址;
struct page {unsigned long flags; // 页的状态标志atomic_t count; // 引用计数struct address_space *mapping; // 地址空间指针pgoff_t index; // 页的索引void *private; // 私有数据void *virtual; // 虚拟地址
};
以4GB为例,该内存当中将会有
4 × 1024 × 1024 × 1024 bytes 4 × 1024 bytes/page = 1048576 pages \frac{4 \times 1024 \times 1024 \times 1024 \text{ bytes}}{4 \times 1024 \text{ bytes/page}} = 1048576 \text{ pages} 4×1024 bytes/page4×1024×1024×1024 bytes=1048576 pages
个这样的结构体;
而这些结构体将会以数组的方式进行管理,struct page mem_array[1048576];
而这个数组中每一个数组下标即对应着一个页框的 页号 ;
- 例如
-
mem_array[0]对应第一个物理页框; -
mem_array[1]对应第二个物理页框; - 以此类推,
mem_array[1048575]对应最后一个物理页框;
-
在32位机器中,页内偏移量占用低12位,页号占用高20位;
一般情况下物理地址的计算如下:
- 物理地址 = 页号 * 页大小 + 页内偏移量
假设页的大小为4kb,页号为i,页内偏移量为offset,则物理地址为:
- 物理地址 = i * 212 + offset
因为这个结构体是存在于页框当中,而页框的大小仅只有4kb;
所以对应的结构体并不会太大(避免过多占用内存),通常以union的形式定义;
物理地址转换页号与页内偏移量

在32位系统中,物理地址为32位;
假设页的大小为4kb即 212 字节;
其中页号占用高20位,页内偏移量占用低12位;
- 提取页号
- 掩码:
0xFFFF F000 - 操作: 物理地址 &
0xFFFF F000 - 结果: 保留高
20位,将低12位清零;
- 掩码:
- 提取页内偏移量
- 掩码:
0x0000 0FFF - 操作: 物理地址 &
0x0000 0FFF - 结果: 保留低
12位,将高20位清零;
- 掩码:
假设物理地址为0x12345678;
其二进制表示:0001 0010 0011 0100 0101 0110 0111 1000;
-
高20位(页号)
高20位:
0001 0010 0011 0100 0101
十六进制表示:0x12345 -
低12位(页内偏移量)
低12位:
0110 0111 1000
十六进制表示:0x678
当需要访问一个内存时只需要先找到这个4kb对应的page即可以找到对应的物理页框;
而实际上所有方位内存的动作都可以看做是访问内存Page数组;
内存管理,文件系统与文件管理之间的联系

当操作系统启动时将会进行预加载;
在文件系统中的预加载的内容一般为文件系统中的关于SuperBlock,GroupDescriptorTable,BlockBitmap,InodeBitmap等属性信息从而方便操作系统内核对其进行管理;
-
属性
当一个进程需要打开一个文件时,操作系统将会为这个打开的文件在进程的
task_struct结构体中维护一个file_struct结构体,其中这个结构体中保存了一个struct file*fd_array[]结构体用于指向各个struct file文件结构体;其中
file* fd_array[]结构体的下标即为文件描述符;当打开一个文件时即为需要去访问该文件的信息,在
struct file结构体中存储的信息只为少量的信息;详细信息一般被存储在文件的
Inode中;而操作系统将会通过物理内存中的
InodeBitmap,InodeTable中依次去寻找其对应的Inode;当找到对应的Inode后操作系统内核将为这个打开的文件维护一个
struct inode结构体并将Inode中的信息加载至该结构体当中从而能够建立文件与内核之间的联系;struct inode {umode_t i_mode; // 文件类型和权限unsigned long i_ino; // inode 号atomic_t i_count; // 引用计数struct file_operations *i_fop; // 文件操作函数指针struct super_block *i_sb; // 指向超级块的指针struct address_space *i_mapping; // 地址空间指针loff_t i_size; // 文件大小struct timespec i_atime; // 最后访问时间struct timespec i_mtime; // 最后修改时间struct timespec i_ctime; // inode 最后更改时间// 其他字段... }; -
内容
同样的在
struct file结构体中有一个指针,该指针指向了一个名为struct address_space的结构体;struct radix_tree_root {void *rnode; // 基数树根节点指针// 其他字段... };在这个结构体中将会维护一棵名为
radix_tree_root树,这是一棵结构为基数树的树;而其中这棵树的每个节点即指向了一个
strcut page的结构体;struct page {unsigned long flags; // 页的状态标志atomic_t count; // 引用计数struct address_space *mapping; // 地址空间指针pgoff_t index; // 页的索引void *private; // 私有数据void *virtual; // 虚拟地址 };

相关文章:
『 Linux 』内存管理与文件系统
文章目录 交换分区页与页框(页帧)交换分区与内存之间的交换操作系统如何管理内存物理地址转换页号与页内偏移量 内存管理,文件系统与文件管理之间的联系 交换分区 在Linux的安装过程中,用户将会被提示创建一个交换分区; 这是一个特殊的分区,其大小可以由用户根据系统内存需求和…...
线性代数|机器学习-P8矩阵低秩近似eckart-young
文章目录 1. SVD奇异值分解2. Eckart-Young2.1 范数 3. Q A Q U Σ V T QAQU\Sigma V^T QAQUΣVT4. 主成分分析图像表示 1. SVD奇异值分解 我们知道,对于任意矩阵A来说,我们可以将其通过SVD奇异值分解得到 A U Σ V T AU\Sigma V^T AUΣVT࿰…...
平面设计神器CorelDRAW2021精简版,你值得拥有!
亲爱的设计师小伙伴们,今天我要为大家种草一款神奇的软件——CorelDRAW平面设计软件2021精简版!🤩✨作为一名专业的图形设计师,我深知一个好工具对于我们的工作有多么重要。而这款软件简直就是我们设计师的救星!&#…...
kafka是什么?
Kafka是一个由Apache软件基金会开发的开源流处理平台,最初由LinkedIn公司开发,使用Scala和Java编写。它是一个高吞吐量的分布式发布订阅消息系统,可以处理消费者在网站中的所有动作流数据,如网页浏览、搜索和其他用户行为等。Kafk…...
ABC351
C 栈的应用 #include<bits/stdc.h>using namespace std;stack<int>stk;int main() {int n;cin>>n;for(int i1;i<n;i){int a;cin>>a;while(!stk.empty()&&astk.top()){stk.pop();a;}stk.push(a);}cout<<stk.size()<<endl;retur…...
base上海,数据科学,数据挖掘,数据分析等岗位求收留
裁员了,base上海,数据科学,数据挖掘,数据分析等岗位,期望30k~40k,求推荐求收留 1,6年数据算法工作,做过指标体系搭建,用户画像,货品定价,社区分析…...
IC元器件
1.电阻: 电阻的作用: 1.与负载串联:做限流分压 2.电阻并联:将小功率电阻并联成大功率,防烧毁 2.电容: 电容就是两块金属板+中间的介质(相当于两个人坐在一起加上中间的空气…...
SQL159 每个创作者每月的涨粉率及截止当前的总粉丝量
描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-09-01 10:00:002021-09-01 10:00:20011NULL210520022021-09-10 11:00:002021-09-10 11:00:30101NULL310120012021-10-01 10:00:002021-10-01 10:00…...
Linux安装MySQL教程【带图文命令巨详细】
巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本,上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…...
外部排序快速入门详解:基本原理,败者树,置换-选择排序,最佳归并树
文章目录 外部排序1.最基本的外部排序原理2.外部排序的优化2.1 败者树优化方法2.2 置换-选择排序优化方法2.3 最佳归并树 外部排序 为什么要学习外部排序? 答: 在处理数据的过程中,我们需要把磁盘(外存)中存储的数据拿到内存中处理…...
人工智能和物联网如何结合
欢迎来到 Papicatch的博客 目录 🍉引言 🍉AI与IoT的结合方式 🍈数据处理和分析 🍍实例 🍈边缘计算 🍍实例 🍈自动化和自主操作 🍍实例 🍈安全和隐私保护 &…...
【JAVASE】JAVA应用案例(下)
一:抢红包 一个大V直播时,发起了抢红包活动,分别有9,666,188,520,99999五个红包。请模拟粉丝来抽奖,按照先来先得,随机抽取,抽完即止,注意:一个红包只能被抽一次,先抽或…...
【面试干货】 B 树与 B+ 树的区别
【面试干货】 B 树与 B 树的区别 1、B 树2、 B 树3、 区别与优缺点比较4、 总结 💖The Begin💖点点关注,收藏不迷路💖 在数据库系统中,B 树和 B 树是常见的索引结构,它们在存储和组织数据方面有着不同的设计…...
Socket编程权威指南(四)彻底解密 Epoll 原理
在上一篇文章中,我们优化了基于 Socket 的网络服务器,从最初的 select/poll 模型进化到了高效的 epoll。很多读者对 epoll 的惊人性能表示极大的兴趣,对它的工作原理也充满了好奇。今天,就让我们一起揭开 epoll 神秘的面纱&#x…...
Windows开始ssh服务+密钥登录+默认启用powershell
文章内所有的命令都在power shell内执行,使用右键单击Windows徽标,选择终端管理员即可打开 Windows下OpenSSH的安装 打开Windows power shell,检查SSH服务的安装状态。会返回SSH客户端和服务器的安装状态,一下是两个都安装成功的…...
实体商铺私域流量打造策略:从引流到转化的全链路解析
在数字化时代,实体商铺面临着前所未有的挑战与机遇。随着线上购物的兴起,传统商铺如何吸引并留住顾客,成为了每个实体店家必须面对的问题。私域流量的打造,正是解决这一问题的关键所在。本文将从引流、留存、转化三个方面…...
实战 | 通过微调SegFormer改进车道检测效果(数据集 + 源码)
背景介绍 SegFormer:实例分割在自动驾驶汽车技术的快速发展中发挥了关键作用。对于任何在道路上行驶的车辆来说,车道检测都是必不可少的。车道是道路上的标记,有助于区分道路上可行驶区域和不可行驶区域。车道检测算法有很多种,每…...
翻译《The Old New Thing》- Why do messages posted by PostThreadMessage disappear?
Why do messages posted by PostThreadMessage disappear? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20090930-00/?p16553 Raymond Chen 2008年09月30日 为什么 PostThreadMessage 发布的信息会消失? 在显示用户界面的线…...
【深度学习】—— 神经网络介绍
神经网络介绍 本系列主要是吴恩达深度学习系列视频的笔记,传送门:https://www.coursera.org/deeplearning-ai 目录 神经网络介绍神经网络的应用深度学习兴起的原因 神经网络,全称人工神经网络(Artificial Neural Network…...
python-数字黑洞
[题目描述] 给定一个三位数,要求各位不能相同。例如,352是符合要求的,112是不符合要求的。将这个三位数的三个数字重新排列,得到的最大的数,减去得到的最小的数,形成一个新的三位数。对这个新的三位数可以重…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
