Week7-存储模型1-Coursera北大操作系统课程-个人笔记


  声明:本文的图片和内容均来自Coursera课堂。

1.基本概念

1.1 地址重定位(relocation)

  地址重定位也叫地址转换、地址映射或地址翻译。
   之前的课程中,我们已经学习到:

  • 程序必须装载到内存中才能运行;
  • 现代计算机通常是采用多道程序设计模型,即允许多个程序同时进入内存;
  • 每个进程有自己的地址空间,在执行时不能访问另一个进程的地址空间,对地址空间所能执行的操作也有限制。

   根据以上背景知识,可以确定要解决如下问题:
   因为进程中的地址不是最终的物理地址,且在进程运行前无法计算出物理地址(即不能确定进程被加载到内存的什么地方),所以,需要一种规定来将进程的地址空间映射到物理空间中,这就是地址重定位技术。

   逻辑地址(相对地址,虚拟地址):用户程序经过编译、汇编后形成目标代码,目标代码通常采用相对地址的形式,其首地址为0,其余地址都相对于首地址而编址。因此,cpu不能直接用逻辑地址在内存中读取信息,因为它不是真实的物理地址
   物理地址(绝对地址,实地址):内存中存储单元的地址,CPU可以直接寻址得到。

   什么是地址重定位?
   为了保证CPU执行指令时可正确访问内存单元,需要将用户程序中的逻辑地址转换为运行时可由机器直接寻址的物理地址,这一过程称为地址重定位。
   1).静态重定位?
  当用户程序加载到内存时,一次性实现逻辑地址到物理地址的转换,一般可由软件单独完成。
   2).动态重定位?
  在进程执行过程中进行地址变换,即逐条指令执行时完成地址转换。为了加快效率,需要硬件部件支持配合。如下图,通常计算机内部都有一个内存管理单元(MMU,Memory Management Unit),它是一个重定位寄存器,用来将CPU发送过来的逻辑地址转换为真实的物理地址。
在这里插入图片描述

2. 物理内存管理

2.1 空闲内存管理

  物理内存空间的划分有两种方式,一种是等长划分,另一种是不等长划分
  对应有如下三种数据结构可以进行管理:

  • 位图(bitmap):
    每个分配单元对应于位图中的一位,0表示空闲,1表示占用(或者相反)。适用于等长划分。
  • 空闲区表、已分配区表:
    表中每一项记录了空闲区(或已分配区)的起始地址、长度和标志。可用于不等长划分。
  • 空闲块链表

2.2 内存分配算法

  • 首次适配(first fit)
    每次都从表头开始,在空闲区表中找到第一个满足进程要求的空闲区。
  • 下次适配(next fit)
    从上次找到的空闲区开始,接着往下查找满足要求的空闲区。
  • 最佳适配(best fit)
    查找整个空闲区表,找到能够满足进程要求的最小空闲区。
  • 最差适配(worst fit)
    总是分配满足进程要求的最大空闲区

  通常找到空闲区后,会将供进程使用的空闲区分割出来,从空闲区数据结构中删除(加入到已分配区表数据结构中),剩下的部分形成新的空闲区。

2.3 内存回收

  内存回收算法:当某一块内存地址使用完毕后,进程会将其归还,内存地址归还时,要重新加入空闲区表,此时需要对空闲区的数据结构进行相应修改,分为四种情况:
  1).上相邻:归还的内存地址上方有空闲区,则将两者合并;
  2).下相邻:归还的内存地址下方有空闲区,则将两者合并;
  3).上下相邻:归还的内存地址上下方均有空闲区,则将三者合并为新空闲区;
  4).上下不相邻:在空闲区表中单独新建一个条目,表示归还的内存地址。

2.4 伙伴系统(Buddy system)

  伙伴系统是Linux底层采用的内存管理方案,是一种特殊的“分离适配”算法,也是典型的内存分配方案。
  主要思想:将内存按2的幂进行划分,组成若干空闲块链表;查找该链表找到能满足进程需求的最佳匹配块。
  算法步骤:

  • 首先将整个可用空间看作一块空闲区,记大小为 2 U 2^U 2U;
  • 假设进程申请的空间大小为s,如果满足: 2 U − 1 < s ≤ 2 U 2^{U-1}<s\le 2^U 2U1<s2U,则分配整个块给进程;
  • 否则,将块划分为两个大小相等的伙伴块,大小为 2 U − 1 2^{U-1} 2U1
  • 一直划分下去直到产生大于或等于s的最小块。
    注意,一个进程分配后,会出现很多划分后的子区域,这些区域不处理,而是连接为一个空闲区链表。下一个进程需要分配空间的时候,就在链表中进行查找,找到合适的大小则直接使用,没找到则将大的空闲区继续划分。而进程结束后,归还内存空间,则要进行2.3节中提到的内存回收算法。具体过程可参考下图例子:
    在这里插入图片描述

3. 基本内存管理方案

  加载到内存的单位是进程。前三种方案都是整个进程进入内存中一片连续的区域。

3.1 单一连续区

  特点:一段时间内只有一个进程在内存里。好处是简单,缺点是内存利用率低。现在很少见了。

3.2 固定分区

  • 把内存空间分割成若干区域,称为分区
  • 每个分区的大小可以相同也可以不同;
  • 分区大小固定不变;
  • 每个分区装一个且只能装一个进程。

  比较高效的方式是,进程排队申请空间,看哪个分区空闲就将哪个分区分配给进程。这也是比较古老的方案。
在这里插入图片描述

3.3 可变分区

  根据进程的需要,把内存空闲空间分割出一个分区,分配给该进程。剩余部分成为新的空闲区,用链表等数据结构表示。经过多次之后,可能会形成如下情况:
在这里插入图片描述
  从上图可以看出,这种方法会产生很多空间不大的小空闲分区,这种分区通常是无法分配出去的,因为太小了,通常称为“外碎片",这会导致内存利用率下降。

  如何解决碎片问题?
  碎片:很小的、不易利用的空闲区,会导致内存利用率下降。
  解决方案:紧缩技术(memory compaction),也称压缩技术、搬家技术。
  在内存中移动进程,将所有小的空闲区合并为较大的空闲区。
  紧缩技术需要考虑的问题:系统移动进程的开销问题、移动进程的时机(有些进程在执行某些命令时是不能移动的)

  以下三种内存管理方式,其共同特点是:进程不是整个进入内存的一片连续区域,而是进入内存的若干区域,而这些区域又不连续

3.4 页式内存管理

  设计思想:

  • 用户进程地址空间被划分为大小相等的部分,称为页或页面(page),从0开始编号。
  • 内存空间按同样大小划分为大小相等的区域,称为页框(page frame),从0开始编号,也称为物理页面、页帧或内存块。
  • 内存分配规则:以页为单位进行分配,并按进程需要的页数来分配;逻辑上相邻的页,物理上不一定相邻,即进程的0~N页是逻辑相邻的页,但是在内存空间中分配得到的页不一定是相邻的。
  • 典型页面尺寸:4K或4M。

  地址转换方式
  逻辑地址:分为页号和页内地址,也叫页内偏移。对于32位的计算机来说,按4K的方式进行页面划分,那么32位中的011位($4K=2^{12}$)用来作为页内地址,其余的1231位作为页号,这种划分由于是2的整数次幂,因此划分是系统自动完成的,如下图所示:
在这里插入图片描述

  那么,由于逻辑相邻的页,在物理地址中不一定相邻,如何从逻辑地址转换到物理地址呢?
  下图所示,就是地址映射方式。假设进程的地址空间被划分为7页,每一页都映射到物理内存中不相邻的7个页框中。但其中的映射关系记录在一种数据结构中,叫页表。页表中的每一项叫页表项,其对应了进程的页号和物理内存中的地址空间。
在这里插入图片描述

  页表

  • 页表项:记录了逻辑页与页框号的对应关系;
  • 每个进程一个页表,存放在内存中;
  • 页表的起始地址保存在何处?在某个寄存器中,进程上CPU时提取,下CPU时存放。

  地址转换(为了加快效率通常需要硬件支持):CPU取到逻辑地址,自动划分为页号和页内偏移,用页号查页表,得到页框号,再与页内偏移拼接成最终的物理地址。

  内碎片:假设进程需要的空间为5页+1条指令,那么系统却需要给它分配6个页框,这明显是很浪费的。这种浪费就称为”内碎片“。

3.5 段式内存管理

  设计思想:

  • 用户进程地址空间:按程序自身的逻辑关系划分为若干个程序段,每个程序段都有一个段名
  • 内存空间被动态划分为若干长度不相同的区域,称为物理段,每个物理段由起始地址和长度确定;
  • 内存分配规则:以段位单位进行分配每段在内存中占据连续空间,但各段之间可以不相连。

  逻辑地址:由段号段内地址组成。
  案例:
  假设以下程序,划分为5段,主程序会调用不同的子段,如下图所示:
在这里插入图片描述
  地址转换方式和页式很类似,需要一个段表来储存映射关系,具体如下图:
在这里插入图片描述

  段表

  • 每项记录了段号、段首地址和段长度之间的关系;
  • 每个进程一个段表,存放在内存;
  • 段表起始地址保存在何处?

  地址转换:CPU取到逻辑地址,用段号查段表,得到该段在内存的起始地址,与段内偏移结合计算出物理地址。

3.6 段页式内存管理

  设计思想

  • 综合页式、段式方案的优点,克服两者的缺点。
  • 用户进程划分:先按程序特点按段划分,每段再按页面划分。

  逻辑地址:由段号、段内地址组成,段内地址又由页号、页内地址组成,具体结构如下图:
在这里插入图片描述
  内存划分:同页式储存管理方案,按页划分。
  内存分配:以页为单位进行分配。
  综上所述,段页式存储管理的数据结构就同时包含了段表和页表。

  • 段表:记录了每一段的页表起始地址和页表长度;
  • 页表:记录了逻辑页号与页框号的对应关系,每一段有一张自己的页表,一个进程有多个段表,内含多个页表。

  空闲区管理:同页式管理。
  内存分配、回收:同页式管理。
  地址转换:CPU取进程段的段号,根据段号查段表得到页表起始地址,再根据段内地址得到页号,由页表查到逻辑页号与物理页框号的对应关系,最后根据页内偏移计算出实际的物理地址。

4. 交换技术(swapping)

  交换技术解决了什么问题?
  交换技术解决在较小内存空间运行较大的进程。即进程所需空间比物理空间大时的问题,也称为内存不足时的管理问题。

4.1 内存“扩充”技术

  如果只是由于像3.3可变分区问题中出现的外碎片引起的内存不够,那么只需要采取对应的内存紧缩技术即可解决问题。

4.2 覆盖技术(overlaying)

  主要是针对进程大小超过物理内存总和的情况,是很早以前的技术了。缺点是增加了程序员的负担。
  核心思想是:

  • 在程序执行过程中,程序的不同部分在内存中互相替代;
  • 按照其自身的逻辑结构,将那些不会同时执行的程序段共享一块内存区域;
  • 要求程序各模块之间有明确的调用结构。
  • 由程序员声明覆盖结构,操作系统只完成自动覆盖功能。

  案例:如下两图,有程序X的调用结构,A段执行后,调用B或C段(两者只会调用其一),然后B段调用D段,C段调用E或F段。那么,在物理内存中,我们只需要分配3段内存区域,其中A段独享一段常驻区,因为它是程序主要部分,B\C段由于两者有互斥关系,因此两者共享一段覆盖区0,覆盖区0的大小以B,C中所需内存的较大者为准。同理,D,E,F三段程序共享一个覆盖区1。
在这里插入图片描述 在这里插入图片描述

4.3 交换技术

  设计思想:
  内存空间紧张时,系统将内存中某些进程暂时移到外存,把外存中某些进程换进内存,占据前者所占用的区域(进程在内存与磁盘之间的动态调度)。

  实现时会遇到的问题及解答:

  • 进程的哪些内容可以交换到磁盘?
    运行时创建或修改的内容,如栈和堆,可以交换到磁盘上。
  • 在磁盘的什么位置保存被换出的进程?
    通常,系统会指定一块特殊的磁盘区域作为交换空间(swap space)(windows中叫页文件),包含连续的磁道,操作系统可以使用底层的磁盘读写操作对其高效访问,不需要经过文件系统。
  • 交换的时机如何选择?
    只要不用就换出(很少再用);内存空间不够或有不够危险时就换出,需要与调度器配合使用。
  • 如何选择被换出的进程?
    考虑各进程的各种属性,不应换出处于等待I/O状态的进程。
  • 如何处理进程空间增长?
    数据段和栈段都会根据进程进行而增长。主要有两种解决方式:一种是下左图,在分配进程空间时,预留一段增长区域,让数据段和栈段同向增长;另一种方式也是预留一段区域,只是数据段和栈段是相向增长而不是同向增长。但是,这个预留区域留多大,就是很有技术的部分了。
    在这里插入图片描述 在这里插入图片描述

5. 本章总结

  • 掌握地址重定位的概念
  • 掌握基本内存管理方案
  • 掌握物理内存管理技术
  • 了解交换技术基本思想
  • 重点概念:地址重定位(地址转换、地址映射、地址翻译)、逻辑地址/物理地址、虚拟地址/实际地址、相对地址/绝对地址、单一连续区、固定分区、可变分区、页式、段式、段页式、物理内存管理(位图、空闲区表、空闲区链表)、内存分配算法(首先适配、下次适配、最佳适配、最差适配)、内存回收算法(上相邻、下相邻、上下相邻、上下不相邻)、碎片(内碎片、外碎片)、紧缩技术、交换技术
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值