【操作系统】内存管理(1)

内存

1. 内存是什么?有什么作用?

内存是用来存放数据的。程序执行之前需要先放到内存中才能被CPU处理,进而缓和CPU和硬盘之间的速度矛盾。

2. 逻辑地址和物理地址的理解?

  • 逻辑地址可以理解为相对地址
  • 物理地址可以理解为绝对地址

3. 装入的三种方式是什么?

装入: 可执行文件需要被装载到内存以后才能被CPU执行,而该装载的过程就叫装入

  • 绝对装入: 在编译的时候,如果知道程序将放在内存的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。

⭐️ 只是适用于单道程序环境

  • 静态重定位: 又称为可重定位装入。编译链接之后的装入模块的地址都是从0开始,指令中使用到的地址都是相对于起始地址而言的逻辑地址。随后根据内存加载情况,将装入模块装入到内存适当的位置并进行重定位形成物理地址

⭐️ 装入内存的时候就必须要分配所要求的全部内存空间
⭐️ 装入模块需要物理地址连续

  • 动态重定位: 又称为动态运行时装入。编译连接后装入模块的地址都是从0开始,装入程序把装入模块装入内存之后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正执行的时候才进行的。因此装入内存后的地址依然是逻辑地址,只不过需要一个重定位寄存器记录进程/作业装入内存中时的起始地址。

⭐️ 可将程序分配到不连续的存储区中。
⭐️ 在程序运行之前只需要装入部分代码即可运行,然后运行期间根据需要申请动态内存分配
⭐️ 便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
⭐️ 目前操作系统都采用动态重定位装入方式

  • 编译链接

4. 链接的三种方式?

  • 静态链接: 在程序运行之前,先将各目标模块即它们所需要的库函数链接成一个完整的可执行文件(装入模块),之后不再拆开。
  • 装入时动态链接: 将各个目标模块装入内存时,边装入边链接的链接的方式。
  • 运行时动态链接: 在程序执行中需要该目标模块时才对它进行连接。优点是便于修改和更新,便于实现对目标模块的共享。

5. 内存管理需要实现什么功能?

  • 操作系统负责内存空间的分配和回收(连续分配管理方式):
  • 单一连续分配: 内存被分为系统区用户区。系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据。内存中只能有一道用户程序,用户程序独占整个用户空间。
  • 固定分区分配: 为了能在内存中装入多道程序,且这些程序之间又不会相互干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业。内存区可以分为等分以及不等分

⭐️ 单一连续分配和固定分区分配都会产生内存碎片。

  • 动态分区分配: 又可被称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态建立分区,并使得分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。
  1. 系统要用什么样的数据结构记录内存的使用情况?
    ✅ 采用空闲分区表或者空闲分区链
  2. 当内存当中有多个空闲分区,该如何选择?
    ✅ 按照一定的动态分区分配算法,从空闲分区表(链)中选出一个分区分配给该作业或者进程。

⭐️ 首次适应算法: 每次从低地址开始查找,找到第一个能满足大小的空闲分区。
⭐️ 最佳适应算法: 因为动态分区分配是一种连续分配方式,各个进程分配的空间必须是连续的一整片区域。所以为了保障大进程有连续的大片空间,则优先给其他进程分配更小的空闲区
⭐️ 最坏适应算法: 为了解决最佳适应算法产生太多外部碎片的问题,可以在每次分配的时候优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小。
⭐️ 邻近适应算法: 首次适应算法每次都是从低地址从链头开始查找,这可能导致低地址部分出现很多小的空闲分区,因此也增加了查找的开销。所以直接从上一次查找结束的地方开始检索,提高分配效率。
动态分配算法

  1. 如何进行分区的分配与回收操作?
    ✅ 需要根据动态分区分配算法进行内存分配,回收的时候判断空闲分区是否相邻,若是则合并,反之则在表项或者链项中多增加一个空闲分区。

⭐️ 动态分区分配没有内部碎片,但是有外部碎片。解决外部碎片可以采用紧凑技术,将进程挪位腾出外部碎片。

  • 操作系统负责内存空间的分配和回收(离散分配管理方式):
  • 基本分页存储管理: 内存空间分为一个个大小相等的分区,每个分区就是一个页框(页帧/内存块/物理块/物理页面),且给每个分区起个编号,即页框号。进程的逻辑地址空间也会被分成与页框大小相等的一个个部分,并存储到内存中的各个位置,每个部分称为或者页面进程空间的页和内存空间的页框不是同一个概念

🐦 操作系统管理模式: 操作系统需要为每个进程建立一张页表来记录进程的每个页面在内存中存放的位置,其通常保存在PCB进程控制块当中
进程逻辑地址空间-页表-内存
🐦 页表数据结构: 页号是隐含的,不占用存储空间。块号需要占用至少3Byte空间
🐦 地址转换: 1️⃣ 页号=逻辑地址/页面长度(取除法的整数部分);2️⃣页内偏移量=逻辑地址%页面长度(取除法的余数部分);3️⃣通过页号查询页表得到页面在内存中的起始地址;4️⃣实际物理地址=页面在内存中的起始地址+页内偏移量

🖕 若有K位表示”页内偏移量“,则说明系统中有一个页面的大小是 2 k 2^k 2k个内存单元。(前提:页面大小是2的k次幂)
🖕 若有M位表示”页号“,则说明在该系统中,一个进程最多允许有 2 M 2^M 2M个页面。(前提:页面大小是2的k次幂)

  • 操作系统需要提供某种技术从逻辑上对内存空间进行扩充:
  • 覆盖技术:程序分为多个段(多个模块),常用的段常驻内存,不常用的段在需要时调入内存。其中将内存分为一个固定区若干个覆盖区(已淘汰)
  • 交换技术: 内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存,即进程在内存与磁盘间动态调度
  1. 应该在外存什么位置保存被换出的进程?
    ✅ 具有对换功能的操作系统,通常将外存空间分为文件区和对换区文件区主要用于存放文件追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式对换区占用空间小,被换出进程的数据就存放在对换区,其追求换入换出的速度,因此通常采用连续分配方式其I/O速度比文件区快
  2. 什么时候应该交换?
    ✅ 交换通常发生在内存紧张的时候,而系统负荷降低就暂停。
  3. 应该换出哪些进程?
    ✅ 优先换出阻塞进程或者是优先级较低的进程,这里需要注意优先级较低的进程发生饥饿现象
  • ps: PCB会常驻内存而不会被交换到外存里。
  • 操作系统需要提供地址转换功能,负责程序的逻辑地址和物理地址的转换:

三种装入方式实现地址转换功能

  • 操作系统需要提供内存保护功能,保证各个进程在各自存储空间内运行而互不干扰:

⭐️ 在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程指令要访问某个地址时,CPU检查是否越界。
⭐️ 采用重定位寄存器(又称为基地址寄存器)界地址寄存器(又称为限长寄存器)进行越界检查。重定位寄存器存放进程起始物理地址,界地址寄存器存放进程最大逻辑地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值