内存-内存管理,详细,适合有一定基础的人复习

内存-内存管理

内存管理的需求:

重定位

重定位的含义:

​ 程序在编译链接完成后,程序中的地址是以0为参考起始地址计算出的逻辑地址,表示的是该位置与程序起始地址的相对位置关系。

将程序装载到内存中后,在运行时需要对这些地址进行重新计算,根据程序起始地址和相对地址,计算出物理地址。

重定位有以下三个时机:

1、程序编译链接时:程序链接时,根据未来程序将要被放置的内存区域起始地址,将程序中的所有地址,加上这个起始地址。

2、程序装入内存时:程序装入内存前,OS找出将要放置该程序的合适内存空间,记录该内存空间的起始地址,然后将程序中的所有地址,加上这个起始地址。再将程序装入内存。

3、程序执行时:程序中的地址仍旧为相对地址,在程序执行时,根据重定位寄存器,计算出物理地址,并根据该地址去访问。

重定位的分类:
  1. 静态重定位:即程序装入内存时,进行重定位,优点就是不需要硬件的支持,缺点是程序一旦重定位后,就不可以在内存中移动。二是要求存储空间是连续的。
  2. 动态重定位:优点:目标模块在装入内存时不需要任何修改,在装入后,也可以进行换入换出,这对解决存储碎片极为有利。并且一个程序的独立模块,可以装在到内存的不同区域,只要各个模块有各自的定位寄存器即可。缺点是需要有硬件的支持。

保护

​ 某一进程的内存单元,不会被未经授权的其他进程进行访问(读/写),通常,用户进程不能访问操作系统的任何部分。一个进程不能在执行过程中跳转向另一个程序的指令。无特别许可,一个进程不能访问另一个进程的数据区。

共享

​ 在不损害保护原则的前提下,支持不同进程间,受许可的访问内存共享空间。

逻辑组织

​ 物理内存往往被组织成一维的地址空间,但是大多数程序是按照模块进行组织的,不同的模块间具有不同的访问设置(只读,只执行,读写)。内存管理系统,应该能够依据不同模块,便利的管理用户对不同模块的访问。

物理组织

​ 内存管理应该负责,内存外存间的信息移动。而不是交给程序员。因为程序员很难知道可用空间的大小,及位置。即便知道也很浪费时间。

内存管理的方式:

分区

​ 1.固定分区,在系统初始化阶段,内存就被划分为许多静态分区(分区的大小不一定相等),后期不再改变。程序可以装入大于等于它大小的内存分区中。优点是,实现简单,系统分配内存的开销较小。缺点是,由于存在内部碎片,导致内存利用率低,且可以放置在内存中的进程数固定。

​ 2.动态分区,每次给进程分配刚好等于其大小的内存空间,优点是,没有内部碎片,可以更充分的利用内存。缺点是,由于需要压缩外部碎片,处理器的利用率低。为解决外部碎片问题,可以采用如下的放置策略:1.首次适配 2.下次适配 3.最佳适配。其中首次适配往往是最简单,也是最好最快的。

​ 地址转换:针对分区的方式,由于每次换入换出时,不一定换入到同一个内存区域,所以可以采用动重定位的方法,利用重定位寄存器,保存装入模块的起始地址,每次访存时,将逻辑地址加上起始地址。即可完成逻辑地址到物理地址的转换。

分页

​ 追求将整个进程放入同一个内存区域的分区技术是低效的,它们永远不能从根本上减少碎片的大小。原因是,每次将整个进程放入内存,不同进程所需的内存空间大小是不一样的。那么该内存要么在放入固定分区中时造成内部碎片,要不在放入动态分区时造成外部碎片。

​ 分页技术的思想是,将进程按照分页大小,分割开,再装入多个小分页中,那么只有最后一个分页会有一部分外部碎片,但是这个碎片的大小一定小于分页大小。这样内存利用率就有了较大提高。

​ 地址转换:但是由此引入一个问题:OS该如何实现逻辑地址到物理地址的转换?类比分区技术中使用动态重定位的技术,分页中的逻辑地址到物理地址的转换也是由逻辑地址加起始地址算出,只不过这里的起始地址,并不是只有一个,而是进程的每一页有一个起始地址。每个进程有自己单独的一个页表,页表中存放了该进程每一页对应的页框号,和页框的物理地址。计算步骤是:

  1. 算出逻辑地址对应的页号:页号=逻辑地址/页面长度(取除法的整数部分);

  2. 要知道该页号对应页面在内存中的起始地址:根据页号,到页表中查询页框的起始地址;

  3. 要算出逻辑地址在页面内的“偏移量”:页内偏移量=逻辑地址%页面长度(取除法的余数部分);

  4. 物理地址=页面始址+页内偏移量;

    ​ 由于此处页表保存了每一页对应的页框号和页框地址,那么采用分页技术的内存管理方式,不需要将进程的每一页连续存储在内存空间中,这样就极大的提高了内存分配的灵活性。(层次化分页,即将页表再次进行分页)

分段

[为什么要引入分段存储呢,简单地说分页管理方式是从计算机的角度考虑设计的,以提高内存利用率,提高计算机的性能,且分页通过硬件机制实现,对用户完全透明;而分段管理方式的提出则是考虑了用户和程序员,以满足方便编程,信息保护和共享,动态增长以及动态链接等多方面的要求。]

​ 另一种分割进程的方式是,依据进程中不同数据的逻辑结构划分成不同的段,如根据代码段,数据段,常量段,等等。分段在内存分配上累死动态分区,只不过它不要求,不同的段连续存放,这样就消除了内部碎片,减少了外部碎片。分段在地址转换上类似分页,每个进程有一个段表,用于存放不同段在内存中的起始地址,以及段的长度。分页对于程序员来说是透明的,但是分段通常是可见的。通常程序员可以将数据和程序指定到不同的段。这也造成了一些不便:程序员必须清楚段的最大长度为多少。

​ 地址转换:段表中的内容:段号S,段长SL,段起始地址d。逻辑地址(S,address)到物理地址的转换依旧是类似分页方式。如果S>TL,表示段号太大,访问越界。于是产生越界中断信号。
​ 若未越界,则根据段表寄存器中指向的地址,找到段表,从中读取该段在内存中的起始地址。然后,再检查段内地址address是否超过该段的段长SL。若超过,同样发出越界中断信号。
​ 若未越界,则将该段的基址d与逻辑地址address相加,即可得到要访问的内存物理地址。

段页式

​ 先将进程按照逻辑分段。在将每一段按照分页的方法,存储到内存中,每个进程需要维护一个段表,段表中的内容是,段号,段长,页表地址。

​ 逻辑地址到物理地址的转换依旧是类似分页方式。在段页式系统中,为了便于实现地址变换,有一个段表寄存器,其中存放段表始址和段表长TL。

​ 进行地址变换时,首先利用段号S,将它与段表长TL进行比较。若S<TL,表示未越界,于是利用段表始址和段号来求出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应页的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。

​ 在段页式系统中,为了获得一条指令或数据,须三次访问内存。第一次访问是访问内存中的段表,从中取得页表始址;第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问才是真正从第二次访问所得的地址中,取出指令或数据。

​ 三次访问内存,使用的时间较多,因此常使用寄存器保存最近访问过的页号。在地址转换时,先根据段号和页号去寄存器中查询,如果都匹配,则直接使用页框起始地址和页内偏移量(先根据逻辑地址和分段,分页信息,计算出页内偏移量)计算得到物理地址。直接访问内存。

总结

这篇blog写的也不错,可以参考一下,基本是按照课本,本文没有涉及的几个重要概念:分页存储的几个基本概念,2) 基本地址变换机构3) 具有快表的地址变换机构4) 两级页表,他都有讲解。https://www.cnblogs.com/peterYong/p/6556619.html

  1. 内存管理,本质上还是为了,在不影响处理器利用率的情况下,尽可能的提高内存的利用率。
  2. 内存管理,将内存视为一种资源,可以分配给多个活动进程,或者有多个活动进程共享。并且,内存中尽可能容纳多的进程,以提高CPU的利用率。此外,程序员希望在开发程序时,最好不受内存大小的闲置(虚存)。
  3. 内存管理的基本工具是:分页,分段。采用分页技术,每个进程被划分为相对较小的,大小相等的块。采用分段技术,每个进程可被划分为大小不等的块。
  4. 分页技术,程序员不清楚程序会被怎样分割,放置。这给他极大的便利性:他不用管程序,内存,只需要写好自己的代码即可。分段技术,程序员需要了解每一段的大小,以及程序中的不同数据被放置到了哪个段中。这便于他对内存访问进行管理与控制。但是麻烦在于他需要考虑每一段的最大长度。
  5. 分页管理方式是从计算机的角度考虑设计的,以提高内存的利用率,提升计算机的性能, 且分页通过硬件机制实现,对用户完全透明;而分段管理方式的提出则是考虑了用户和程序员,以满足方便编程、信息保护和共享、动态增长及动态链接等多方面的需要。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值