zoukankan      html  css  js  c++  java
  • 计算机专业课系列之四:漫谈操作系统之虚拟内存

    一,虚拟内存的三条总结

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

     

  • 相关阅读:
    flex布局下,将内容限定在容器内(如内容超出以省略号显示)的实现方案
    模板引擎——jquery.tmpl.js
    CSS布局——display: flex
    js实现实时显示当前时间的方法
    PS——规定尺寸的证件照的制作
    辅助开发——ps一键切图篇
    TCP的三次握手和四次挥手
    HTTP 协议基础入门篇总结
    频率组件
    视图组件
  • 原文地址:https://www.cnblogs.com/inspred/p/10793256.html
Copyright © 2011-2022 走看看