【OS】实存管理

知识背景.

  • CPU能够直接访问的只有内存和寄存器。
  • 我们应该确保每个进程都有单独的内存空间,单独的进程内存空间可以保护进程不互相影响,这对于同时加载多个进程到内存中并发执行至关重要。所以我们需要为每一个进程确定对于它来说合法的地址范围,并且确保这些进程只能访问这些地址。
  • 基地址寄存器界限地址寄存器用于完成上述功能,前者含有最小的合法物理内存地址,后者制定了范围的大小,举例来说,如果基地址为3000,而界限地址为200,则本进程可以访问的合法地址范围是[3000…3199].
  • 内存空间保护的实现是通过CPU硬件对比用户模式下产生的地址寄存器中记录的地址来实现的。如果一个在用户模式下执行的进程试图访问不属于自己的内存时,就会触发陷阱(陷入OS).
  • OS可以无限制地访问内存,OS可以通过内核模式下的特权指令,加载、修改前述两个寄存器的值,这时用户程序无法做到的。
  • 用户程序处理逻辑地址,内存映射硬件将逻辑地址转变为物理地址。

动态加载.

  • 思想是只有在调用一个程序时才会加载它,所有的程序都以可重定位加载格式保存在磁盘上。主程序首先被加载到内存并执行,当主程序需要调用另一个程序B时,调用程序首先检查B是否已被加载,若没有则进行加载。

重定位.

  • 重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程。它是实现多道程序在内存中同时运行的基础。

静态重定位.

  • 程序装入主存之前由编译/链接程序完成重定位,入主存可立即执行
  • 优点是执行速度快,但地址无法灵活更改

动态重定位.

  • 程序入主存之前不进行重定位,入主后存执行到与地址相关项时,再进行重定位。
  • 优点是地址移动灵活,但执行速度慢。

逻辑地址空间.

  • 由程序所生成的所有逻辑地址的集合称为逻辑地址空间。

物理地址空间.

  • 与逻辑地址对应的所有物理地址的集合称为物理地址空间。

连续分配存储管理.

动态存储分配.

  • OS维护一个表,用于记录哪些内存可用和哪些内存已用。最初,所有的内存都可以用于用户进程,因此可以作为一大块的可用内存,称为孔Hole.
  • 随着进程进入系统,OS根据进程的内存需求和现有可用内存的情况,为该进程寻找足够大的孔。如果孔过大,那么就将其分为两块,一块交给新进程使用,另一块还回孔集合。
  • 从一组孔中选择一个空闲孔的常用方法有以下这些:
    在这里插入图片描述

碎片Fragmentation.

内碎片.

  • 固定分区分配方式中存在的,已经分配给进程,但进程却不会使用的那一部分空闲空间。

外碎片.

  • 内存中小块的空闲分区,无法单独满足任何一个进程的需求,但这些非连续的空闲空间之和能够满足请求。

紧缩.

  • 针对于各种碎片,想要移动内存中的内容,将所有空闲的空间合并成一整块。
  • 紧缩操作能够实现的前提是,重定位的方式是动态的。

交换Swapping.

  • 当内存空间紧张时,系统将内存中某些进程暂时移到外存(盘交换区),把外存中某些进程换入内存中,替换移出进程原来的内存空间。

离散存储管理.

  • 初衷是为了解决连续分配存储管理中的外部碎片问题。

分段.

  • 将逻辑地址空间视为很多数据段的集合,其中可能包括代码段、堆栈段、全局变量段等。每个段都有名称和段长,通过段首地址和段内偏移来指定地址。
  • 分段这种内存管理方案使用二元组来表示逻辑地址:< S , D S,D S,D>
  • 分段方式使得我们以二维形式管理地址,但实际的物理地址还是一维的。所以我们还需要一种映射机制,将用户眼中的二维地址转换到实际的一维地址。
  • 段表横空出世,其中属性包括段基址B段界限L。合法的一个逻辑地址< S , D S,D S,D>中,S用作查找段表中对应记录的索引,D应该位于[0…L-1]之间,否则就是非法访问。
  • 对于合法的地址< S , D S,D S,D>,我们在段表中找到其对应的记录,进行B+D的操作就能得到实际的物理内存地址。

段表实例.

段号 段基址 段长
0 200 285
1 578 14
2 50 120
3 1423 280
4 1765 196
  • 考虑以下段表,试分别求出逻辑地址(0,130),(1,7),(2,400),(3,500),(4,200)的物理地址是多少?
  • (0,130)=200+130=330
  • (1,7)=578+7=585
  • (2,400)、(3,500)、(4,200)均是非法访问,陷入OS.

分页.

  • 【基本方法】将物理内存划分为固定大小的内存块,称为帧Frame;并且将逻辑内存也划分为同样大小的块,称为页Page.
  • 当需要执行一个进程时,它的页从文件系统或备份存储处,加载到内存的可用帧中。其中备份存储也划分为固定大小的块,它与单个内存帧或多个内存帧的簇大小一样。
  • 由CPU生成的逻辑地址看作一个二元组< S , D S,D S,D>,第一分量代表页码,作为页表的索引来查找对应页的基地址,第二分量代表页内偏移,基地址与偏移量组合就形成了物理地址。
  • 页的大小(也就是帧的大小)是由硬件系统决定的。如果我们的逻辑地址有m位,页的大小为 2 n 2^n 2n字节(对应n个二进制位),那么逻辑地址的组成如下所示:
含义 页码 页偏移
位数 m-n n

页表实例.

  • 举例来说,对一个 4 页大小的作业,其 0、1、2、3 页分别被分配到主存的 2、4、6、7块中,其页表如下所示:
页号 帧号
0 2
1 4
2 6
3 7

快表TLB.

  • 页表项中包含页码和页框号(就是帧号),而TLB中就包含了部分的页表项(可能是近期使用过的)。当CPU产生一个逻辑地址后,首先将其页码发送到TLB进行查找,如果查找成功,那么就确定了它的页框号;否则就再去访问页表,查找页码。
  • 快表的设置考虑了结构化程序中的时间局部性和空间局部性两个特征,前者认为刚被访问的主存单元,不久会再次被访问(循环操作);后者认为刚被访问的主存单元,其临近单元不久会被访问(程序的顺序执行)。

有效访问时间.

  • 快表的访问时间为20ns,内存访问时间为100ns,若从快表中找到的概率(即命中率)为80%,则有效访问时间为多少?
  • 首先需要明确,通过页表访问访问一个字节需要访问两次内存——第一次用于访问页表条目,第二次访问才是访问该字节;而TLB是一种高速硬件缓存,其访问时间相较内存大大减少。
  • 【不使用TLB】Time=200ns
  • 【使用TLB】Time=(100+20)*0.8+(200+20)*0.2=140ns.

共享页.

  • 能够实现共享公共代码是使用分页管理的优点之一,通过将那些可重入代码设置为共享页,每个进程只需要拥有自己那些独立的数据页。
  • 【可重入代码】不能自我进行修改的代码,不会在执行期间发生改变,代码中不包含任何变量。

二级页表.

  • 考虑一个32位逻辑地址的空间,其中的页大小为4KB,也就是2 12 ^{12} 12B,那么意味着有20位用于表示页码,也就是说一个进程的页表项最多有2 20 ^{20} 20也就是1M个,假定每个页表项的大小为4字节,就得到一个进程的页表大小最多为4MB.
  • 在此基础上,为了解决如此巨大的内存要求,引入了二级页表概念,也就是对一个进程的页表运用分页管理思想,为这些页表建立一张"页面的页表"。
  • 还是上述模型,我们还按4KB的页大小对进程页表进行分页管理,得到"页表的页表"中有2 10 ^{10} 10个条目。我们称二级页表为外层页表,所以32位逻辑地址中,高10位用于表示外层页表号,中间10位用于表示页表号,低12位用于表示页内偏移。

分页与分段.

  • 页是信息的物理单位,为实现离散存储,提高内存利用率而引入;段是信息的逻辑单位,为满足用户要求而引入。
  • 页的大小固定且由系统确定;而段长不定,取决于用户程序,并在编译时划分。

实存管理习题.

猜你喜欢

转载自blog.csdn.net/weixin_44246009/article/details/108550235
今日推荐