漫谈操作系统之虚拟内存

时间:2021-10-18 00:53:37

一,虚拟内存的三条总结

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是如何组织虚拟存储器的

 漫谈操作系统之虚拟内存