无存储器管理的缺点
- 用户程序可以寻址内存中的每个字节,容易破坏操作系统
- 难以同时运行多个程序,因为都会采用绝对物理地址,类似跳转指令在程序装载后,会运行到意想不到的地址去。
要使多个程序同时处于内存中并且不互相影响,需要解决两个问题:保护和重定位
地址空间
要解决上述问题,先引入地址空间的概念。
地址空间概念:一个进程可用于寻址内存的一套地址集合
特点:每个进程都有自己的地址空间
例如,程序①的地址28对应的物理地址和程序②的地址28对应的物理地址不一致
动态重定位
利用每个程序拥有自己的地址空间,将不同的程序映射到不同的物理内存,这就叫动态重定位
具体实现方式是采用基址寄存器和界限寄存器,这种方法的缺点在于,每次访问内存都需要做加法和比较运算,加法运算由于进位传递,会十分消耗时间
处理内存超载的方法
所有进程所需的RAM数量通常是会超过内存大小,所以内存超载是很常见的现象,有两种解决方法:交换技术和虚拟内存
交换:把进程完整地调入内存中运行一段时间,然后再把它存回到磁盘。(或者周期性唤醒以完成相关工作)
虚拟内存:把进程部分调入内存中运行
虚拟内存
每个程序有自己的地址空间,该空间被分割为页(page),每页有连续的地址范围。
当程序引用到一部分在物理内存中的地址空间时,由硬件立即执行必要的映射。
当程序引用到一部分不在物理内存的地址空间时,由操作系统将缺失的部分装入物理内存并重新执行失败的指令
跟踪内存使用的方法
位图和空闲区链表
位图:将内存划分为分配单元,每个分配单元对应位图的一位。0表示空闲,1表示占用
当需要把占用k个分配单元的进程调入内存时,先搜索位图,找到有k个连续0的串,而查找的这个过程是比较耗时的操作,这是位图的缺点。
空闲区链表:维护一个链表,该链表记录了已分配内存段和未分配内存段,通常采用双向链表