存储器抽象
无抽象
最简单的存储器抽象就是无抽象,即进程直接访问物理内存地址。主要有一下两个问题:
- 如果一个进程可以访问内存中的每个字节,很容易破坏操作系统。
- 难以同时运行多个进程。多个进程可能会同时修改同一个内存地址,造成进程的崩溃。
地址空间
地址空间是对内存的一种抽象,类似进程是对CPU的抽象。地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间(除了特殊情况下进程需要共享他们的地址空间)。
地址空间的一种简单实现方式
基于基址寄存器和界限寄存器,可以实现地址空间。也就是使一个程序中的地址20和另一个程序的地址20指向不同的物理地址。
具体地,当一个进程运行时,程序的启示物理地址转载到基址寄存器,程序的长度装在到界限寄存器。每次进程访问内存时,例如取一条指令或者读或写一个数据字,cpu硬件会把地址发送到内存总线前,自动把基址值加到进程发出的地址上。同时会检查程序发出的值是不是大于等于界限寄存器的值,如果大于说明访问了其他地址,会产生错误并终止访问。
基于基址寄存器和界限寄存器的缺点为,每次访问内存都需要进行加法和比较运算。比较可以做得很快,但是加法由于进位传递的时间问题,在没有使用特殊电路的情况下会显得很慢。例如执行一条指令需要花费1ns,那计算内存地址的时间需要小于1ns,例如0.2ns。
解决内存不足的两种策略
进程所需的RAM数量总和通常远远超过存储器能够支持的范围,两种处理内存不够用的策略包括交换技术和虚拟内存。
交换技术-Swapping
交换技术,把一个进程完整调入内存(包括进程的代码段、数据段和堆栈),使该进程运行一段时间,然后把它换回磁盘。空闲进程主要存储在磁盘上,所以当他们不运行时就不会暂用内存。
主要问题:
- 交换在内存中可能产生多个空闲区。
- 由于进程可能在运行时可以分配内存,创建或者换入进程时需要分配多大的内存是不确定的。
- 将进程换到磁盘的速度慢。例如SATA盘峰值传输速度为100MB/s,那么换出一个1GB的程序至少需要10s,并且还需要10s才能将另一个1GB的程序换入。
空闲内存管理的两种方式:
- 基于位图进行存储管理
- 基于链表进行存储管理
虚拟内存-Virtual Memory
ToBeContinued…