现代操作系统学习(3)——存储管理
上周学习的进程搞的我头皮发麻,太多概念了,这周的存储管理就相对轻松很多了
博客写到一半。。。我忘了保存了。。。只有刚开始写的一点点的初稿。很难受= =!
无存储器抽象
最简单的存储器抽象就是根本没有抽象,每一个程序都直接访问物理内存。
即使存储器模型就是物理内存,还是存在一些可行项的。图3-1展示了三种变体。
第一种是操作系统位于RAM底部,用在以前的大型机和小型计算机中,现在很少使用
第二种是操作系统位于内存顶端的ROM中,用于一些掌上电脑和嵌入式系统中
第三种是设备驱动程序位于顶端的ROM中,操作系统的其他部分在RAM底部,用于早期的个人计算机。
第一种和第三种的缺点是用户程序出现的错误可能摧毁整个系统。这三种通常情况下,同一时刻只能运行一个程序。
不使用抽象的情况下运行多道程序
IBM360的解决方案是内存被划分为2KB的块,每个块被分配一个四位的保护键。这种的缺陷是使用绝对地址寻址,会产生覆盖
存储器抽象:地址空间
把物理内存直接暴露给程序会带来以下两个问题:第一,如果用户程序可以寻址内存的每个字节。它们就可以很容易地破坏操作系统,即使只有一个用户进程运行的情况下,这个问题也是存在的。第二,如果使用这种模型,想同时运行多个程序是很困难的。
地址空间的概念
要保证多个应用程序在内存中并且不相互影响,需要解决两个问题:保护和重定位。一个解决方案是创造一个新的内存抽象——地址空间。就像进程的概念创造了一类抽象的CPU以运行程序一样,地址空间为内存创造了一种抽象的内存。地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他程序的地址空间(除了在一些特殊情况下内存需要共享他们的地址空间外)
比较难的是给每个程序一个地址空间,使得一个程序的地址28所对应的物理地址和另一个程序中地址28对应的物理地址不同,下面是一个简单的解决方案。
基址寄存器和界限寄存器
交换技术
内存并不足以将所有的程序都置入内存,有两种处理内存超载的通用方法,最简单的策略是交换(swapping)技术,即把一个进程完整调入内存,使该程序运行一段时间再把它存回磁盘。
空闲内存管理
有两种方式跟踪内存的使用情况:位图和空闲链表
使用位图的存储管理
使用链表的存储管理
使用链表时有几种为进程分配内存的算法,还是挺重要的
虚拟内存
尽管基址寄存器和界限寄存器可以用于创建地址空间的抽象,但还是有另一个问题需要解决——管理软件的膨胀。
也就是需要运行的程序往往大到内存无法容纳,而且必然要支持多个程序同时运行,即使内存可以支持单独一个程序的需求,但是从总体来看,它们仍然超出了内存大小,如果采用交换技术,一个典型的SATA磁盘的峰值传输率最高达到100M/S,这意味着需要10S才能换出一个1GB的程序以及再花10S把它放进去。
分页
页表
加速分页
在任何分页式系统中都需要考虑两个问题:
1:虚拟地址到物理地址的映射必须快
2:虚拟空间很大,页表也会很大
转换检测缓冲区
有了分页后,执行指令时,因为要访问页表要访问多次内存,这种情况下效率很低。而计算机设计者已经意识到这个问题,并找到了一种解决方案,这种方案基于下面这种现象:大多数程序总是对少量页面进行多次访问,因此只有很少的页表项会被反复读取,而其他的页表项很少被读取。
针对大内存的页表
上面的散列的概念我还没有搞清楚- -、
页面置换算法
算法比较多,最下面有我参考书里面的一个小结,需要的可以去看看
最优置换算法
最近未使用页面置换算法
先进先出页面置换算法
第二次机会页面置换算法
时钟页面置换算法
最近最少使用算法
软件模拟LRU
工作集页面置换算法
工作集时钟页面置换算法
页面置换算法小结
分页系统的设计问题
全局分配和局部分配
本节讨论的问题是如何在相互竞争的可执行程序间分配内存
重点部分
页面大小
分离指令空间和数据空间
共享页面
共享库
内存映射文件
清除策略
虚拟内存接口
缺页中断处理
指令备份
锁定内存中的页面
后备存储
策略与机制分离