一,虚拟内存的三条总结
1,将内存看做硬盘的高速缓存
内存中只保存程序的活动区域(数据)
根据需要在硬盘和内存之间传递数据
2,为每个进程提供一个一致的地址空间
3,保护每个进程的地址空间不被其他进程破坏
每个进程都有一块独立的地址空间,那么进程之间是隔离的。但是我们只有一块物理上的内存,怎么隔离呢?这就是虚拟内存的一个重要目标
二,内存管理的要求
1.两种操作系统的调度
批处理:
程序顺序执行
程序依次装入内存运行
一个新装入的程序会完全覆盖老的程序
分时系统
多个程序并发执行
要把尽可能多的程序装入内存
程序在内存中要区分开
2,如何在内存中装入多个程序?
一个程序使用的内存必须是连续的吗?
如果使用的是物理内存那必须是连续的。
3,直接使用物理地址的问题
下面有两个程序,程序1的地址是 0~1000,程序2的地址是 1000以上
上面两个程序往内存中写值时,都用到了 movl eax,(100),这就会发生冲突,导致程序出错。
如果想用物理地址,有两种解决办法:
一种:在数据装载入内存时,需要修改程序2的地址,因为程序2的起始地址是1000,所以要加上1000。但是这种方法很难实现
另一种:在访问内存时,都不用物理地址,用逻辑地址。
4.逻辑地址
程序代码在编译成机器指令后,程序在运行时并不是用真正的物理地址做事的,而是使用逻辑地址。当程序在访问逻辑地址时,CPU内部有一个内存管理单元,内存管理单元里有一个基址寄存器,基址寄存器保存了每个程序的开始地址。比如程序1的开始地址是0,那么程序1的基址寄存器就是0,程序2的基址寄存器就是1000。所以基址寄存器在你切换程序时在变化。
5,程序太大怎么办?
程序在执行时,刚开始只会Load一小部分(比如一个程序100M,但是真正装入内存可能只有1M),但是会给程序建立一个页表。
每个进程都有一套独立的地址空间。把地址空间进行分页。
虚拟地址页和物理内存页要对应起来。
6,CPU对地址进行转换
分页的细节
算法一:FIFO(先进先出)
算法二:LRU(最近最少使用)
算法三:Clock算法(LRU算法近似实现),操作系统实现的
7,分段
8,段页结合
9,Linux是如何组织虚拟存储器的