操作系统第四章:存储器管理

4.1 存储器的层次结构

在这里插入图片描述

  • 寄存器,高速缓存,主存,磁盘缓存属于操作系统管理,掉电后将不复存在。
  • 磁盘和可移动存储介质属于设备管理,他们存储的信息将会长期保留
4.2 程序的装入和链接

在这里插入图片描述
一个源程序变成一个内存中可执行的程序需要三个步骤:

  1. 编译:由编译程序(Compiler)将用户源代码编译成若干个目标模块

  2. 链接:由链接程序(Linker)将目标模块和他们所需要的库函数链接在一起,形成一个完整的装入模块

    • 静态链接方式:在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块
    • 装入时动态链接:源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。即分别装入各模块,并且在装入的过程中修改相对地址和外部引用地址。
      优点:(1)便于修改和更新(2)便于实现对目标模块的共享
      在这里插入图片描述
  3. 装入:由装入程序(Loader)将装入模块装入内存

    • 绝对装入方式:按照装入模块中的地址将程序和数据装入内存,由于逻辑地址与实际地址完全相同,故不需对程序和数据的地址进行修改
    • 可重定位装入方式:装入模块中程序所访问的所有逻辑地址与实际装入内存的物理地址不同 ,必须进行变换。把在装入时对目标程序中指令和数据的变换过程称为重定位。(静态重定位)
    • 动态运行时装入方式:并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序执行时进行(动态重定位)利用以一个重定位寄存器,用于存放程序在内存中真实的起始地址,那么就可以使用起始地址+相对地址得到真实地址

    在这里插入图片描述

4.3 连续分配存储管理方式
  1. 单一连续分配:整个内存的用户区中只驻留一个用户的一个程序————只适用于单用户,单任务的操作系统
    为了防止OS的代码和数据被用户进程所破坏,把内存分为系统区和用户区

    • 系统区:仅提供给0S使用,通常是放在内存的低址部分;
    • 用户区:是指除系统区以外的全部内存空间,提供给唯一的用户使用,存放用户程序和数据
  2. 固定分区分配:将内存划分为若干个固定大小的区域,每个区域为一个分区,每个分区装入一道作业,从而支持多道程序并发

    • 分区大小相等
    • 分区大小不等

    内存分配过程:当有作业要装入内存时,内存分配程序检索分区描述表,从中找出尚未使用的最接近大小的分区分配给该作业,然后修改分区的状态;如果找不到合适的分区就拒绝为该作业分配内存

    但是会存在内零头造成空间浪费

    内零头:在分区中没有利用的部分称为内零头

  3. 动态分区分配:分区数量和大小都不固定,根据进程的实际需要,动态地为之分配内存空间。

    1. 空闲分区表:包含空闲分区号、分区大小、起始地址

    2. 空闲分区链表:为了实现空闲分区的分配和链接,设置前向指针和后向指针,形成一个双向链表

    3. 分区分配:

      • u.size为请求的分区大小
      • m.size为表中每个空闲分区的大小可表示
      • size是事先规定的不再切割的剩余分区的大小
      • m.size-u.size≤size,说明多余部分太小,不再分割,否则,从该分区中划分一部分空间给请求者。
    4. 分区分配算法

      1. 首次匹配:要求空闲分区链以地址递增的次序链接。从链首开始顺序查找,直到找到一个大小能满足需求的空闲分区
        优点:优先利用内存中的低地址部分的空闲分区,从而保留了高地址部分的大空闲区,因此为大作业分配大的内存空间创造了条件。
        缺点:但是由于低址部分不断被划分,会留下许多难以利用的、很小的空闲分区。
      2. 循环匹配:。每次查找时不是从头开始,而是从上次找到的空闲分区的下一个空闲分区开始查找
        优点:空闲分区分布得更均匀,从而减少了查找空闲分区时的开销
        缺点:会缺乏大的空闲分区
      3. 最佳匹配:其容量以从小到大的顺序形成一空闲分区链。从头开始查找,将表中第一个大于所需求空间大小的空闲区分配给作业
        优点:为大作业分配大的内存空间创造了条件。
        缺点:每次分配后所切割下来的剩余部分总是最小的,这样,在存储器中会留下许多难以利用的小空闲区。
      4. 快速适应算法:将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表。
        优点:(1)查找效率高(2)该算法在进行空闲分区分配时,不会对任何分区产生分割,所以能保留大的分区
        缺点:(1)在分区归还主存时算法复杂,系统开销较大。(2)该算法在分配空闲分区时是以进程为单位,一个分区只属于一个进程,因此在为进程所分配的一个分区中,或多或少地存在一定的浪费
      5. 伙伴系统:(主要过程)当分配一个长度为n 的存储空间时,首先计算一个i 值,使2 i-1<n≤2i,然后在空闲分区大小为2i 的空闲分区链表中查找。若找到,即把该空闲分区分配给进程。,则在分区大小为2 i+1的空闲分区链表中寻找。若存在2 i+1 的一个空闲分区,则把该空闲分区分为相等的两个分区,这两个分区称为一对伙伴,其中的一个分区用于分配,而把另一个加入分区大小为2i 的空闲分区链表中。
    5. 分区回收:当进程运行完毕释放内存时,需合并相邻的空闲分区,形成大的分区,称为合并技术。
      在这里插入图片描述

    6. 紧凑技术:把原来分散的多个小分区合成一个大分区

4.4 对换

对换:把内存中暂时不用的进程或程序和数据调出到外存(后备队列)上,然后把后备队列中已具备运行条件的程序和数据,调入内存。

对换分为两种:

  • 整体对换”或“进程对换”:以整个进程为单位
  • 页面对换”或“分段对换”:以一个页面或一个分段为单位

为了实现进程对换,系统必须能实现三方面的功能:

  1. 对换空间的管理:在具有对换功能的OS中,通常把外存分为文件区和对换区
  2. 进程的换出:系统选择处于阻塞状态(或者休眠状态)且优先级最低的进程作为换出进程,将该进程的程序和数据传送到磁盘的对换区上
  3. 进程的换入:(一般由调度程序实现)系统定时地查看所有进程的状态,从中找出“就绪”状态但已换出的进程,将其中换出时间最久的进程作为换入进程
4.4 离散分配方式——分页存储管理方式

页面:将进程的逻辑地址空间分成若干个大小相等的片

物理块(页框):将内存空间分成与页面相同大小的若干个存储块

在为进程分配内存时,以块为单位将进程中的若干页分别装入到多个不相临接的物理块中

页表:因为进程的每一页离散地存贮在任一物理块中,所以操作系统为每一个进程都建立了一张页面映像表

  1. 页面大小的影响:页面较大,虽然可以减少页表的长度,提高页面换进换出的速度,但却又会使页内碎片增大。
  2. 地址结构
    在这里插入图片描述
    地址变换的整个过程
    1. 根据逻辑地址,计算出页号和页内偏移量;
    2. 从PTR中得到页表首址,然后检索页表,查找指定页面对应的页框号;
    3. 用页框号乘以页面大小获得其对应的起始地址,并将其送入物理地址的高端。
    4. 将页内偏移量送入物理地址低端,形成完整的物理地址。
      在这里插入图片描述

大页表的处理方法:建立多级页表
逻辑地址结构:
在这里插入图片描述
eg:二级页表
在这里插入图片描述在这里插入图片描述
快表:在分页系统中,处理及每次存取指令或数据至少需要访问两次物理内存(第一次访问页表,第二次存取指令或数据)————于是为了提高地址转换速度,为进程页表设置一个专用的高速缓存器,称为快表
在这里插入图片描述

4.5 离散分配方式——分段存储管理方式

引入分段的原因

  1. 方便编程:根据编程人员的需要将程序分成代码段,数据段等独立信息段
  2. 信息共享
  3. 信息保护
  4. 动态增长
  5. 动态链接

在这里插入图片描述

  1. 系统采用动态划分技术,将物理内存动态地划分成许多尺寸不相等的分区。
  2. 当一个进程被装入物理内存时,系统将为该进程的每一段独立地分配一个分区。同一进程的多个段不必存放在连续的多个分区中。
  3. 段表:每个进程建立一个段表,用于描述进程的分段情况,记载进程的各个段到物理内存中分区的映射情况
  4. 空闲分区表 : 用于记载物理内存中的空闲分区情况。
  5. 段表寄存器 :实现快速地址变换,用来存放当前执行进程的段表在物理内存中的起始地址(即基址)。
    在这里插入图片描述在这里插入图片描述

分页和分段的主要区别:

  1. 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。
    段则是信息的逻辑单位,它含有一组意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。
  2. 页的大小固定且由系统决定,因而在系统中只能有一种大小的页面
    段的长度却不固定,决定于用户所编写的程序
  3. 分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址;
    分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
4.6 离散分配方式——段页式存储管理方式

原理:

  1. 采用分段方法组织用户程序,采用分页方法分配和管理内存。
  2. 先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。

在这里插入图片描述地址变换:

  1. 从段表寄存器从获得进程段表的起始地址,根据该地址,查找进程的段表。
  2. 根据逻辑地址指定的段号检索段表,找到对应段的页表起始地址。
  3. 根据逻辑地址中指定的页号检索该页表,找到对应页所在的页框号。
  4. 用页框号加上逻辑地址中指定的页内偏移量,形成物理地址。
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值