计算机操作系统——存储器管理

4.1 存储器的层次结构

1、提出存储层次体系的主要依据是程序访问的局部性原理
2、计算机开机后,操作系统最终被加载到:RAM
3、存储管理的目的是:方便用户和提高主存利用率
在这里插入图片描述

在这里插入图片描述

4.2 程序的装入和链接

基础

1、将用户源程序变为可在内存中执行的程序的步骤:
编译:由编译程序将用户源代码编译成若干个目标模块
链接:由链接程序将编译后形成的一组目标模块,以及它们所需要的库函数链接在一起,形成一个完整的装入模块
装入:由装入程序将装入模块装入内存,构造PCB,形成进程(使用物理地址)

在多道程序环境下,要使程序运行,必须为之先建立进程。创建进程的第一件事是将程序和数据装入内存。
2、用户程序的主要处理阶段

  • 编辑阶段(形成符号空间)
  • 编译阶段(生成目标代码)
  • 链接阶段(确定相对地址)
    将编译后一组目标模块以及它们所需的库函数装配成一个完整的装入模块。
  • 装入阶段(可以确定物理地址)
    将装入模块放入分到的内存区中。这时需要进行地址重定位。
  • 运行阶段(可以确定物理地址)
    运行可执行的程序file1.exe。

3、逻辑地址、物理地址和地址映射

  • 逻辑地址(相对地址,虚地址):
    用户程序经过编译链接后形成的以0为基址的地址。
    不能用逻辑地址在内存中读取信息。
  • 物理地址(绝对地址,实地址):
    内存中存储单元的地址。物理地址可直接寻址。
  • 地址映射:
    将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。

4、重定位

  • 重定位:把程序中的逻辑地址变成内存中的物理地址的过程叫做重定位。
  • 静态重定位在程序执行之前进行,由专门设计的重定位装配程序完成。
  • 动态重定位在程序执行过程中,每次访问内存之前将程序地址变换为内存地址,这种变换是依靠硬件地址变换机构实现的。

4.2.1 程序的装入

1、三种方式
①绝对装入方式

  • 在编译时,如果知道程序驻留在内存的什么位置,那么编译程序将产生绝对地址的目标代码。
  • 程序中的逻辑地址与实际内存地址完全相同,无需对程序和数据的地址进行变换。
  • 优点:装入过程简单
  • 缺点:过于依赖硬件结构,不便多道程序系统。
    ②静态重定位装入方式
  • 在程序执行之前由专门设计的重定位装配程序一次性实现逻辑地址到物理地址的转换.
  • 优点:不需硬件支持,可以装入多道程序。
  • 缺点:一个程序通常需要占用连续的内存空间;程序装入内存后不能移动。
    ③动态重定位装入方式
  • 程序装入内存后,并不立即实施地址变换,而是把这种地址转换推迟到程序真正运行时才进行;
  • 装入内存后仍是相对地址;
  • 应设置一个重定位寄存器。
  • 优点:
    OS可以将一个程序分散存放于不连续的内存空间,可以移动程序。
  • 缺点:需要硬件支持,OS实现较复杂。
  • 是虚拟存储的基础。

程序的链接

1、静态链接:在程序装入内存之前,将目标模块及所需的库函数链接成一个完整的装配模块,以后不再拆开。
①静态链接是在生成可执行文件时进行的。
②事先进行链接,以后不再拆开。

2、装入时动态链接:指将用户源程序编译后所得的一组目标模块,在装入内存时,采用边装入边链接的链接方式。
①优点:
(1) 便于模块的修改和更新;
(2) 便于实现对目标模块的共享。

3、运行时动态链接:指对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行链接。边执行边链接
①优点:
加快装入过程、节省内存空间

4.3 连续分配存储管理方式

连续分配方式,是指为一个用户程序分配一个连续的内存空间。

4.3.1 单一连续分配

  • 内存分为两个区域:系统区,用户区。应用程序装入到用户区,可使用用户区全部空间。
  • 最简单,适用于单用户、单任务的OS。
  • 优点:易于管理。
  • 缺点:对要求内存空间少的程序,造成内存浪费;程序全部装入,很少使用的程序部分也占用内存。

4.3.2 固定分区分配

1、基本原理及技术
系统提前把内存分为一些大小相等或不等的分区(partition),每个进程占用一个分区。操作系统占用其中一个分区。
①特点
适用于多道程序系统和分时系统
支持多个程序并发执行
② 问题
可能存在内碎片。
内碎片:分区之内未被利用的空间
外碎片:分区之间难以利用的空闲分区(通常是小空闲分区)。
2、划分分区的方法
①分区大小相等:只适合于多个相同程序的并发执行(处理多个类型相同的对象)。缺乏灵活性。
②分区大小不等:多个小分区、适量的中等分区、少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。
3、优缺点

  • 优点:易于实现、开销小
  • 缺点:
    内碎片造成浪费
    分区总数固定,限制了并发执行的程序数目。

可以和覆盖、交换技术配合使用
采用的数据结构:分区表–记录分区的大小和使用情况

4.3.3 动态分区分配

1、动态分区分配
在装入程序时按其初始要求分配
在其执行过程中通过系统调用进行分配或改变分区大小。
2、优缺点

  • 优点:没有内碎片
  • 缺点:有外碎片

3、在实现过程中涉及三个问题
①分区分配中的数据结构
空闲分区表:记录每个空闲分区的情况。每个空闲分区占一个表目,表目中包括分区序号、分区始址及分区的大小等数据项。
空闲分区链:在这里插入图片描述

②分区分配算法
基于顺序搜索的分区分配算法

  • 首次适应算法FF(First Fit)
    首址递增排列
    优点:优先利用内存低址部分。
    缺点:低址部分不断划分,产生小碎片;每次查找从低址部分开始,增加了查找的开销。
  • 循环首次适应算法NF(Next Fit)

实现算法,需要:设置起始查寻指针,并采用循环查找方式
优点:使内存空闲分区分布均匀,减少查找的开销
缺点:缺乏发的空间分区

  • 最佳适应算法BF(Best Fit)

空闲区按大小递增排列
缺点:产生许多难以利用的小空闲区(外碎片)

  • 最差适应算法WF(Worst Fit)

空闲区按大小递减排列
不会留下太多的小空闲分区,但较大的空闲分区不被保留。

总结

	首次适应算法:
			将地址最小的够用的空间分配出去
	下次适应算法:
			从上次分配位置开始搜索
			将地址最小的够用的空间分配出去
	最佳适应算法:
			将够用的长度最小的空间分配出去
	最差适应算法:
			将够用的长度最大的空间分配出去
首次适应算法最简单; 地址低端会有大量碎片
下次适应算法碎片均匀 ;没有大的空闲块 ;常需要紧缩
最佳适应算法最经济;很多碎片,经常紧缩
最差适应算法碎片很少,速度最快;没有大的空闲块

③分区分配操作

  • 分配内存

设请求的分区大小为u.size,
表中每个空闲分区的大小表示为m.size,
若m.size- u.sizesize(最小阈值),
将整个分区分配给请求者,
否则从分区中按请求的大小划出一块内存空间分配,
余下部分留在空闲链中,将分配区首址返回给调用者。

在这里插入图片描述

  • 回收内存

当进程运行完毕释放内存时,系统根据回收区首址,在空闲分区链(表)中找到相应插入点;
此时可能有四种情况:
在这里插入图片描述

  • A回收区与插入点的前一个分区F1邻接:将回收区与F1合并,修改F1的表项的分区大小
  • B回收区与插入点的后一个分区F2邻接:将回收区与F2合并,修改F2的表项的首址、分区大小
  • C回收区与插入点的前后两个分区F1、F2邻接:将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和
  • D回收区既不与F1邻接,又不与F2邻接:为回收区单独建立新表项,填写回收区的首址与大小,根据其首址插到空闲链中的适当位置。

4、基于索引搜索的分区分配算法

  • 快速适应算法:将空闲分区,按其容量大小,进行分类,对于每一类的所有空闲分区,单独设立一个空闲分区链表
  • 伙伴系统:分区大小均为2的k次幂,将空闲分区按分区的大小进行分类,并单独设立一个空闲分区双向链表。
  • 哈希算法:构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。

①Buddy(伙伴的定义)
满足以下三个条件的称为伙伴:
1)两个块大小相同;
2)两个块地址连续;
3)两个块必须是同一个大块中分离出来的;

优缺点:可以很快找到空闲块;避免了外碎片问题;申请/释放可能会导致连续切块/合并,影响系统效率。

4.3.4 动态重定位分区分配

1、动态重定位的引入

解决碎片:将内存中的所有作业进行移动,使它们全部邻接,这样可把原来分散的小分区拼接成大分区,这种方法称为**“拼接”或“紧凑”**。
缺点:用户程序在内存中的地址发生变化,必须重定位。
紧缩技术
内存紧缩(compaction):将各个占用分区向内存一端移动。使各个空闲分区聚集在另一端,然后将各个空闲分区合并成为一个空闲分区。
优点:消除外碎片。
缺点:对占用分区进行内存数据搬移占用CPU时间; 重定位需要硬件支持。
紧缩时机:每个分区释放后;内存分配找不到满足条件的空闲分区时。

2、动态重定位的实现
地址变换过程是在程序执行过程期间,随着对每条指令的访问自动进行的,称为动态重定位。
3、动态重定位分区分配算法
在这里插入图片描述

4、可重定位分区分配方式主要特点
可以充分利用存储区中的“零头/碎片”,提高主存的利用率。
但拼接/紧缩会使系统开销加大。

5、分区的存储保护

①界限寄存器方法
上下界寄存器方法:
基址、限长寄存器方法:
②存储保护键方法
给每个分区分配一个单独的保护键,它相当于一把锁。
进入系统的每个作业赋予一个保护键,它相当于一把钥匙。
当作业运行时,检查钥匙和锁是否匹配,如果不匹配,则系统发出保护性中断信号,停止作业运行。
5、内存扩充技术
内存紧缩技术(例如:可变分区)
覆盖技术 overlaying
交换技术 swapping
虚拟存储技术 virtual memory

  • 覆盖技术(用于早期的操作系统)

①解决的问题 → 程序大小超过物理内存总和
②程序执行过程中,程序的不同部分在内存中相互替代
→按照其自身的逻辑结构,使那些不会同时执行的程序段共享同一块内存区域
→要求程序各模块之间有明确的调用结构
③程序员声明覆盖结构,操作系统完成自动覆盖

4.4 对换(Swapping)

1、对换的引入
**对换:**把内存中暂时不能运行的进程或者暂时不用的程序和数据,调到外存上,以便腾出足够的内存空间,再把已具备运行条件的程序和数据,调入内存。
分类:
整体对换(或进程对换):以整个进程为单位
页面对换或分段对换:以页或段为单位
2、为实现进城对换,系统必须具备的功能

  • 对换空间的管理
    在这里插入图片描述

  • 进程的换出
    过程:系统首先选择处于阻塞状态且优先级最低的进程作为换出进程,然后启动盘块,将该进程的程序和数据传送到磁盘的对换区。

  • 进程的换入
    系统应定时查看所有进程的状态,从中找出“就绪”状态但已换出的进程,将换出最久的进程作为换入进程,将之换入。

对换与覆盖的区别

覆盖技术:把用户作业分成若干段,使主段成为作业执行过程中经常使用的信息,其他段不同时工作。作业执行时,把主段常驻主存区,其他段轮流装入覆盖区执行之。
对换技术:让多个用户作业轮流进入主存器(转入、转出)执行。
覆盖主要在同一个作业或同一个进程内进行。
对换主要是在进程或作业之间进行。覆盖只能覆盖那些与覆盖程序段无关的程序段。

4.5 分页存储管理方式

4.5.1 分页存储管理的基本方法

将程序的逻辑地址空间划分为固定大小的页;
物理内存划分为固定大小的块(页架);
程序加载时,分配其所需的所有页,这些页不必连续。需要CPU的硬件支持。

1、所需表目
1)页表:每个进程一个
2)总页表:系统一个
2、所需寄存器
1)页表首址寄存器:系统一个
2)页表长度寄存器:系统一个
3)块表:系统一组

3、优点:

  • 没有外碎片,每个内碎片不超过页大小。
  • 一个程序不必连续存放。
  • 便于改变程序占用空间的大小。即随着程序运行而动态生成的数据增多,地址空间可相应增长。

4、缺点:
程序全部装入内存

5、页面和物理块

分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片称为,并为各页加以编号,从0开始。
同时把内存空间分成与页面相同大小的若干个存储块,称为
在为进程分配内存时,以块为单位将进程的若干个页分别装入到多个可以不相邻的物理块中。
进程的最后一页经常装不满而形成**“页内碎片”**

6、地址结构
在这里插入图片描述

假定地址长度32位:
每页的大小为4KB , 即:011位为位移量(页内地址)
则:12 31位为页号,地址空间最多允许有1M页

7、页号与页内偏移的计算

若给定一个逻辑地址空间中的地址为A,页面大小为L,则:
页号: P=INT[A/L]
页内地址: d=[A] MOD L

例如:系统页面大小为1KB,设A=2170B,则:
P=2,d=122

4.5.2 地址变换机构

1、基本的地址变换机构:实现从逻辑地址到物理地址的转换,其任务是借助于页表,将逻辑地址中的页号转换为内存中的物理块号。
页表可以由一组专门的寄存器来实现,一个页表项用一个寄存器。但寄存器成本高,系统页表可能很大,所以页表大多常驻内存。
在系统中只设置一个页表寄存器PTR,在其中存放页表在内存中的始址和页表的长度。

2、页表的作用

  • 在分页系统中,允许进程的每一页离散地存储在内存的任一存储块中,为方便查找,系统为每一进程建立一张页面映像表,简称页表。
  • 页表实现了从页号到物理块号的地址映射。
  • 在页表表项中常设置一存取控制字段,对存储块内容加以保护。

3、分页系统的地址变换机构

在这里插入图片描述

总结
1)地址转换步骤:
当逻辑地址为十进制时:
①求出逻辑地址的页号 = 逻辑地址 / 页面大小
②求出页内偏移量 = 逻辑地址 % 页面大小
③用页号查页表,得到块号;
④求出物理地址 = 块号 * 页面大小 + 页内偏移

当逻辑地址为十六进制/八进制/二进制时:
①把逻辑地址转为二进制;
②按页的大小分离出页号和页内偏移量( 高位部分为页号,低位部分为页内偏移量 );
③以页号查页表,得到物理地址的块号;
④将逻辑地址的页内偏移量直接复制到物理地址的块内偏移量上;
⑤把块号转为二进制,从而得出物理地址,再转回16/8进制。

4、具有快表的地址变换机构

CPU在每存取一个数据时,需要两次访问内存:
第一次:访问页表,找到指定页的物理块号,将块号与页内偏移量拼接形成物理地址。
第二次:从第一次所得地址中获得所需数据,或向此地址中写入数据。

处理速度降低
解决办法:在地址变换机构中,增设一个具有并行查寻能力的特殊高速缓冲寄存器,称为**“联想存储器”或“快表”。**
在这里插入图片描述

4.5.3 有效访问内存的时间

有效访问内存的时间
         T=PTLB*(TTLB+TM)+ 1-PTLB * TTLB + 2TM       
      
 其中,PTLB为快表的命中率,TTLB为快表的访问时间, TM为内存的访问时间



T=a*(λ+t)+ 1-a)* λ+2t     
   =+at+(1-a)(λ+t)+(1-a)t
   =+(1-a)(λ+t)+t


其中,a为快表的命中率, λ为快表的访问时间, t为内存的访问时间



4.5.4 两级和多级页表

1、两级页表
32位机器
在这里插入图片描述

2、多级页表

64位机器(采用多级页表,将外层页表再进行分页)

3、反置页表
与传统页表相比,反置页表的优势:

  • 传统页表是面向进程逻辑地址空间的,即对应进程的每个逻辑页面设置一个表项,当进程的地址空间很大时,页表需占用很多的存储空间,造成浪费;
  • 与经典页表不同,反置页表是面向内存物理块的,即对应内存的每个物理块设置一个表项,表项的序号就是物理块号f,表项的内容则为进程标识pid与逻辑页号p的有序对;
  • 系统只需设置一个反置页表,为所有进程所共用。

4、页的共享
实现方法:被各进程共享的一段代码,由各进程相应的页表项指向相同物理块。

5、页的保护

页式存储管理系统提供了两种方式:
地址越界保护
在页表中设置保护位(定义操作权限:只读,读写,执行等)

4.6 分段存储管理方式

4.6.1 分段存储管理方式的引入

引入分段存储管理方式,主要是为了满足用户的一系列要求:
方便编程:按逻辑关系分为若干个段,每个段从0编址,并有名字和长度,访问的逻辑地址由段名和段内偏移量决定。
信息共享:共享是以信息为逻辑单位,页是存储信息的物理单位,段却是信息的逻辑单位。
信息保护:保护也是对信息的逻辑单位进行保护的。
动态链接:动态链接以段为单位。
动态增长:实际应用中,某些段(数据段)会不断增长,前面的存储管理方法均难以实现。
空间划分:将用户作业的逻辑地址空间划分成若干个大小不等的段(由用户根据逻辑信息的相对完整来划分)。各段有段名(常用段号代替),首地址为0。
内存分配:在为作业分配内存时,以段为单位,分配一段连续的物理地址空间;段间不必连续。

4.6.2 分段系统的基本原理

1、
1)
页式管理把逻辑地址视为一维线性空间
段式管理把逻辑地址视为二维空间

2)
将一个用户程序的所有逻辑段从0开始编号,称为段号
每一段内的所有单元从0开始编址,称为段内地址
逻辑地址由段号和段内地址两部分组成。

3)
段式管理将程序的地址空间划分为若干个段(segment),程序加载时,分配其所需的所有段(内存分区),这些段不必连续;物理内存的管理采用动态分区。需要CPU的硬件支持。

4)
程序通过分段(segmentation)划分为多个模块,如代码段、数据段、共享段。
可以分别编写和编译
可以针对不同类型的段采取不同的保护
可以按段为单位来进行共享,包括通过动态链接进行代码共享
优点
没有内碎片,外碎片可以通过内存紧缩来消除。
便于改变进程占用空间的大小。
缺点
进程全部装入内存。

5)段表

在这里插入图片描述

  • 记录了段与内存位置的对应关系
  • 段表常保存在内存中
  • 段表的基址及长度由段表寄存器给出

在这里插入图片描述

  • 访问一个数据/指令需访问内存2次(段表一次,内存一次),所以也出现内存访问速度降低的问题。

  • 二维的逻辑地址:
    在这里插入图片描述

  • 许多编译程序支持分段方式,自动根据源程序的情况产生若干个段

  • 所需表目:段表(每进程一个);总段表(系统一个)

  • 所需寄存器:段表首址寄存器(系统一个);段表长度寄存器(系统一个);快表(系统一组)
    2、分段地址变换机构
    在这里插入图片描述

  • 8
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
存储器管理是操作系统中的一个重要组成部分,它主要负责管理计算机的内存资源,包括内存分配和回收、内存保护、虚拟内存管理等。下面介绍一下操作系统实验中的存储器管理。 1. 内存分配和回收 内存分配是将一定大小的内存块分配给进程使用,而内存回收则是将进程不再使用的内存块释放出来,以便其他进程使用。在实现内存分配和回收时,可以采用多种算法,比如首次适应算法、最佳适应算法、最坏适应算法等。这些算法的实现过程可以通过链表或位图来完成。 2. 内存保护 内存保护是指防止进程越界访问内存区域,从而导致系统崩溃或数据损坏。在操作系统中,可以通过硬件和软件两种方式来实现内存保护。硬件保护通常通过内存管理单元(MMU)来实现,而软件保护则通过访问权限控制和地址空间隔离来实现。 3. 虚拟内存管理 虚拟内存管理是操作系统中的一个重要功能,它可以将进程的虚拟地址空间映射到物理内存中,从而使得进程可以访问超过实际物理内存大小的数据。在实现虚拟内存管理时,需要采用一些算法来完成页面置换和页面调度等操作,比如最近最少使用算法(LRU)。 总之,存储器管理是操作系统中重要的组成部分,对于系统的稳定性和性能有着重要的影响。在操作系统实验中,可以通过实现内存分配和回收、内存保护、虚拟内存管理等功能,来加深对操作系统存储器管理的理解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值