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