计算机系统中的存储器可以分为两类:内存储器(简称内存)和外存储器(简称外存)。处理器可以直接访问内存,但不能直接访问内存。CPU要通过启动相应的输入/输出设备后才能使内存和外存交换信息。
内存管理是操作系统中重要功能之一。
基本概念
存储体系
存储设备的速度仍然明显慢于同一级别的中央处理器的速度。任何一种存储设备都无法在速度与容量两个方面同时满足用户的需求。
- 少量的、非常快速、昂贵、内存易变的高速缓冲器Cache,通常是有KB的数量级。
- 若干兆字节、中等速度、中等价格、内容易变的内存RAM,通常是千MB的数量级。
- 低速、廉价、内容不一边的外存(磁盘),通常是百至千GB的数量级。
存储管理的任务
任何程序和数据以及各种控制用的数据结构都必须占用一定的存储空间,因此,存储空间直接影响系统性能。
内存空间:由存储单元(子节或字)组成的一维连续的地址空间,内存空间用来存放当前正在运行程序的代码及数据,是程序中指令本身地址所指的亦即程序计数器所指的存储空间。
- 系统区:用以存放操作系统常驻内存的部分,用户不能占用这部分空间。
- 用户区:分配给用户使用,用于装入并存放用户程序和数据,信息随时都会发生变化,
存储管理的实质就是管理供用户使用的那部分空间。
内存管理问题的主要包括:内存管理方法、内存的分配和释放算法、虚拟存储器的管理、控制内存和外存之间的数据流动方法、地址交换技术和内存数据保护与共享技术等。
单道、单用户:在一个区域内存放系统软件,如操作系统本身,而另外一个区域放置用户程序。
多道、多用户系统:为了提高系统的的利用率,需要将内存划分更多的区域,以便支持多道程序。
- 充分利用内存,为多道程序并发执行提供内存基础。
- 尽可能方便用户使用:
- 操作西戎自动装入用户程序。
- 用户程序中不必考虑硬件细节。
- 系统能够解决程序空间比内存实际内存空间大的问题。
- 程序的长度在执行时可以动态伸缩。
- 内存存取速度快。
- 存储保护与安全。
- 共享与通讯。
- 及时了解有关资源的使用状况。
- 实现的性能和代价合理。
在操作系统中存储管理的主要任务。
内存的回收与分配
一个有效的存储分配机制,应对用户提出的需求予以快速响应,为之分配相应的存储空间。在用户程序不再需要它的同时及时回收,以供其他用户使用。
功能:
- 记住每个存储区的状态。
- 实施分配。
- 回收。
为了实现上述功能,必须引入分配表格,统称为内存分配表,其组织方式包括:
- 位示图表示法:用一位(Bit)表示一个空闲页面(0表示空闲,1表示占用)。
- 空闲页面表:包括首页面号和空闲页面的个数,连续若干个页面作为一组登记在表中。
- 空闲块表: 空闲块首址和空闲块长度,没有记录的区域即为进程所占用。
内存分配的两种方式:
- 静态分配:程序要求的内存空间是在目标模块连续装入内存时确定并分配的,并且在程序运行过程中不允许再申请或者在内存中“搬家“,即分配工作是在程序运行前一次性完成。
- 动态分配:程序要求的基本内存空间是在目标模块转入时确定并分配的,但是在程序运行过程中,允许申请附加的内存空间或在内存中”搬家“,即分配工作是在程序运行前即运行过程中逐步完成的。
动态存储分配具有较大的灵活性:
- 它不需要一个程序的全部信息进入内存后才可以运行,而是在程序运行中需要时系统自动将其调入内存。
- 程序当前暂不使用的信息可以不进入内存,这对提高内存的利用率有好处。
存储共享
存储共享是指两个或多个进程共用内存中的相同区域,这样不仅能使多道程序动态的共享内存,提高内存利用率,而且还能共享内存中某个区域的信息。
内容包括:代码共享和数据共享,特别是代码共享要求代码必须是纯代码。
- 一是通过代码共享节省内存空间,提高内存利用率。
- 一是通过数据共享实现进程通信。
存储保护
为多个程序共享内存提供保障,是在内存中的各个程序只能访问其自己的区域,避免各程序间相互干扰。
存储保护通常是需要有硬件的支持,并由软件配合实现。
- 保护系统程序区不被用户有意或者无意的侵犯。
- 不允许用户程序读写不属于自己地址空间的数据,如系统区地址空间、其他用户程序的地址空间。
(1)地址越界保护
每个进程都具有其相对独立的进程空间,如果进程在运行是所产生的地址超出其地址空间,则发生地址越界。地址越界可能侵犯其他进程的空间,影响其他进程的正常运行;也可能侵犯操作系统空间,导致系统混乱。对程序产生的地址必须加以检查,发生越界时产生中断,由操作系统进行相应处理。
(2)权限保护
对于多个进程贡献的公共区域,每个进程都有自己的访问权限。
- 对属于自己的区域的信息,可读可写。
- 对公共区域中允许共享的信息或获得授权可使用的信息,可读而不可修改。
- 对未获授权使用的信息。不可读、不可写。
当发生地址越界或者非法操作的时候,由硬件产生中断,进入操作系统处理。
”扩充“内存容量
在硬件支持下,软件、硬件相互协作,将内存和外存结合起来统一使用。
借助虚拟存储技术或其他交换技术在逻辑上扩充内存容量,亦即为用户提供比内存物理空间大的多的地址空间,使得用户感受它的程序是在一个大的存储器中运行。
地址转换
存储器以字节(1B=8个二进制位)为编址单位,每个字节都有一个地址与其对应。假定存储器的容量为n个字节,其地址编号为0,1,2,3,…,n-1 。这些地址称为内存的“绝对地址”,与绝对地址对应的内存空间称为“物理地址空间”。
用户程序中使用的地址称为“逻辑地址”,与逻辑地址对应的存储空间称之为“逻辑地址空间”。
地址重定位
当用户程序进入计算机系统请求执行时,存储管理要为他分配合适的内存空间,这个分配到的内存空间可能是从某个单元开始的一组连续的地址空间。该地址空间的起始地址是不固定的,而且逻辑地址与分到的内存地址空间的绝对地址经常不一致。每个逻辑地址在内存中也没有一个固定的绝对地址与之对应。
为了保证程序的正常执行,必须根据分配给程序的内存区域对程序中指令和数据的存放地址进行重定位,即要把逻辑地址转换成为绝对地址。
把逻辑地址转换成绝对地址的工作称为“地址重定位”或“地址转换”,又称“地址映射”。重定位的方式有“静态重定位”和“动态重定位”两种。
静态重定位
由于地址转换工作是在程序开始执行前集中完成的,所以在程序执行过程中就无须再进行地址转换工作。称为“静态重定位”。
动态重定位
在装入程序时,不进行地址转换,而是直接把程序装到分配的内存区域中,在程序执行过程中,每当执行一条指令时都由硬件的地址转换机构将指令中的逻辑地址转换成绝对地址。称为“动态重定位”。
动态重定位由软件和硬件互相配合来实现。硬件要有一个地址转换机构,该机构可由一个基址寄存器和一个地址转换线路组成。
存储管理为程序分配内存区域后,装入程序把程序直接装到所分配的区域中,并把内存区域的起始地址存入相应程序进程的进程控制块中。当程序进程被调度占用处理器时,随同现场信息的恢复,程序所占的内存区域的起始地址也被存放到“基址寄存器”中。程序执行时,处理器每执行都会把指令中的逻辑地址与基址寄存器中的值相加得到绝对地址,然后按绝对地址访问内存。