存储管理
存储器管理的对象是主存,也称内存。它的主要功能包括分配和回收主存空间、提高主存利用率、扩充主存、对主存信息实现有效保护。
存储器是计算机系统的重要资源,虽然存储器的容量迅速增加,但软件的需求也同样在急剧膨胀,存储器依然是紧俏资源。存储器管理是操作系统最重要的部分。
存储管理概述
存储体系结构
-
1.高速缓存: L1数百KB、L2数MB 非常快速、昂过、断电消失。
2.内存: 数G、中等速度、中等价格、断电消失。
3.磁盘: 几十GB到TB、低速、低廉、断电仍保存。 -
内存空间:是由存储单元(字节或字)组成的一维连续的地址空间。内存空间用来存放当前正在运行程序的代码及数据,是程序中指令本身地址所指的存储器。
-
内存的要求:能直接存取,访问速度尽量快,应与CPU取指令的速度相匹配,足够大,能装下当前运行的程序和数据。
-
内存分为:
系统区:用于存放操作系统。
用户区:用于装入并存放用户程序和数据。
存储器管理的目的
- 充分利用内存,为多道程序并发执行提供存储基础。
- 尽可能方便用户使用。(自动装入用户程序,用户程序中不必考虑硬件细节)。
- 能够解决程序空间比实际内存空间大的问题。
- 程序在执行时可以动态伸缩。
- 存储保护与安全。
- 共享与通信。
- 了解有关资源的使用情况。
- 性能高、时空开销小。
存储器管理的内容
1)内存空间的管理、分配和回收。
2)存储共享。
3)存储保护与安全。
4)内存“扩充”。(通过虚拟存储技术实现。)
虚拟存储技术:所谓虚拟存储,就是把内存与外存有机的结合起来使用,从而得到一个容量很大的“内存”,这就称之为虚拟存储。 可以说,存储网络平台的综合性能的优劣,将直接影响到整个系统的正常运行。
对用户程序的处理过程
创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:
编译:由编译程序将用户源代码编译成若干个目标模块。
链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块。
装入:由装入程序将装入模块装入内存运行。
程序的链接有以下三种方式:
静态链接:在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开。
装入时动态链接:将用户源程序编译后所得到的一组目标模块,在装入内存时,釆用边装入边链接的链接方式。
运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行的链接。其优点是便于修改和更新,便于实现对目标模块的共享。
内存的装入模块在装入内存时,同样有以下三种方式:
1)绝对装入。在编译时,如果知道程序将驻留在内存的某个位置,编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际内存地址完全相同,故不需对程序和数据的地址进行修改。
绝对装入方式只适用于单道程序环境。另外,程序中所使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中釆用的是符号地址,编译或汇编时再转换为绝对地址。
2)可重定位装入。在多道程序环境下,多个目标模块的起始地址通常都是从0开始,程序中的其他地址都是相对于起始地址的,此时应釆用可重定位装入方式。根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对目标程序中指令和数据的修改过程称为重定位,地址变换通常是在装入时一次完成的,所以又称为静态重定位。
静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。此外,作业一旦进入内存后,在整个运行期间不能在内存中移动,也不能再申请内存空间。
3) 动态运行时装入,也称为动态重定位,程序在内存中如果发生移动,就需要釆用动态的装入方式。装入程序在把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。动态重定位的特点是可以将程序分配到不连续的存储区中;在程序运行之前可以只装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
页式存储管理
早期存储管理存在的缺点:
①程序需要一次性全部装入内存。
②随着多个程序的启动与结束,内存会出现碎片。
③碎片无法利用,通过紧凑方式合并,但代价大。
所以引入页式存储管理。
基本思想
把内存物理空间划分成大小相等的若干区域,一个区域为一块。
把逻辑地址划分为大小相等的若干项,页大小与块大小相等。
物理地址和逻辑地址
物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地址是明确的、最终用在总线上的编号,不必转换,不必分页,也没有特权级检查(no translation, no paging, no privilege checks)。
逻辑地址:CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干。
管理
- 建立页表:系统为每个进程都建立了一个页表。
- 空块管理(位示图或空闲块链)。
- 内存的分配与回收。
- 页面大小的选择(2的幂)
页式管理的优点:解决了碎片问题、便于管理、提高内存利用率 缺点:不易实现共享、不便于动态连接等