内存使用(分段、分区、分页、多级页表、快表)--OS

2023-10-26

内存使用

内存使用:将程序放在内存中,PC指向内存地址

首先,我们需要让程序进入内存

举个例子

int main(int argc, char *argv[])
{
    ...
}
.text
_entry: //入口地址
    call _main
    call _exit
_main:
    ...
    ret

_entry: //入口地址
    call 40
    call xx
_main: //偏移是40
    ...

我们需要把上面这段程序放入内存中,因为里边有条指令call 40,这意味着在物理内存中,main函数就必须放在内存地址为40的地方,这样程序才能执行

//物理内存中
40: _main: mov[300], 0
...
call x
call 40

上面的方法理论上是可行的,代码确实能够在内存中运行,但是程序必须放在0地址处,main函数必须放在40处,如果有多个程序同时需要用到40处的内存,那么就会发生冲突,因此,我们需要修改程序中的地址,也就是将程序中的地址加上偏移,比如说把程序开始地址放在1000处

1040: _main: mov[300], 0
...
call x
call 40  --> ip=1000

重定位:修改程序中的地址(是相对地址)

找一段空闲的内存,将程序放入内存中,重定位程序中的逻辑地址

什么时候完成重定位?编译时, 载入时

  • 编译时重定位的程序只能放在内存固定位置

  • 载入时重定位的程序一旦载入内存就不能动了

载入时重定位比较灵活,但是程序载入之后还需要移动

交换(swap)

计算机内存资源紧张,而磁盘资源多,因此我们一般会将睡眠的进程换出到磁盘,然后再从磁盘中换入进程,这样一来,就不会造成内存的浪费,同时,一个进程被换入换出,其内存位置肯定发生了变化,那么载入时重定位的程序就不能执行了。

因此,从上面我们知道,一个程序被换入时,就开始执行,而我们就要在此时进行重定位,也就是在运行时重定位

运行时重定位(地址翻译):每个进程对应的PCB都会保存基地址(base),执行指令时第一步先从PCB中取出这个基地址,然后对每一条取指指令进行地址翻译

分段

一个程序一般由以下部分组成

  • 主程序 mian
  • 变量集 data
  • 函数库 sin
  • 动态数组 array
  • 栈 stack

根据分治的思想,我们希望对不同的段进行不同的处理,这就是分段的作用

内存使用我们知道,我们需要在运行时重定位,而我们重定位的方法就是从进程的PCB中取出基地址,然后对取指指令进行地址翻译,但是当我们一个进程被分段了,那么此时一个基地址就不够用了,这时候就有了<段号,段内偏移>,如mov[es:bx], ax;

因此,我们在PCB中设计一个表结构(段表),根据段号可以查找段内偏移,然后进行地址翻译
在这里插入图片描述
GDT表:操作系统对应的段表

LDT表:进程对应的段表

内存分区

从上面我们知道,一个程序分段放入内存,在执行时需要在PCB中的LDT表找到段内偏移,而cpu是基于寄存器来工作的,因此有一个保存段表的寄存器ldtr还有一个保存段号的寄存器cs,举个例子

ldtr--->    1 1000
            0 3000

jump 40     cs:40 ---> 0:40 ---> 40+3000

这就完成了地址翻译

切换进程时,ldtr就指向新的PCB中的LDT表

从上面我们引出一个问题,当我们对一个程序进行分段时,需要在内存中找到一段空闲分区,将程序载入内存时同时对LDT进行初始化,那么我们要如何对内存进行分区?

固定分区

将内存等分为k个分区

该方法不合适,因为程序大小不一

可变分区

根据程序大小分区

可变分区的管理

可变分区的管理实际上就是维护一个表

//表结构
起始地址        内存长度

程序段申请内存,有三种方式

  • 首先适配:时间复杂度为O(1)
  • 最佳适配:与所需内存大小相差最小的分区,易产生极小的内存段
  • 最差适配:与所需内存大小相差最大的分区

分页

分页:解决内存分区导致的内存效率问题

内存分区制造了一大堆细小的内存碎片,没办法使用,如果采用内存紧缩的方法(即将各个内存碎片移动到一起),效率太低,因此引出了内存分页的概念

分页:将内存分页,根据段的请求,系统一页一页的分配给这个段,这样一个段最多就浪费一页的内存。

jmp 40如何执行?如何找到实际的物理内存?

跟段表类似,分页机制也有页表

//页表结构
Page#       Offset
第几页      页面尺寸

例子

mov [0x2240], &eax
逻辑地址    0x02    0x240

在PCB表中找到页表首地址指针赋给cr3

页号        页框号      保护
0           5           R
1           1           R/W
2           3           R/W
3           6           R

页框是物理分页的页号

页号 = 逻辑地址/页面尺寸 = 0x2240<<12 = 2

找到页框号为3,将页框号>>12,也就是把3接在240前面,找到物理内存3240

这些计算都是由MMU完成的,只要给出逻辑地址和页表首地址,MMU就能自动算出物理地址

多级页表

分页机制中,页表在地址翻译中起到关键性的作用,而页表号又等于逻辑地址/页面大小,为了减少内存浪费,页面大小一般都不会大,如果页面大小为4k,那当我们写一个32为程序时,内存地址就是2^322^32/2^12 = 2^20也就是1M,而一个页表项需要4个字节,所以一个页表就需要4M内存,当系统并发执行多个进程时,就会消耗大量的内存空间

那么如何解决这个问题?

实际上大部分逻辑地址根本不会用到

32位:[0, 4G]

一个简单hello.c文件怎么可能需要4G的内存,实际上大部分物理地址都不会被用到,那么也不同特地的为它们设置页表项

第一种尝试,只存放用到的页

如果去掉不需要的页,那么整个页表就不连续,不连续的页表查询页表项那么效率肯定降低,所以这种方法不可行

如何既要页表连续又要让页表占用内存少?

用书的章目录和节目录来类比思考……

第二种尝试,多级页表,即页目录(章) + 页表(节)
在这里插入图片描述

从图中可以看到,我们将一个逻辑地址划分位3段,前10位为页目录号,中间10位位页号,当我们需要查询页号时,首先查询一下页目录号,而页目录号也就10位,页表占用内存就是2^10*4=4k,
而页目录项对应的一个页表大小为2^10*4=4k,一个页表对应的内存为2^12*2^10*4=4M,因此一个页目录其实就指向了物理内存的4G,但是当我们使用12M时,也就是3个页表+一个页目录表=16k;

因此,采用了多级页表,一个使用了12M内存大小的32位进程的页表占用内存才16K

但是,多级页表的增加也导致访存次数的增多,每增加一级页表,访存次数就多一次,当操作系统为64位系统时,访存次数就会增加到5、6次,如何既能保证空间还能尽量降低时间呢?

快存

多级页表增加了访存的次数,尤其是64位系统

  • TLB是一组相联快速存储,是寄存器

对于一些经常用到的页表,我们可以将其放在TLB中,而TLB是寄存器,执行速度非常快,当在TLB找不到时,就回到多级页表中去查找,也就是TLB和多级页表的合作。
在这里插入图片描述

TLB得以发挥作用的原因

  • TLB命中时效率会很高,未命中时效率降低

      有效访问时间 = HitR * (TLB+MA) + (1-HitR)*(TLB+2MA)
      HitR:命中率
      MA: 内存访问时间
      TLB: TLB时间
    
  • TLB价格很高,一般为[64,1024]

为什么TLB条目数可以在64-1024之间

  • 程序的地址访问存在局部性
  • 程序多体现为循环、顺序结构
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存使用(分段、分区、分页、多级页表、快表)--OS 的相关文章

  • texlive支持中文的简单方法

    1 确保tex文件的编码方式是UTF 8 2 在文档开始处添加一行命令即可 即 usepackage UTF8 ctex 如下所示 documentclass article usepackage UTF8 ctex begin artic
  • MySQL基础(非常全)

    MySQL基础 一 MySQL概述 1 什么是数据库 答 数据的仓库 如 在ATM的示例中我们创建了一个 db 目录 称其为数据库 2 什么是 MySQL Oracle SQLite Access MS SQL Server等 答 他们均是
  • 虚拟内存的最大容量与实际容量区别

    虚拟内存的最大容量与实际容量区别 1 概念介绍 虚拟内存的最大容量是计算机的地址结构 CPU寻址范围决定的 虚拟内存的实际容量是内存与外存之和 CPU寻址范围 两者的最小值 2 例题介绍 某计算机的地址结构是64位 按字节编址 内存大小51
  • RTX线程通信之——线程标志

    文章目录 Thread Flags 概念 RTX线程标志API 案例 LED灯同步闪亮 小结 参考资料 Thread Flags In a real application we need to be able to communicate
  • Linux 磁盘与文件系统管理(鸟哥私房菜)

    本文来自 http vbird dic ksu edu tw linux basic 0230filesystem php 第八章 Linux 磁盘与文件系统管理 系统管理员很重要的任务之一就是管理好自己的磁盘文件系统 每个分割槽不可太大也
  • Windows 添加永久静态路由

    route add p 10 10 0 0 mask 255 255 0 0 10 10 6 1 p 参数 p 即 persistent 的意思 p 表示将路由表项永久加入系统注册表
  • 深入ftrace kprobe原理解析

    Linux krpobe调试技术是内核开发者专门为了编译跟踪内核函数执行状态所涉及的一种轻量级内核调试技术 利用kprobe技术 内核开发人员可以在内核的绝大多数指定函数中动态插入探测点来收集所需的调试状态信息而基本不影响内核原有的执行流程
  • Elasticsearch 日志

    下载并安装 Filebeat 首次使用 Filebeat 请参阅入门指南 复制代码片段 curl L O https artifacts elastic co downloads beats filebeat filebeat 7 2 0
  • Linux学习--CentOS7.5

    CentOS7命令大全 Linux系统简介 Unix Linux发展史 Linux目录结构 树形结构 查看 切换以及创建目录 文本内容操作 grep工具 关机和重启 Linux命令 基本用法 ls list 使用通配符 mkdir 别名 g
  • Linux alien命令

    一 简介 alien是一个用于在各种不同的Linux包格式相互转换的工具 其最常见的用法是将 rpm转换成 deb 或者反过来 二 安装 http toutiao com a6188997768449360129 三 实例 http www
  • Windows运行常用命令(win+R)

    1 calc 启动计算器 2 notepad 打开记事本 3 write 写字板 4 mspaint 画图板 5 snippingtool 截图工具 支持无规则截图 6 mplayer2 简易widnows media player 7 S
  • Windows驱动开发(一)第一个驱动程序

    首先我们需要了解 在操作系统中 是分两种权限的 一种是内核态 我们也称为0环 一种是用户态 称之为3环 而在我们的电脑中 驱动程序是运行在内核态的 这意味着和操作系统内核是在同一权限的 而普通的应用程序的权限是最低的 高权限谁不想拥有呢 因
  • 内存管理——分页分段

    一 分页存储管理 1 页面与页框 1 页面 将一个进程的逻辑地址空间分成若干个大小相等的片 称为页面或页 并为各页加以编号 2 页框 相应于页面 把内存空间分成和页面相同大小的若干个存储块 称为 物理 块或页框 frame 3 页内碎片 在
  • Anaconda 安装 Python 库(MySQLdb)的方法-(转)

    安装python库的过程中 最重要的地方就是版本需要兼容 其中操作系统为64位 Python为2 X 64位 下载安装文件的时候也要注意版本匹配 其中文件名中包含的cp27表示CPython 2 7版本 cp34表示CPython 3 4
  • 图解五种磁盘调度算法, FCFS, SSTF, SCAN, C-SCAN, LOOK

    一 FCFS 调度 先来先服务 磁盘调度的最简单形式当然是先来先服务 FCFS 算法 虽然这种算法比较公平 但是它通常并不提供最快的服务 例如 考虑一个磁盘队列 其 I O 请求块的柱面的顺序如下 98 183 37 122 14 124
  • linux 使用systemctl 启动服务报错: Error: No space left on device

    By default Linux only allocates 8192 watches for inotify which is ridiculously low And when it runs out the error is als
  • 操作系统常见面试题

    1 什么是进程 Process 和线程 Thread 有何区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动 进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体 是CPU调度和分派的基本单位 它是比进程更小的能
  • java IO、NIO、AIO详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 IO流 同步 阻塞 二 NIO 同步 非阻塞 三 NIO2 异步 非阻塞 正文 回到顶部 概述 在我们学习Java的IO流之前 我们都要了解几个关键词 同步与异步 sy
  • I/O设备模型

    I O设备模型 绝大部分的嵌入式系统都包括一些I O Input Outut 输入 输出 设备 例如仪器上的数据显示屏 工业设备上的串口通信 数据采集设备上用于保存数据的Flash或SD卡 以及网络设备的以太网接口等 I O设备模型框架 R
  • 【操作系统xv6】学习记录4-一级页表与二级页表

    占位

随机推荐

  • 『Asp.Net 组件』Asp.Net 服务器组件 内嵌CSS:将CSS封装到程序集中

    代码 using System using System Web using System Web UI using System Web UI HtmlControls using System Web UI WebControls na
  • ubuntu执行apt-get install出现E: Unable to locate package 问题

    报错原因 就是没找到你要安装的那个软件 解决方法 1 检查你要安装的软件名中 是不是吧英文的 写成了中文的 2 所要安装的那个软件已经不存在了 极有可能是改名了 所以你需要执行apt cache search 关键字 查找你所要安装的这类软
  • W800系列

    目录 续前文 调试前配置 下载调试 增加一个新的demo 目前存在的问题 待解决 win11系统提示调试错误 驱动问题解决步骤 供复现及参考分析用 调试仿真错误 T HeadDebugServer运行截图 续前文 W800系列 ST LIN
  • 用例的一些知识

    一 用例执行 说明 执行结果与用例的期望结果不一致 含义 为缺陷 提示 用例结果不通过为缺陷 需要进行缺陷管理 二 缺陷 01定义 软件中存在的各种问题 都为缺陷 简称bug 02缺陷标准 少功能 功能错误 多功能 缺少隐形功能 易用性 软
  • Android NDK 开发:实战案例

    0 前言 如果只学理论 不做实践 不踩踩坑 一般很难发现真正实践项目中的问题的 也比较难以加深对技术的理解 所以延续上篇 JNI 的实战Android NDK开发 JNI实战篇 这篇主要是一些 NDK 小项目的练习 由于这些项目网上都有 d
  • CGAL---点云处理

    CGAL是一款几何处理库 但是介绍其在点云中处理的资料比较少 现介绍一个专门介绍CGAL在点云数据中处理的网站 比包括常见的点云数据处理 功能包括 1 聚类 欧式聚类 2 配准 ICP 3 简化 格网 4 平滑 5 法向量估算 6 特征估算
  • C++ static的作用

    1 什么是static static 是C 中很常用的修饰符 它被用来控制变量的存储方式和可见性 2 为什么要引入static 函数内部定义的变量 在程序执行到它的定义处时 编译器为它在栈上分配空间 大家知道 函数在栈上分配的空间在此函数执
  • 鱼眼去锯齿

    include
  • hexo更换主题后出现问题:WARN No layout: index.html

    hexo更换主题后出现问题 WARN No layout index html hexo本地测试运行重启后页面空白 hexo g出现以上错误 错误原因 运行git clone 指令获得主题后 假设是NEXT主题 在theme主题下保存文件夹
  • 火狐不能同步的问题

    火狐不能同步的问题 解决方法 下载同版本的软件并且切换成同一个服务器类型 打开 帮助 gt 关于Firefox 查看连个软件版本号和上线时间是否一致 如果不一致 则下载最新版 同版本同上线时间 的软件 如果一致 右上角菜单 gt 选项 gt
  • 【状态估计】基于UKF法、AUKF法的电力系统三相状态估计研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及数据 1 概述 基于UKF法和AUKF法的电力系统三相状
  • Unity 鼠标拖动旋转物体,并且物体不会越转越乱

    用Mathf Abs 绝对值 计算鼠标水平和竖直方向谁的位移更大 减少因为一丢丢的其他方向移动导致的物体微幅旋转影响后面物体旋转会越来越混乱 这样可以让物体旋转更好的单个方向进行旋转 代码如下 public float speed 2f v
  • vue使用富文本编辑器:vue-quill-editor粘贴图片+图片上传服务器+预览图片

    引入vue quill editor 初始化vue quill editor npm install vue quill editor save 部分页面引入组件 import quill dist quill core css impor
  • 51单片机实现串口通信(主单片机到从单片机发送LED流水灯)

    其实这是个51单片机串口通信的小例子 课堂上老师说你们可以去尝试弄一下 于是就去网上找一下资料 就做了这个实验 先把一个作为主机 用来发送数据 另一个作为从机 用来接收数据 将两个程序各自烧录到对应的板子上去 并将主机的TX P3 0 接到
  • VS C++ 生成类图

    C 中如何快速清晰的了解定义类型及类型之间的关联关系 一个好的类图有助于你快速了解 那么怎么去生成一个类图呢 下面步骤可以帮到你 一 安装类设计器组件 1 确定是否已经安装 类设计器 如果未安装 可以打开 工具 gt 获取工具和功能 或者直
  • springboot Junit单元测试默认事务不提交

    目录 一 Junit初次使用 二 Junit事务问题 1 默认不提交事务 默认回滚 2 设置rollback 让Junit提交事务 一 Junit初次使用 因为以前总觉得Junit单元测试配置比较繁琐 代码功能大多使用main方法或者pos
  • SD秋叶安装教程

    前言 本部署整合包基于开源项目 stable diffusion webui制作 部署包作者 秋葉aaaki 免责声明 本安装包及启动器免费提供 无任何盈利目的 电脑配置要求 操作系统 windows10以后 CPU 不做强制要求 内存 推
  • 输出斐波那契数列的每一项,每五个换行

    7 2 利用数组计算斐波那契数列 15 分 本题要求编写程序 利用数组计算菲波那契 Fibonacci 数列的前N项 每行输出5个 题目保证计算结果在长整型范围内 Fibonacci数列就是满足任一项数字是前两项的和 最开始两项均定义为1
  • FFmpeg录制流

    FFmpeg下windows安装 下载地址 http ffmpeg org download html windows 下载 ffmpeg release essentials zip 这个文件名 解压后将bin目录加到环境变量path 录
  • 内存使用(分段、分区、分页、多级页表、快表)--OS

    内存使用 内存使用 将程序放在内存中 PC指向内存地址 首先 我们需要让程序进入内存 举个例子 int main int argc char argv text entry 入口地址 call main call exit main ret