zoukankan      html  css  js  c++  java
  • OS存储器管理(三) 虚拟存储器

    基本概念与实现

    1)局部性原理

    在一段时间内,运行的作业程序仅访问(涉及到)一部分作业代码,即不会涉及整个地址空间。即在一段时间间隔内,仅装入一部分代码,作业照样能正常运行

    2)虚拟存储器的引入

    作业(进程)运行时,仅装入其代码的一部分到物理内存,待需要时再装入其余部分,同时还可将不再运行的部分调出物理内存。变相地扩充了内存容量,即实现了虚拟存储器。

    虚拟内存

    ①虚拟内存将内存抽象成一个巨大的、统一的存储数组,进而将用户看到的逻辑内存与物理内存分开
    ②只要部分程序需要放在内存中就能使程序执行
    ③逻辑地址空间可以比物理地址空间大
    ④允许地址空间被多个进程共享
    ⑥允许更多进程被创建
     
     
     
    虚拟地址空间
     
     
     
    当处理器读或写入内存位置时,它会使用虚拟地址。作为读或写操作的一部分,处理器将虚拟地址转换为物理地址。通过虚拟地址访问内存有以下优势
     
    ①程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
     
    ②程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。
     
    ③不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
     
     
    进程可用的虚拟地址范围称为该进程的虚拟地址空间。每个用户模式进程都有其各自的专用虚拟地址空间。 对于 32 位进程,虚拟地址空间通常为 2 GB,范围从 0x00000000 至 0x7FFFFFFF。对于 64 位进程,虚拟地址空间为 8 TB,范围从 0x000'00000000 至 0x7FF'FFFFFFFF。一系列虚拟地址有时称为一系列“虚拟内存”
     
     
    虚拟内存可以用以下方式来实现
     
    ①覆盖与交换技术
    ②请求页式调度
    ③请求段式调度
     
     
     
    ①覆盖与交换技术
     
     
     
     
    ②请求页式调度
     

    算法思想

    *作业分页(page),内存分块(帧,frame),页与块的大小相等。*先装入部分页到物理内存,*待运行需要时再调入新的页,淘汰旧的页(交换)

    只在页面需要时,才把它们载入物理内存:需要更少的输入输出,更小的内存,更快的响应,更多的用户
     
    有效-无效位
     
    页表中的每一项与一有效无效位与之关联。(1表示该页在物理内存中,0表示不在物理内存)
    有效无效位初始为0
    当进程试图访问那些尚未调入到物理内存的页时,对标记为无效的页面的访问会产生页错误陷阱(page-fault trap,缺页)
     
     
     
     
    当有些页不在内存中时的页表:
     
     
     
     
    缺页(中断)
     
     
    1.检查进程的页表,以确定该引用是合法还是非法的地址访问。
    2.如果引用非法,那么终止进程。如果引用有效但是尚未调入页面,引起缺页中断。
    3.找到一个空闲块(从空闲块链表中取一个)
    4.调度一个磁盘操作,以便将所需要的页调入刚分配的块
    5.当磁盘读操作完成后,修改进程的内部表和页表,以表示该页已在内存中。
    6.重新开始因非法地址陷阱而中断的指令。进程现在能访问所需的页,就好像它似乎总在内存中。
     
     
    处理缺页的步骤:
     
     
     
    处理缺页的流程:
     
     
     
     
     
    那么。。没有空闲块时该如何处理?
     
    页替换: 在内存中找到一些不再使用的页,将它换出。
     
     
    页面置换
     
     
    给原有的缺页中断服务程序增加页置换,可以防止内存的过度分配(over-allocating)。
    使用修改位(脏位)来降低页传输的开销 - 只有被修改过的页才写回至磁盘。
    页置换分开了逻辑内存与物理内存 - 采用这种机制,小的物理内存能为程序员提供巨大的虚拟内存。
     
     
    页置换的基本方法
     
    1.查找所需页在磁盘上的位置;
    2.查找一空闲块;
     如果有空闲块,那么就使用它;
     如果没有空闲块,那么就使用页置换算法以选择一个“牺牲”块(victim frame);
     将“牺牲”块的内容写到磁盘上;修改页表;
    3.将所需页读入(新)空闲块;修改页表;
    4.重启用户进程;
     
     
    页面置换算法
     
    主要追求最低的缺页
     
    常用的页面置换算法模拟:见文章 页面调度算法模拟
     
     
    块分配
     
     
    每个进程需要最低数量的页

       例如:IBM 370至少需要6页用来处理SS MOVE指令

     指令是多字节指令,可能跨越2页
     要移动的字符的块和要移动到目的的区域也可能都要跨页。
     
    两种主要的分配方案:固定分配,优先级分配
     
     
    固定分配
     
    平均分配:如100块,5个进程,则给每个进程20块
    比例分配:根据进程的大小按比例分配
    特点:每个进程所分配的数量会随着多道程序的级别而有所变化;优先级进程与低优先级进程在这种分配方式下没有任何区别。
     
     
    优先级分配
     
    按优先级比例而非进程的大小来分配
     
    如果进程 Pi 产生了一个缺页,那么:
      从自身的块中选择用于替换
      从比自身优先级低的进程中选取块用于替换
     
     
    全局置换:允许一个进程从所有块集合中选择一个置换块,而不管该块是否已分配给其他进程;一个进程可以从另一个进程中取块。
    局部置换:要求每个进程仅从其自己的分配块中进行选择
     
     
     
    系统颠簸(抖动)
     
     
    抖动:进程一直忙于将页面换进换出。
    如果一个进程没有足够的页,那么缺页率就会非常高。这会导致CPU使用率低,这时OS认为必须提高多道程序的程度,因此,新的进程会加入到系统中来。
     
     
     
  • 相关阅读:
    C++构造与析构 yongmou
    坏习惯 yongmou
    Python 字符串方法
    python 列表推导式轻量级循环
    python 循环遍历字典元素
    python 短路逻辑和条件表达式
    python 迭代器
    一些关于面向对象设计的思考
    python map内建函数
    Python 列表
  • 原文地址:https://www.cnblogs.com/z941030/p/5277598.html
Copyright © 2011-2022 走看看