首页 > 系统相关 >操作系统内存管理笔记

操作系统内存管理笔记

时间:2024-03-19 17:30:38浏览次数:32  
标签:逻辑 操作系统 笔记 偏移量 物理地址 地址 页表 内存

单级页表

分页储存在这里插入图片描述
页表
在这里插入图片描述
页表中的页表项是连续存放的,因此页号可以是隐含的,不需要占用空间
页表中的块号所记录的只是内存块号,而非内存块的起始地址

案例一 假设某系统物理内存大小为4 G B,页面大小为4 K B,则每个页表项至少应该为多少字节
解答 : 由题目可知,
内存块大小=页面大小=4 KB=2^12 B ; 4 GB = 2 ^32 B
所以4GB的内存总共会被分为2^32 / 2^12 = 2^20个内存块.
内存块号的范围应该是 0~(2^20−1)

  • 从逻辑地址到物理地址的转换
    用于存放进程的页框是离散存储的,但是页框内部是连续存放的。所以我们可以先找到该页框的起始地址,然后再加上框内的偏移量即可求得具体的物理地址

重点
1 通过逻辑地址A分离出页号P和页内偏移量W
2 通过P查询块表或者内存中的页表从而从页表中的页表项找到页号P对应的页框号。
3 通过 页框号 * 页框大小 得到页号P在内存中的起始地址
4 逻辑地址A所对应的物理地址 = P页面在内存中的起始地址 + 页内偏移量W

案例二
在某计算机系统中,页面大小是50B。某进程逻辑地址空间大小为200B,则逻辑地址110对应的页号、页内偏移量是多少?
在这里插入图片描述
页号 = 逻辑地址 / 页面长度 (取除法的整数部分)
页内偏移量 = 逻辑地址 % 页面长度(取除法的余数部分)

例子中所给的逻辑地址110
页号P = 100 / 50 = 2
页内偏移量W = 100 %50 = 10

因此物理地址为 = ( 页 表 中 P 所 对 应 的 物 理 块 号 ) ∗ 物 理 块 大 小 + W

二进制的逻辑结构的地址划分
如果页面大小刚好是2的整数幂,则计算机硬件可以很快速的把逻辑地址拆分成(页号,页内偏移量)

逻辑地址结构(假设操作系统用32个二进制来表示逻辑地址):

31 … 12	   11 … 0
页号P	 页内偏移量W

地址结构包含两部分:前一部分为页号P,后一部分位页内偏移量W。如果每个页面大小2^k B,用二进制表示逻辑地址,则末尾k位即为页内偏移量,其余部分就是页号。

如果由K位表示“页内偏移量“,则说明系统中一个页面的大小是2^k个内存单元”
如果由M位表示“页号“,则说明系统中,一个进程最多允许有2^m个页面, 即页号范围为0 ~ 2^m-1 。

可以将十进制的页号与页内偏移量单独的转换成二进制的表示形式,然后将将其拼接:页 号 + 页 内 偏 移 量 页号+页内偏移量页号+页内偏移量

假设某计算机用32个二进制表示逻辑地址,页面大小为4 K B = 2^12 B = 4096 B(结构划分与上表单一致)

在这里插入图片描述
比如逻辑地址4097 40974097 转化 :
页号 = 4097 / 4096 =1 转化为长度占20位的二进制形式为:00000000000000000001
页内偏移量 = 4097 % 4096 =1 转化为长度占12位的二进制形式位:000000000001
然后将将其拼接得到二进制形式的逻辑地址:页 号 + 页 内 偏 移 量 页号+页内偏移量页号+页内偏移量 = 00000000000000000001000000000001

在这里插入图片描述

二级页表

单级别页表存在的问题
所有页表项必须为连续存放在内存中
在这里插入图片描述
二级页面表定义
在这里插入图片描述
在这里插入图片描述
二级页表中 页目录表是如何找到二级页表从而找到页号对应的真正的物理地址的?
1 从逻辑地址中提取出页目录号 、二级页号、 页内偏移量 。
2 使用页目录号作为索引,找到对应的页目录项。页目录项中存放着对应页表的物理地址(将页目录项中的物理地址转换为真实的物理地址。)。
3 得到真实的物理地址后,可以访问到对应的二级页表。
4 使用二级页号作为索引,找到对应的页表项。页表项中存放着对应页的物理地址。

Ref : 操作系统内存管理

标签:逻辑,操作系统,笔记,偏移量,物理地址,地址,页表,内存
From: https://blog.csdn.net/oYiDiDeSiNian/article/details/136835313

相关文章

  • python/pygame坦克游戏边学边写笔记(六)
    一、给玩家坦克一个脆弱的家测试玩了一下,才发现玩家的家还没安排。1、载入家的图片。2、地图字典索引,生命值设为1,生命脆弱哦。3、wall_map方法中设定家的位置。ifdata.iloc[row,colum]=='家':wall_type='home'......
  • 简单了解内存管理
    虚拟内存操作系统需要管理的就是各个进程的内存,对于进程,需要存储代码、堆、栈等信息,如果让程序员直接来操控物理内存管理进程的话,难度会更大,需要考虑进程在哪个位置分配、会不会冲突等问题,那么操作系统提供了虚拟内存给程序员使用,背后的实现这些脏活累活都交给操作系统去完成......
  • ESP32学习笔记-双核编程
    写在前面ESP32集成了两个TensilicaXtensaLX6微处理器(核心0和核心1)。FreeRTOS作为ESP32的操作系统,提供了多任务支持,可以使得这两个核心同时工作。在不使用FreeRTOS的情况下,程序默认跑在核心1上,而核心0主要运行WIFI和bluetooth;如果我们的项目不频繁使用WIFI蓝牙,建议使用多......
  • Learning Disentangled Graph Convolutional Networks Locally and Globally论文阅读
    LearningDisentangledGraphConvolutionalNetworksLocallyandGlobally论文阅读笔记Abstract存在的问题:​ 尽管现有的gcn取得了成功,但它们通常忽略了现实世界图中通常出现的纠缠潜在因素,这导致了无法解释的节点表示。更糟糕的是,虽然重点放在局部图信息上,但整个图的全局知......
  • 鸿蒙学习笔记-DevEco Studio 安装
    鸿蒙DevEco Studio是开发华为鸿蒙系统必须要安装的开发软件软件下载软件下载地址:HUAWEIDevEcoStudio和SDK下载和升级|华为开发者联盟,根据自己使用的电脑情况,选择对应的下载文件 软件安装下载后的文件是zip压缩包,解压后,打开安装文件,点击Next保持默认选项,点击Next......
  • mysql查看数据库锁等待排查笔记
    实验版本:5.7.27 命令如下:mysql>useinformation_schema;  mysql>selectcount(*)fromINNODB_LOCK_WAITS; +----------+ |count(*)| +----------+ |      50| +----------+ 1rowinset,1warning(0.00sec)  SHOWENGINEINNODB......
  • .NET 内存碎片化分析
    一:背景1.讲故事上个月有位朋友wx找到我,说他的程序存在内存泄漏问题,寻求如何解决?如下图所示:从截图中可以看出,这位朋友对windbg的操作还是有些熟悉的,可能缺乏一定的实操经验,所以用了几个命令之后就不知道怎么排查下去了。既然找到我,那就以我的个人经验在他的dump上继续分析......
  • 数据在内存中的存储
    目录前言一、整数在内存中的存储二、大小端字节序和字节序判断1、什么是大小端?2、为什么有大小端?3、练习三、浮点数在内存中的存储前言本章我们学习一下数据在内存中是如何存储的,包含整数在内存中的存储、大小端字节序和字节序判断、浮点数在内存中的存储三个部分......
  • uniapp 云开发省钱之调整函数执行内存大小
    我这个5块钱一个月的服务空间配置:现在还只有少量的用户和自己测试之用,目前消耗的情况:云函数的使用量还是挺高的,目前还是正好能覆盖一个月的使用量,等用户量上来肯定是不行的,所以得想想办法压榨一下云函数使用量了。看了下云函数使用量的计费方式,发现云函数的使用消耗跟......
  • cuda从入门到精通(六)共享内存和循环分块实现CUDA矩阵乘
    本文系转载,出处:https://mp.weixin.qq.com/s/1w1WFPoUEvVECsurqmvJDw在CUDA编程中,共享内存和循环分块(looptiling)是两种常见的优化策略,它们可以帮助我们提高矩阵乘法的性能。共享内存(SharedMemory):在GPU中,每个线程块(block)都有自己的共享内存。与全局内存相比,共享内存的访问......