现代操作系统 -内存管理

文章介绍了操作系统中内存管理的几种方法,包括无存储器抽象时的单进程运行,地址空间的概念以及基址寄存器和界限寄存器的作用。重点讨论了虚拟内存,它通过分页技术将程序的虚拟地址映射到物理内存,解决了多进程内存管理和效率问题。此外,文章还提到了页面置换算法,如LRU和工作集时钟算法,并概述了内存管理的相关操作,如创建、执行、中断和退出时的工作。
摘要由CSDN通过智能技术生成

无存储器抽象

每个程序都直接访问物理内存, 按这种方式组织系统时, 通常同一个时刻只有一个进程运行, 运行程序是会把程序从磁盘复制到内存中执行

在不适用储存器抽象的情况下运行多个程序也是可行的, 不过要处理要两个程序同时装进内存中, 物理地址改变的问题, 比如b程序在a程序内存上, 那么b程序需要加上a程序的内存地址做为offset, 比如a是0-100, 那么b的其实地址应该是101, 不是0

一种储存器抽象: 地址空间

把物理内存暴露的方法会带来问题

  1. 容易被用户破坏系统, 因为user基本是直接控制了内存
  2. 难以同时运行多个程序

地址空间

一个进程可用于寻址内存的一套地址集合, 每个进程都有一个自己的地址空间, 并且这个地址空间独立于其他进程的地址空间 (除了特殊情况下进程需要共享他们地址)

地址空间概念是非常通用的, 比如.com也是个地址空间, 代表了网络域名的一个集合

基址寄存器和界限寄存器

就是个内存重定位的做法, 但是每次访问内存都需要进行加法运算

交换技术

当运行的进程变多的时候, 内存就不够用了, 处理这种超载一个通用的一个策略就是交换技术, 即把一个进程完整调入内存, 使该进程运行一段时间, 在把它存回硬盘. 另外一个策略就是虚拟内存, 使程序只有一部分别调入内存的情况下运行

空闲内存管理

  1. 使用位图的存储管理
  2. 使用链表的存储管理

虚拟内存

基址寄存器和界限寄存器虽然可以用于创建地址空间的抽象, 但是软件膨胀问题还要解决, 在运行多个进程的时候, 内存不能满足大小的需求. 交互技术虽然可行, 但是交换磁盘和内存的数据非常花费时间

虚拟内存的思想是, 每个程序拥有自己的地址空间, 把这个空间被分割成多个块, 每一块是一个页面(page), 并不是所有也都要在内存中才能运行程序, 当程序引用到一部分在物理内存的地址空间时, 由硬件执行必要的映射.

虚拟内存使得整个地址空间可以用相对较小的单元映射到物理内存, 而不是为正文段和数据段分别做重定位

虚拟内存适合多进程, 因为每个程序片能够同时保存在内存中

所以, 虚拟内存的实现, 是讲虚拟地址空间分解成页, 并将每一页映射到物理内存的某个page frame

分页 paging

程序产生的地址是虚拟地址, 构成了一个虚拟空间, 这些虚拟地址不是直接被送到内存总线上, 而是被送到内存管理单元(MMU), MMU把虚拟地址映射成物理地址

虚拟地址的page映射到物理地址中是page frame

当虚拟地址与物理地址没有映射时候, 程序调用虚拟地址会产生page fault, OS需要把disk的内容写入内存, 然后通知程序其内容

页表 page table

从数学角度来说, 页表是一个函数, 它的参数是虚拟页号, 结果是物理页号

页表项结构

  • 保护位
  • 修改/访问位
  • 脏位

加速分页过程

需要考虑的问题

  1. 虚拟地址到物理地址的映射需要快
  2. 如果虚拟地址空间大, 页表也会很大

轮换检测缓存区

cache的使用, 把虚拟地址直接映射到物理地址, 而不需要访问页表

针对大内存的页表

引用多级页表可以避免把全部页表一直保存在内存中

页面置换算法

空间不足的时候, 需要从内存选择一个页面将其置换出内存, 这些算法有

  1. 最优页面置算法, 就是把最近都不会被用到的页面置换出来, 但是无法实现, 因为OS无法知道各个页面下一次什么时侯被访问
  2. 最近未使用页面置换算法, 就是把没有被访问, 没有被修改的page先置换出去
  3. 先进新出页面置换算法
  4. 第二次机会页面算法, 如果要淘汰的page Read位是1, 则设成0, 不淘汰 再给一次机会
  5. 时钟页面置换算法, 把页面保存环形链表中, 如果R位是0则淘汰, 1则设成0
  6. 最近最少使用算法LRU, 难以实现
  7. 老化算法, 是LRU的改进, 每个页面都被赋予一个"老化"计数器, 每当页面被访问时, 计数器就跟新. 通过计数器就能知道那些页面是少使用的
  8. 工作集页面置换算法, 进程当前使用的页面的集合是工作集, 跟最近未使用方法类似, 只是把page换成了工作集
  9. 工作集时钟页面置换算法, 跟时钟页面置换算法, 只是把page换成工作集. 总结来说, 工作集时钟页面置换算法是对时钟页面置换算法的改进, 可以更好地模拟程序的局部性原理, 并且能够更有效地管理计算机的内存. 然而, 由于需要维护额外的工作集位, 工作集时钟页面置换算法的复杂性和开销也相应地增大了

分页系统中的设计问题

共享页面

写时复制: fork之后, 父子空间共享, 然后当写的时候再分离共享

共享库

就是不同程序都可以连接同一个库文件, 在Windows中, 这个叫DLL动态链接库

内存映射文件

把文件映射到内存中

清除策略

守护进程定期清理内存, 提供空闲的页面, 如果被清理的页面被修改, 则将它写入磁盘后清理

有关实现的问题

与page相关工作

创建时: 准备空间

执行时: 必须为新进程重置MMU, 刷新TLB, 以清除以前的进程遗留痕迹

中断时: 计算时哪个虚拟地址造成中断, 找到合适的page frame储存新页面, 必要时还要置换老的页面, 把所需的页面读入page frame, 最后, 还要回退pc, 使pc指向引起缺页中断的指令, 并重新执行改指令

退出时: 释放进程也变, 页面和页面在磁盘上的空间

小结

内存管理最简单的就是根本没有交换和分页的, 接下来就是带交换技术的内存管理, 如果一个进程没有空间可以用, 它将会被交换到磁盘上.

现代计算机用的是虚拟内存, 每一个进程地地址空间被划分为同等大小的page, page可以被放入内存任何可以使用的page frame内, 有多种页面置换的算法, 其中比较好的是老化算法和工作集时钟算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值