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

『 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位;

假设页的大小为4kb212 字节;

其中页号占用高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&#xff0…...

平面设计神器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上海,数据科学,数据挖掘,数据分析等岗位求收留

裁员了&#xff0c;base上海&#xff0c;数据科学&#xff0c;数据挖掘&#xff0c;数据分析等岗位&#xff0c;期望30k~40k&#xff0c;求推荐求收留 1&#xff0c;6年数据算法工作&#xff0c;做过指标体系搭建&#xff0c;用户画像&#xff0c;货品定价&#xff0c;社区分析…...

IC元器件

1.电阻&#xff1a; 电阻的作用&#xff1a; 1.与负载串联&#xff1a;做限流分压 2.电阻并联&#xff1a;将小功率电阻并联成大功率&#xff0c;防烧毁 2.电容&#xff1a; 电容就是两块金属板&#xff0b;中间的介质&#xff08;相当于两个人坐在一起加上中间的空气…...

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版本&#xff0c;上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…...

外部排序快速入门详解:基本原理,败者树,置换-选择排序,最佳归并树

文章目录 外部排序1.最基本的外部排序原理2.外部排序的优化2.1 败者树优化方法2.2 置换-选择排序优化方法2.3 最佳归并树 外部排序 为什么要学习外部排序&#xff1f; 答&#xff1a; 在处理数据的过程中&#xff0c;我们需要把磁盘(外存&#xff09;中存储的数据拿到内存中处理…...

人工智能和物联网如何结合

欢迎来到 Papicatch的博客 目录 ​ &#x1f349;引言 &#x1f349;AI与IoT的结合方式 &#x1f348;数据处理和分析 &#x1f34d;实例 &#x1f348;边缘计算 &#x1f34d;实例 &#x1f348;自动化和自主操作 &#x1f34d;实例 &#x1f348;安全和隐私保护 &…...

【JAVASE】JAVA应用案例(下)

一&#xff1a;抢红包 一个大V直播时&#xff0c;发起了抢红包活动&#xff0c;分别有9,666,188,520,99999五个红包。请模拟粉丝来抽奖&#xff0c;按照先来先得&#xff0c;随机抽取&#xff0c;抽完即止&#xff0c;注意&#xff1a;一个红包只能被抽一次&#xff0c;先抽或…...

【面试干货】 B 树与 B+ 树的区别

【面试干货】 B 树与 B 树的区别 1、B 树2、 B 树3、 区别与优缺点比较4、 总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在数据库系统中&#xff0c;B 树和 B 树是常见的索引结构&#xff0c;它们在存储和组织数据方面有着不同的设计…...

Socket编程权威指南(四)彻底解密 Epoll 原理

在上一篇文章中&#xff0c;我们优化了基于 Socket 的网络服务器&#xff0c;从最初的 select/poll 模型进化到了高效的 epoll。很多读者对 epoll 的惊人性能表示极大的兴趣&#xff0c;对它的工作原理也充满了好奇。今天&#xff0c;就让我们一起揭开 epoll 神秘的面纱&#x…...

Windows开始ssh服务+密钥登录+默认启用powershell

文章内所有的命令都在power shell内执行&#xff0c;使用右键单击Windows徽标&#xff0c;选择终端管理员即可打开 Windows下OpenSSH的安装 打开Windows power shell&#xff0c;检查SSH服务的安装状态。会返回SSH客户端和服务器的安装状态&#xff0c;一下是两个都安装成功的…...

实体商铺私域流量打造策略:从引流到转化的全链路解析

在数字化时代&#xff0c;实体商铺面临着前所未有的挑战与机遇。随着线上购物的兴起&#xff0c;传统商铺如何吸引并留住顾客&#xff0c;成为了每个实体店家必须面对的问题。私域流量的打造&#xff0c;正是解决这一问题的关键所在。本文将从引流、留存、转化三个方面&#xf…...

实战 | 通过微调SegFormer改进车道检测效果(数据集 + 源码)

背景介绍 SegFormer&#xff1a;实例分割在自动驾驶汽车技术的快速发展中发挥了关键作用。对于任何在道路上行驶的车辆来说&#xff0c;车道检测都是必不可少的。车道是道路上的标记&#xff0c;有助于区分道路上可行驶区域和不可行驶区域。车道检测算法有很多种&#xff0c;每…...

翻译《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 发布的信息会消失&#xff1f; 在显示用户界面的线…...

【深度学习】—— 神经网络介绍

神经网络介绍 本系列主要是吴恩达深度学习系列视频的笔记&#xff0c;传送门&#xff1a;https://www.coursera.org/deeplearning-ai 目录 神经网络介绍神经网络的应用深度学习兴起的原因 神经网络&#xff0c;全称人工神经网络&#xff08;Artificial Neural Network&#xf…...

python-数字黑洞

[题目描述] 给定一个三位数&#xff0c;要求各位不能相同。例如&#xff0c;352是符合要求的&#xff0c;112是不符合要求的。将这个三位数的三个数字重新排列&#xff0c;得到的最大的数&#xff0c;减去得到的最小的数&#xff0c;形成一个新的三位数。对这个新的三位数可以重…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...