操作系统学习笔记(五):存储器管理

存储管理

首先先上一张思维导图,接下来的内容根据思维导图来进行
在这里插入图片描述

存储器管理概述

主存和辅存

在这里插入图片描述

存储器管理主要是对内存部分的管理,同时也涉及对内存和外存交换信息的管理

内存又可以分成系统区和用户区 —> 系统区用来存储操作系统等系统软件 , 用户区用来分配给用户进程使用

进程管理实际上是对用户区的管理

存储器管理的目的

三个目的 ----->为用户提供方便、安全和充分大的存储空间

在这里插入图片描述

存储器管理的任务

存储器管理的认为主要为五个方面分别为地址转换,内存的分配和回收,内存的地址保护,内存的共享,内存的扩充

1. 地址转换

关于地址转换首先要清楚逻辑地址和物理地址这两个概念

  • 逻辑地址

逻辑地址指用户源程序经过编译和汇编后形成的目标代码中出现的地址

如规定目标程序的首地址为零,其他指令的地址都是相对于首地址而定的 把这里的地址称为逻辑地址也叫相对地址

  • 物理地址

内存中各存储单元的编号称为物理地址 也称绝对地址

地址转换即在进程运行之前将进程指令中的逻辑地址转换成内存中的物理地址

2. 内存的分配和回收

当用户程序需要装入内存创建进程时,需要向操作系统提出申请,操作系统按一定策略分配内存空间,进程执行完毕时操作系统需要及时回收内存空间。

操作系统必须随时掌握内存的使用情况。

3. 内存的地址保护

避免内存中多个进程互相干扰,尤其防止用户进程侵犯系统进程所在的内存区域,对内存进行地址保护来保证各个进程都在自己所属的内存空间中或在公共区域中工作,互不干扰。

4. 内存的共享

提高内存的利用率

  1. 共享内存资源
  2. 共享内存的某些区域

5. 内存的扩充

虚拟存储

程序的连接和装入

一个用户源程序变为一个可以在内存中执行的程序需要经历:

在这里插入图片描述

程序的连接

源程序经过编译后会得到一个或者多个目标模块,一些模块无需连接可以直接装入内存,一些模块需要通过连接程序将它们和所需要的库函数连接形成装入模块

三种连接方式

  1. 静态连接方式

在程序运行之前,将各个目标模块及他们需要的库函数,连接成一个完整的装入模块又称可执行文件

  1. 装入时动态连接

目标模块在装入内存时,边装入边连接 —> 在装入一个目标模块时,如果发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存,进行连接

  1. 运行时动态连接

将对某些模块的连接推迟到执行时才进行。

程序的装入

将一个装入模块装入内存时,需要进行地址转换

三种装入方式

  1. 绝对装入方式

    逻辑地址转换成物理地址的过程发生在程序编译或汇编时

  2. 可重定位装入方式

​ 地址转换发生在程序装入内存时

​ 可重定位装入方式不允许程序在内存中移动位置

  1. 动态运行时装入方式

​ 地址转换发生在程序真正执行时

​ 通常会设计一个重定位寄存器来实现动态重定位

在这里插入图片描述

连续分配方式

单一连续分配

内存的用户区一次只分配给一个用户程序使用

分区分配

  1. 固定分区

系统预先将内存中的用户区分成若干个连续的区域,每个区域称为一个分区,分区大小可以相同也可以不同

  1. 可变分区

    在程序装入时根据程序的实际需要动态的划分内存空间

分区分配中的数据结构

1.已分分区表 2.空闲分区表

分区分配算法

内存碎片的概念 :当我们在进行分配过程,产生的一些小且不连续的分区,这些分区不能够供用户作业使用,这些小的分区称为内存碎片

  1. 首次适应算法

    要求空闲分区链以地址递增的次序连接,在分配时从链首开始顺序查找,找到一个能满足大小的空闲分区

    这种算法从低址部分开始划分很容易产生内存碎片,且每次查找都从低址部分开始,增加了查找可用空闲分区的开销

  2. 循环首次适应算法

    由首次适应算法演变而来,即为程序分配内存空间时不再从链首开始,而是从上一次分配的空闲分区的下一个空闲分区开始

  3. 最佳适应算法

    最佳适应算法其实不是“最佳”,“最佳”的意思是指找到能够满足要求且最小的空闲分区。按照这种思想每次分配后剩下的空闲分区一定是最小的,很容易产生内存碎片。

  4. 最差适应算法

    最差适应算法其实不是“最差”,“最差”的意思是指分配是找到满足要求且最大的空闲分区,以至于剩下的空闲分区不会太小产生内存碎片

内存分区分配操作

令请求分区大小为request,每个空闲分区的大小为free,不再切割的剩余分区大小为size,分配流程为

在这里插入图片描述

分区回收操作

分区回收可能出现四种情况

  1. 回收区与插入点的前一个分区相邻接

    将回收区与插入点前一个分区合并,不再为回收分区分配新表项,只需要修改前一个分区的大小为两个分区之和

  2. 回收区与插入点的后一个分区相邻接

    两分区合并形成新的空闲区,用回收区的首址作为新空闲区的首址,大小为两分区之和

  3. 回收区同时与插入点的前后两个分区相邻接

    三个分区合为一个分区,使用前一个分区的首址,取消后一个分区的表项

  4. 回收区没有邻接分区

    为回收区单独建立一个新表项,填写回收区的首址和大小,并根据首址插入到空闲表(链)的适当位置

在这里插入图片描述

可变分区分配的优缺点

优点:

  1. 有助于多道程序设计,提高了内存利用率
  2. 要求硬件支持少,代价低
  3. 管理算法容易,容易实现

缺点:

  1. 必须给程序分配一个连续的内存区域
  2. 碎片问题严重
  3. 不能实现对内存的扩充
  4. 无法实现虚拟存储
紧凑

当当前剩余空闲分区不能满足程序使用,但是可以将分散的小分区拼接成一个大分区时可以把程序装入运行。

这个拼接过程就是紧凑或者拼接

只有动态重定位的装入方式才能支持紧凑,因为紧凑后进程在内存中的位置发生了变化,如果不对程序和数据的地址进行修改,程序将无法执行,必须进行重定位才能使之执行。

覆盖技术与交换技术

覆盖和交换技术是实现虚拟存储的基础,是对内存在逻辑上的扩充。

覆盖

覆盖是指同一内存区可以被不同的程序段重复使用。

通常一个程序由若干个功能上相互独立的程序段组成,程序在执行时也就用到其中几段,所以可以让那些不会同时执行的程序段共享一个内存区。

把那些可以互相覆盖的程序段称为覆盖,把那些可共享的内存区称为覆盖区。

把程序执行时并不需要同时装入内存的覆盖组成一组,称为覆盖段,并分配同一个内存区。

覆盖技术的关键

提供正确的覆盖结构

覆盖技术的主要特点

打破了必须将一个程序的全部信息装入内存后才能运行的限制,在一定程度上解决了小内存运行大程序的矛盾

交换

根据系统需要把内存中暂时不运行的某个(或某些)进程部分或全部移到外存,以便腾出足够的内存空间,再把外存中的某个(或某些)已具备运行条件的程序移到相应的内存去,创建进程,并使之投入工作

交换的时机

  1. 进程用完时间片或等待输入/输出
  2. 进程需求扩充存储而得不到满足时

具有交换功能的存储系统通常把内存分为文件区和交换区

  • 文件区用于存放文件 对文件区管理的主要目的是提高存储空间的利用率,所以采用离散分配方式
  • 交换区用于存放从内存中换出的程序(进程) 对交换区管理的主要目的是提高程序的换入换出速度,所以采用连续分配方式

交换的关键

设法减少每次交换的信息量,以提高速度

交换技术的主要特点

打破了一个程序一旦进入内存便一直运行到结束的限制

离散分配方式

分页存储管理方式

基本思想

把进程的逻辑空间分成一些大小相同的片段称为页或页面,把内存也分成大小相同的片段称为物理块或页框

在分配存储空间时,总是以块为单位按照进程的页数分配物理块,分配的物理块可以连续也可以不连续

进程的最后一页经常装不完一块而形成不可以利用的碎片称为页内碎片

页表

为了能在内存中找到页面对应的物理块,系统为每个进程建立了一个页面映射表简称页表

作用

实现从页号到物理块号的地址映射

在这里插入图片描述

动态地址变换

地址结构

分页管理系统中可以逻辑地址和物理地址可以分解成两部分

逻辑地址: 页号 页内偏移量

物理地址: 块号 块内偏移量

给一个逻辑地址为1239 页面大小为512B

1239 / 512 = 2 余 215

可以判断该逻辑地址属于2号页 页内位移为215

地址结构可以表示为

在这里插入图片描述

地址变换

对于分页管理方式,页内偏移量和对应的块内偏移量是一样的,所以只需要根据页表实现页号到块号的转换即可

系统设置一个页表寄存器(PTR)来存放页表在内存中的始址和页表的长度

进程未执行时,页表的始址和长度存放在对应进程的PCB中,当调度程序调度到某进程时,才将它们装入到页表寄存器中

在这里插入图片描述

逻辑地址转换成物理地址的过程

首先将页号和页表长度进行比较,判断是否地址越界,如没有越界,将页表始址与页号和页表项长度的成绩相加,找到该表项在页表中的位置,得到物理块号装入物理地址寄存器中,与此同时,再将逻辑地址寄存器中的页内地址装入物理地址寄存器中。

一共发生了两次访存

  1. 根据页号访问页表
  2. 根据物理地址进行读/写操作
快表

为提高存取速度,在地址变换结构中增设了一个具有并行查寻能力的特殊高速缓存存储器又称联想存储器或快表

其思想与cache相似

两级和多级页表

解决页表变得非常大的问题

对页表进行分页,并将各个页表页分别存放的不同的内存块中,然后为离散分配的页表再建立一张页表称为外层页表,来记录存放各页表页的内存块号从而形成了两级页表

在这里插入图片描述

按照两级页表的思路我们也可以设计出多级页表

分配与回收

分页存储管理方式中内存的分配和回收采用位示图法

用一位来表示一个内存块,用一位的两种状态来表示内存块是空闲还是已分配

分段存储管理方式

基本思想

将每个程序的地址空间按照自身的逻辑关系划分成若干段 ----> 主程序段 子程序段 数据段 堆栈段等

段的长度由响应的逻辑信息组的长度决定,各段的长度不等,分配内存时为每个段分配一连续的存储空间,段间地址空间可以不连续

段表

为了能从内存中找到每个逻辑段所存储的位置,系统为每个进程建立了一个段映射表简称段表

在这里插入图片描述

地址变换

在这里插入图片描述

存储保护

  1. 越界保护

    段号要小于段表长度,段内地址要小于段长才能进行地址变换,否则会产生越界中断

  2. 越权保护

    设置存取控制字段来实现对各段的保护

分段和分页的主要区别

  1. 页是信息的物理单位,对于用户来说分页不是可见的,段是信息的逻辑单位是程序逻辑上的要求,对用户来说段是可见的

  2. 页的大小是固定的,由系统决定;段的大小是不固定的,由用户程序本身决定

  3. 从用户角度来看分页的地址空间是一维的,段的地址空间是二维的

    ❓ 为什么

    因为页的大小是固定的,根据给定一个地址就能算出页号和页内偏移量进行定位

    而分段管理必须给出一个段号找到始址然后再根据段内偏移量进行定位,所以说对用户来说段的地址是二维的

段页式存储管理方式

基本思想

内存分成大小相同的块,每个程序地址空间按照逻辑关系分成若干段,并为每个段赋予一个段名,每段可以独立从0编址,每段按内存块大小分成页

在这里插入图片描述

地址结构

在这里插入图片描述

地址变换

在这里插入图片描述

学习资料 :操作系统 第四版 刘振鹏 张明 王煜著

Guess you like

Origin blog.csdn.net/qq_51088445/article/details/122279109