『 Linux 』内存管理与文件系统

news2024/11/23 10:43:41

文章目录

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


交换分区

请添加图片描述

在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;              // 虚拟地址
    };
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1794575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apache POI对Excel进行读写操作

1、什么是Apache POI ​ Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。一般情况下,POI 都是用于操作 Excel 文件。 Apache POI 的应用场景&…

动手学深度学习4.6 暂退法-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:丢弃法_哔哩哔哩_bilibili 本节教材地址:4.6. 暂退法(Dropout)…

使用python把gif转为图片

使用python把gif转为图片 程序思路效果代码 程序思路 打开 GIF 文件。确保输出文件夹存在,如果不存在则创建。获取 GIF 的帧数。遍历每一帧,将其保存为单独的 PNG 图像,并打印保存路径。 效果 把这张派大星gif转为一张张图片: …

小程序 UI 风格美不胜收

小程序 UI 风格美不胜收 小程序 UI 风格美不胜收

系统安全及应用11

一个新的服务器到手之后,部署服务器的初始化 1、配置IP地址 网关 dns解析(static)内网和外网 2、安装源外网(在线即可),内网(只能用源码包编译安装) 3、磁盘分区,lvm …

ICPC2024 邀请赛西安站(7/8/13)

心得 [ICPC2024 Xian I] ICPC2024 邀请赛西安站重现赛 - 比赛详情 - 洛谷 7表示赛时ac了7个&#xff0c;8表示含补题总共ac数&#xff0c;13表示题目总数 题目 M. Chained Lights 打表&#xff0c;发现只有k1是YES //#include <bits/stdc.h> #include<iostream&…

亮数据代理IP助力高效数据采集

文章目录 &#x1f4d1;前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 本篇采用的代理IP 四、零代码获取数据4.1 前置背景4.2 亮数据浏览器自动抓取数据4.3 使用步骤&#xff1a; 五、数据集5.1 免费样本5.2 定制数据集 &#x1f324;️个人小结 &#x1f…

(uniapp)简单带动画的tab切换效果

效果图 代码 <template><view class"tabBox"><view :style"{transform: translateX(${translateX})}" class"whiteBox"></view><view click"changeTab(k)" class"itemBox" v-for"(v,k) in…

程序员职业素养:AI新时代下的机遇与挑战

目录 一、引言二、程序员职业素养的五大要点1. 技术能力2. 沟通能力3. 团队合作4. 责任心5. 敬业精神 三、实际案例解析四、程序员职业素养在实际工作中的应用五、AI新时代的程序员的职业发展建议六、总结七、结语 一、引言 在当今这个科技飞速发展的时代&#xff0c;程序员这…

Verba:终极 RAG 引擎 - 语义搜索、嵌入、矢量搜索等!

原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; Verba&#xff1a;终极 RAG 引擎 - 语义搜索、嵌入、矢量搜索等&#xff01; &#x1f31f;在本文中&#xff0c;我们将深入探讨 Verba&am…

Isaac Lab CartPole实验(摄像头版本)

Isaac Lab安装可以看这个教程&#xff1a;http://t.csdnimg.cn/SN7duhttp://t.csdnimg.cn/SN7du 1. 问题定义与建模 问题描述&#xff1a;CartPole问题是一个经典的强化学习问题&#xff0c;cartpole 由 cart和pole构成&#xff0c;其中一个小车&#xff08;Cart&#xff09;上…

深入解析 Web 开发中的强缓存与协商缓存机制

在 Web 开发中,缓存机制是提高页面加载速度和用户体验的重要技术。缓存分为两种主要类型:强缓存和协商缓存。本文将详细介绍这两种缓存机制的原理、实现方式及其区别,并演示如何在 <meta> 元素中和 Nginx 服务器中进行缓存控制。 强缓存 强缓存(Strong Caching)是指…

【机器学习】——驱动智能制造的青春力量,优化生产、预见故障、提升质量

目录 一.优化生产流程 1.1 数据收集 1.2 数据预处理 1.3 模型训练 1.4 优化建议 1.5 示例代码 二.预测设备故障 2.1 数据收集 2.2 数据预处理 2.3 模型训练 2.4 故障预测 2.5 示例代码 三.提升产品质量 3.1 数据收集 3.2 数据预处理 3.3 模型训练 3.4 质量提升…

X-Caps

用于对视觉属性进行编码的胶囊 补充信息 数据集太大&#xff0c;不建议复现

poi4.1导出excel支持xlx,xlsx格式,解决导出execl提示‘文件已经被损坏,无法打开‘

目录 一.maven jar包引入 二.xls格式 三.xlsx格式 一.maven jar包引入 注意&#xff0c;如果要用到xlsx格式&#xff0c;需要导入poi-ooxml <!-- https://mvnrepository.com/artifact/org.apache.poi/poi fx--><!-- 使用xls格式时,只要导入poi-version-yyyymmdd.ja…

# 全面解剖 消息中间件 RocketMQ-(4)

全面解剖 消息中间件 RocketMQ-&#xff08;4&#xff09; 一、RocketMQ 顺序消息分析 1、消息有序&#xff1a;指的是可以按照消息的发送顺序来消费(FIFO)。RocketMQ 可以严格的保证消息有序&#xff0c;可以分为分区有序或者全局有序。 2、顺序消费的原理解析 在默认的情…

oracle报错ORA-01940: cannot drop a user that is currently connected解决方法

目录 一.原因 二.解决方法 1.查询活动会话 2.记下SID和SERIAL# 3.断开会话 4.删除用户 一.原因 ORA-01940代表你正在删除一个有活动会话的用户 二.解决方法 1.查询活动会话 SQL> SELECT sid, serial#, username, programFROM v$sessionWHERE username 你要删除的u…

使用 Django Channels 构建实时聊天应用(包含用户认证和消息持久化)

文章目录 准备工作创建 Django 项目创建应用程序配置项目编写 Consumer编写路由创建 URL 路由运行应用用户认证消息持久化显示历史消息结论 Django Channels 是 Django 的一个扩展&#xff0c;允许在 Web 应用中添加实时功能&#xff0c;例如 Websockets、HTTP2 和其他协议。本…

CasaOS玩客云如何部署小雅AList并结合内网穿透远程访问海量资源

文章目录 前言1. 本地部署AList2. AList挂载网盘3. 部署小雅alist3.1 Token获取3.2 部署小雅3.3 挂载小雅alist到AList中 4. Cpolar内网穿透安装5. 创建公网地址6. 配置固定公网地址 前言 本文主要介绍如何在安装了CasaOS的玩客云主机中部署小雅AList&#xff0c;并在AList中挂…

原来Stable Diffusion是这样工作的

stable diffusion是一种潜在扩散模型&#xff0c;可以从文本生成人工智能图像。为什么叫做潜在扩散模型呢&#xff1f;这是因为与在高维图像空间中操作不同&#xff0c;它首先将图像压缩到潜在空间中&#xff0c;然后再进行操作。 在这篇文章中&#xff0c;我们将深入了解它到…