17.内存分区与分页

【README】

1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;

2.程序使用内存的3个步骤:

  • 步骤1:把程序分为多个段,包括代码段,数据段;这是编译要做的事情;
  • 步骤2:在内存中找一段空闲内存(或空闲分区);
  • 步骤3:一旦找到空闲分区,就把磁盘上的程序的段内容读入到空闲分区;在读的过程中,需要把LDT初始化好,LDT存储了段序号与段基址的映射关系;

【1】内存分区

1)内存分区: 内存如何分割,以便把程序的各个段载入到相应的内存分区;
简单地,内存分区指的是划分的一段用于存储程序段(或代码段cs,或数据段ds)的内存空间

【1.1】固定分区与可变分区

1)固定分区
等分,操作系统初始化时把内存等分为k个分区;
但是段长度有大有小,固定分区不能满足段长度不定的业务场景;

 


【1.2】可变分区管理

1)核心数据结构

  • 空闲分区表:存储空闲的内存分区数据(或段释放后的内存空间列表);
  • 已分配分区表:已使用的内存分区的记录信息;
  • 注意:分区信息只需要记录 分区基址 和 长度 这两种信息

2) 请求分配内存

【图解】

  • 目前空闲的内存地址空间为 250K~500K;
  • 而段3内存请求分配100K,则把250K~350K分配给该段3(seg3);并新增一条已分配分区表记录;

3)释放内存
【例】段2不再需要,释放段2的内存
同时把释放出的内存更新到空间分区表,从已分配分区表中移除段2的记录;


4)再次申请
此时空闲分区表如下:

内存分区序号

基址

长度

1

350K

150K

2

200K

50K


【1.3】内存分区分配算法

内存请求分配40K,又分区1有150K,分区2有50K,那应该分配分区1还是分区2给到这个请求?

  • 首先适配:(350, 150),挑选空闲分区表中第一条且分区空间足够大的分区来分配;空闲分区表查询足够快;
  • 最佳适配:(200, 50),内存空间浪费少,但空闲分区大小会越来越小,分割后产生的内存碎片比较多;
  • 最差适配:(350, 150),挑选最大的分区进行分配,内存空间浪费多,但空闲分区大小比较均匀,内存碎片少;

 

 
【例】哪种内存分区分配算法最好


【2】 内存分页

【2.1】内存碎片问题

0)问题:内存分区导致的内存碎片问题

  • 解决方法:引入分页解决内存分区导致的内存碎片的问题;
  • 实际的物理内存分配是采用分页而不是分区; (补充:虚拟内存是采用分区来分割或分配的)

 【图解】内存碎片问题:

  • 如上图所示,申请大小为160K的内存空间,而空闲分区表中的2个分区大小均小于160K且他们不是连续内存地址空间,所以无法直接分配160K的内存空间(需要先做空闲分区合并,把碎片收集在一起),即使总的内存大小为200K(大于160K);

1)内存碎片:

  • 可用的总内存大小大于申请的内存大小,但内存分区不连续,且每个分区小于申请大小,导致内存申请失败;

2)解决方法

  • 内存紧缩;简单说,把白色的分区合并在一起,彩色分区合并在一次,这就需要复制段内容;

3)内存紧缩带来的问题(内存紧缩耗时耗力

  • 需要修改段基址的LDT,非常麻烦;
  • 在内存紧缩过程中,上层用户应用程序无法执行,因为程序的多个段在复制内容到新的内存空间,段基址需要级联修改;
  • 内存紧缩耗时长,容易导致机器假死;

小结: 内存紧缩方法解决内存碎片是不可行的;从而引出了内存分页解决内存碎片问题


【2.2】内存分页

1)定义:操作系统初始化时,物理内存空间就分为多个页,每页占用4K内存 大小;
在处理段内存申请时,以页为单位把内存分配给段,如下表:

                                                                 表2 内存分页表

物理内存页序号(页框号)

7

段0

页3

6

段0

页0

5(空闲页)

4(空闲页)

3

段0

页2

2(空闲页)

1

段0

页1

0(空闲页)

 

 2)内存分页优点:

  • 优点1:不存在内存碎片,因为中间的空闲页可以分配给其他进程;
  • 优点2:内存浪费少:一个段最多浪费1页,即一个段最多浪费4K(一个段由多个页组成);

【小结】

  • 物理内存采用分页进行分割和分配,减少了内存浪费,避免了内存碎片;
  • 用户希望把程序分为多个段;
  • 综上,操作系统需要既支持分段也支持分页对内存进行分割和分配;

【例】以页为单位的内存分配

 【问题】jmp 40 映射到哪个页?

  • 内存页的分配情况,通过页表进行记录,且每个进程都有一个页表;页表寄存器时 CR3;其中页表基址存入进程的PCB;  

【例】mov [0x2240], %eax  

  • 步骤1:0x2240 除以4K,即右移12位,得到页号为0x02, 偏移地址0x240;
  • 步骤2:通过页号2找到叶框号为3;
  • 步骤3: 得到物理地址0x3240 ;(3乘以4K,3左移12位得到基址0x3000);
  • 步骤4: 页框3的基址为0x3000,偏移地址0x240,所以得到的物理地址为0x3000 + 0x240得到0x3240 ;
  • 补充:把逻辑地址0x2240根据CR3存储的页表基址,可以翻译为物理地址 0x3240,这个内存地址翻译过程是由MMU完成的

【小结】

  • 一个程序由多个段组成;
  • 每个段内容分散存储在内存中的多个页;每个段不是直接存入内存(那样会造成内存碎片与浪费);
  • 为了在程序执行时能够实现重定位(找到段基址加上偏移地址得到物理内存地址),就需要建立页表存储页号与页框号映射关系,而找到页框号就可以计算出内存页基址;
  • 因为每页大小4K,用过页框号乘以4K就得到页基址了;

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

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

相关文章

漫谈C#编程语言在游戏领域的应用

0x00 前言 随着微软越来越开放,C#也变得越来越吸引人们的眼球。而在游戏行业中,C#也开始慢慢地获得了关注。这不, 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发,跨平台部署了。 所以,我们就来总结一…

dex工具与transform_Android Studio打包程序时出现transformClassesWithDexForRelease错误

百度半天.没找到直接原因..国外网站上有写这个错误的..国内的真心没找到..英语水平有太低..实在没看懂怎么搞..后来发现clean项目的时候是提示如下错误:Information:Gradle tasks [clean, :app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:mockableAndr…

18.多级页表与快表

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.操作系统内存管理:分页机制多级页表快表来实现; 【0】分页的问题 1)分页的问题(大页表&#xff09…

Oracle入门(十三A1)之替换变量,变量名,变量名

转载自 Oracle中的替换变量,&变量名,&&变量名替换变量(仅用于SQL *Plus或者用于原理和SQL *Plus相同的开发工具):临时存储值利用它可以达到创建通用脚本的目的利用它可以达到和用户交互,故在SQ…

常用API接口签名验证参考

项目中常用的API接口签名验证方法: 1. 给app分配对应的key、secret2. Sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下:  a. 按照请求参数名称将所有请求参数按照字母先后顺序排序得到:keyvaluekeyvalu…

19.段页结合的实际内存管理

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.段与页 段: 用户程序采用分段结构;页: 操作系统采用分页机制管理物理内存;段页结合:程…

python中变量怎么定义_python中的变量的使用定义以及使用规则

本篇包括14章内容,系统介绍了Python语言的基础知识。内容包括Python基础语法、数据类型和类型转换、运算符、流程控制(分支结构循环结构)、数据结构(列表生成式)、函数的定义及使用、异常处理、迭代器生成器、偏函数、python中的模块和包、python标准内置库os以及使…

Oracle入门(十二G)之序列

序列(SEQUENCE)序列是一数据库对象,利用它可生成唯一的整数。由于它属于可共享对象,所以允许多个用户访问。一般情况下,序列用于创建主键值。 序列号的存储和生成与表无关。因此,同一序列可以用于多个表。 …

20.内存换入-请求调页

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.操作系统关于内存管理的核心是基于虚拟内存的分段和分页管理; 3.而用内存换入和换出实现虚拟内存 ; 【1】虚拟内存 1&…

机器人点焊枪接线_用于焊接机器人焊枪工具点及工件坐标系标定装置及方法与流程...

本发明属于机器人焊接技术领域,涉及一种用于焊接机器人焊枪工具点及工件坐标系标定的装置及方法。背景技术:工业机器人是实施自动化生产线、工业4.0、智能制造车间、数字化工厂、智能工厂的重要基础装备之一。而据不完全统计,全世界在役的工业…

采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

前言 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这是一个对Entity Framework进行扩展的类库. 完全支持EF 5.0/6.0, GitHub地址 https://github.com/loresoft/EntityFramework.Extended, 最后一次更…

Oracle入门(十二J)之同义词

转载自 oracle同义词 一、创建同义词 --普通用法 create [or replace] [public] synonym [schema.] 同义词名称 for [schema.] object [dblink];--创建专有(私有)同义词 create synonym sysn_test for test;--创建公共同义词 create public synonym publ…

21.内存换出

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.有内存换入就有内存换出。 3.因为物理内存空间有限,n次(第n页)换入后导致物理内存用完,则n1次&…

antd vue表单上传文件_vue+axios+antD的上传图片踩坑

一开始使用了实验室大佬封装的axios结合formData进行图片上传,然而传递给后台的formData是空的,打印出来的form又确实是存在的,百度搜了一大推,于是借鉴了百度的做法。1.引入axios import axios from ‘axios‘;2.创建一个新的axios,const …

移动web开发调试工具AlloyLever介绍

简介 web调试有几个非常频繁的刚需:看log、看error、看AJAX发包与回包。其他的如timeline和cookie以及localstorage就不是那么频繁,但是AlloyLever都支持。如你所见: 特征 点击alloylever按钮之间切换显示或隐藏工具面板Console会输出所有用户…

Oracle入门(十三A2)之单行函数

一、函数介绍 功能:改变数据输出形式或进行数据运算输出二、单行函数函数格式 函数说明abs(n) 返回n的绝对值floor(n) 返回小于等于n的最大整数ln(n) 返回n的自然对数&#xff…

22.IO与显示器

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.显示器是输入型外设; 3.本章主要内容是讲 显示器是如何被驱动的;或操作系统是如何让用户来使用显示器的; 4.Pri…

d3 i5 神舟精盾k480n_神舟精盾k480n i5 d3和精盾i5 d1哪个好?

(这是D3的数据)主板芯片组IntelHM76CPU系列英特尔酷睿i53代系列CPU型号Intel酷睿i53210MCPU主频2.5GHz最高睿频3100MHz总线规格DMI5GT/s三级缓存3MB核心类型IvyBridge核心/线程数双核...(这是D3的数据)主板芯片组Intel HM76CPU系列英特尔 酷睿i5 3代系列CPU型号Intel 酷睿i5 32…

[开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计

一 ,为什么要造轮子 有兴趣的同学可以去各大招聘网站看一下爬虫工程师的要求,大多是JAVA,PYTHON甚至于还有NODEJS,C,再或者在开源中国查询C#的爬虫,仅有几个非常简单或是几年没有更新的项目。从我看的一些文…

Oracle入门(十三B)之高级查询(上)

下章:Oracle入门(十三C)之高级查询(下) 一、多表格查询 (1)定义将两个或两个以上的表格,按照一定的关系连接起来进行查询。(2)多表格查询分类 连接查询嵌套查…