操作系统笔记---内存管理

水平有限,如若有错或有含混不清之处,请您指出,谢谢



// Pre. 地址绑定

1. 是逻辑地址向物理地址映射的过程

2. 根据映射发生的时间分类:

  • 编译时:编译后,逻辑地址已经映射到物理地址。
  • 载入时:编译时候产生可重定位代码。将程序加载到内存时,逻辑地址映射到物理地址,一旦载入内存的某个地址,就从此固定不动。如果发生了swap(交换)也要换回原来的地址上。
  • 运行时:进程运行时候可以改变映射的物理内存区域。如:进程a、b在内存,基址为1000h和2000h,进程c在虚拟内存。现swap进程a和c,那么c进入内存,基址为1000h。一段时间后,swap进程a、c,a就重新进入了内存,基址为2000h,此时其物理地址相对于上一次已经不同,地址的映射发生在运行时。现在的计算机系统多采用这种方式。


操作系统如何管理内存?核心思想就是用好内存,那么怎么用好内存?

------一。内存使用:

1. 要让exe文件执行,首先需要创建pcb。内存找一段空闲的区域,将程序放入到这段区域,将首地址存入pcb

2. pcb把基地址写入基址寄存器

3. 执行的时候,取基址寄存器的值,进行地址的重定位,获取物理地址(运行时重定位)

4. 进程上下文切换时,新进程把新的基址(位于pcb)写入基址寄存器,进行更新


5. 动态加载与动态链接

  • 动态加载:将加载延迟到运行时,主体是程序员。例如子程序只有在被调用的时候才加载到内存;
  • 动态链接:将链接延迟到运行时,主体是操作系统。例如stub(存根),用来定位适当的内存驻留库程序,或如果该程序不在内存时应如何装入库。Stub首先检查所需子程序是否在内存中,如果不在,就将子程序装入内存。Stub会用子程序地址来替换自己,并开始子程序

那么,是将整个程序都"放入这段区域"吗?

------二。分段:

1. No,是将进程的各段分别放入内存。

2. 因此,pcb里面存的实际上是进程段表(LDT表),指示每个段的段首地址。



那么,如何在内存划分空闲区域呢?

------三。分区问题:

1. 固定分区:将内存分成多个固定大小的区域,每个分区只能容纳一个进程。

2. 可变分区:操作系统记录空闲分区表和已分区表,记录哪些内存可用(称之为“孔”)以及哪些内存已被占用,要多少给多少,每次分配内存或者释放内存都会对表更新。

3. 从一组可用孔选择一个空闲孔的方法(可变分区方式下动态分配存储问题)

  • 首次适配:分配第一个足够大的孔
  • 最佳适配:分配最小的足够大的孔
  • 最差适应:分配最大的孔
4. 碎片问题

  • 外部碎片:可用内存之和能满足内存请求,但是这些内存不连续导致不可用,这些空闲块就是外部碎片。
  • 内部碎片:操作系统为了节省维护一个(或者一些)很小的孔带来的开销,索性将这个(或这些)孔一并分配给某个进程,但是实际上这些小孔并没有被利用起来。这个(些)孔的就是内部碎片。


那么,如何解决碎片问题?
  • 紧缩:移动内存内容,修改基址寄存器,使空闲空间合并。只适用于动态重定位,开销大。
  • 分页:允许进程的物理空间为非连续的。

------四。分页

1. 把物理内存划分为多个块,叫做帧;把逻辑内存划分为多个块,叫做页。进程的每一个段不是直接放到内存的,而是打散成多个页存入内存。为了将来能够重定位,在程序执行的时候找到物理地址,就引入了页表的概念,通过页表查询进程的第几页存储在内存的第几帧。

2. 页表的硬件实现方式:

  • 页表较小时,存到一组专用寄存器。
  • 页表大时,存入内存,这时需要有寄存器用来保存页表的基地址。采用这种方案,会导致两次访问内存。解决两次访存的办法是采用一个硬件缓冲------转换表缓冲区(TLB)。TLB是一个键值对(page<-->frame),保存页表的一小部分条目,TLB命中则直接访问对应帧,无效则需要访问内存中的页表,并将此条目存储到TLB。图示TLB机制


3. 分页环境下的内存保护:内存保护是通过每个帧相关联的保护位来实现的,这些位通常保存在页表中,如读写位、有效无效位。

4. 共享页,如图所示。共享代码的进程共用某些段,这些段在内存的物理帧相同。减少了内存的消耗。


5. 为了提高内存使用率,每一页应该尽量小,这样会导致页表太大。由此,给出多级页表和哈希页表的机制。

6. 多级页表:

  • 二级分页算法,将页表再分页,类比:某章 -> 该章某节 -> 该节某页。以下图为例,p1代表第一层页表中的偏移量,p2代表第二层页表中的偏移量,d代表内存的第几帧。优势:可以实现页表的不连续存储,可以节约内存空间。


多级页表提高了空间效率,但是在时间上,由于多次访存,造成了耽搁。可用TLB(快表)进行改进。TLB根据局部性原理,存储的是经常访问的条目。TLB命中则不需多次访存,TLB未命中则把对应条目加入或替换进TLB。

7. 哈希页表

  • 处理超过32位地址空间的常用办法
  • 哈希页表的条目包括一个链表的元素,每个元素有3个域:1)虚拟页码 2)物理帧号 3)指向链表中下一个元素的指针。其中虚拟页码作为哈希值。(所谓虚拟页码,应该就是页码、页号)
  • 算法主要是凭页码得到哈希值,在哈希表中获得对应条目,找到物理帧号。如图示。








阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页