zoukankan      html  css  js  c++  java
  • 内存管理之虚拟内存(转)

    一、虚拟内存术语

     

         虚拟内存                                           

           在存储分配机制中,尽管备用地址是主内存的一部分,它也可以被寻址。程序引用内存使用的地址与内存系统用于识别的物理地址是不同的,程序生成的地址会自动转化为机器地址。虚拟存储的大小受计算机系统寻址机制和可用的备用内存量的限制,而不受内存储位置实际数量的限制

     虚拟地址

    在虚拟内存中分配给某一位置的地址使该位置可以被访问,仿佛是主存的一部分

    虚拟地址空间

    分配给进程的虚拟存储

    地址空间

    可用于某进程的内存地址范围

    实地址

    内存中存储位置的地址

    二、分段和分页的特点(虚拟与非虚拟)

    简单分页

    虚拟分页

    简单分段

    虚拟分段

    内存被划分为固定大小的小块,成为页框

    内存被划分为固定大小的小块,成为页框

    内存未被划分

    内存未被划分

    程序被划分为页

    程序被划分为页

    由程序员给编译器指定程序段

    由程序员给编译器指定程序段

    页框内有内部碎片

    页框内有内部碎片

    没有内部碎片

    没有内部碎片

    没有外部碎片

    没有外部碎片

    有外部碎片

    有外部碎片

    操作系统必须为每个进程维护一个页表,以说明每页对应的页框

    操作系统必须为每个进程维护一个页表,以说明每页对应的页框

    操作系统必须为每个进程维护一个段表,以说明每一段的加载地址和长度

    操作系统必须为每个进程维护一个段表,以说明每一段的加载地址和长度

    操作系统必须维护一个空闲页框页表

    操作系统必须维护一个空闲页框页表

    操作系统必须维护一个内存中空闲的空洞列表

    操作系统必须维护一个内存中空闲的空洞列表

    处理器使用页号和偏移地址来计算绝对地址

    处理器使用页号和偏移地址来计算绝对地址

    处理器使用段号和偏移量计算绝对地址

    处理器使用段号和偏移量计算绝对地址

    当进程运行时所有页必须在内存中,除非使用了覆盖技术

    当进程在运行时,并不是所有页都必须在内存页框内,只是在需要时才读入页

    当进程运行时所有段必须在内存中,除非使用了覆盖技术

    当进程在运行时,并不是所有段都必须在内存,只是在需要时才读入段

     

    把一页读入内存可能需要把另外一页写到磁盘

     

    把一段读入内存可能需要把另外一段或几个段写到磁盘

    三、系统抖动

    当使用虚拟内存时,并不是把全部的进程页全部调用内存,只需要在内存中调用够用的页就可以了,当需要访问外存中的程序页时,再调用即可。这样减少了一个进程在内存中的空间,可以在主存里装入更多的进程,提高对计算机系统其他设备的利用率。但是,当页交换算法不合理时,如果一个页刚被调出内存,下面又要访问它,这样如果频繁地发生这种情况,那么处理器大部分时间都消耗在内存与外存之间的页交换上了,而不是执行指令。这种情况叫做“系统抖动”。

    四、地址转换

     1,分页系统中的地址转换

     

    分页存储管理的基本原理是:将主存空间和辅存空间分别等分为大小相等的若干页,页的大小为个字节,如(1KB),(2KB),(4KB)等,并且为每个页按顺序指定一个页号,即0页、1页、2页、…。为了叙述方便,把主存的页(物理页或绝对页)称为页面。例如,若主存空间为8KB,辅存空间为16KB,页的大小为1KB,则主存空间可分为8个页面,其页面号为0~7;辅存空间可分为16个页,其页号为0~15。当程序运行时,以“页”为单位进行地址映射,即操作系统以页为单位把逻辑页从辅存调入主存,存放在物理页面上,供CPU执行。在分页存储管理机制中,把逻辑页对应的逻辑地址称为线性地址。

     在分页存储管理中,需要解决的关键问题是:选择哪一个物理页存放调入的逻辑页?如何将线性地址转换为物理地址?为了解决这些问题,系统为每一个页建立一个页表,保存在主存中,存放页的若干信息,如页号、容量、是否装入主存、存放在主存的哪一个页面上等。
      CPU访问某页时,首先要查找页表,判断要访问的页是否在主存,若在主存为命中,否则为未命中。然后将未命中的页按照某种调度算法由辅存调入主存,并根据逻辑页号和存放的物理页面号的对应关系,将线性地址转换为物理地址。
      页表在存储器中的位置由页表地址寄存器定位。页表中记录的状态信息为:第1项页号指示逻辑页;第2项特征位记录该逻辑页是否装入主存,“0”表示未装入,“1”表示已装入;第3项记录该逻辑页装入主存所存放的物理页的页面号,即1号逻辑页从辅存调入主存后,存放在第7号物理页面上。
      存储单元的物理地址由页面号和页内地址两部分组成。 8KB主存的页内地址由地址线A9~A0提供,可寻址1KB的页内存储空间,地址范围为0~1 023;页面号由高3位地址线A12~A10提供,8个页面的页面号为0~7。由此可以看出,页面存储单元的物理地址为
      物理地址=页的大小×页面号+页内地址
      线性地址的确定方法与物理地址的确定方法完全相同,也是由页号和页内地址两部分组成,如图5.37(b)所示。16KB辅存空间可分为16页,页内地址由地址线A9~A0提供,其页号0~15由高4位地址线A13~A10提供。


      在进行地址转换时,由于逻辑页和物理页的大小相等,它们的页内地址是相同的,所不同的是页号,只要将线性地址的页号转换为物理地址的页面号即可。在图5.36中,给出1号逻辑页中某条指令访问数据的逻辑地址为1024×1+452=1 476,它存入主存7页面上所对应的物理地址为1 024×7+452=7 620。

     

    2,分段系统中的地址转换

    分段存储管理的基本原理是:按程序的逻辑结构,以段为单位划分,各个段的长度因程序而异。为了说明逻辑段的各种属性,系统为每一个段建立一个段表(驻留在内存),记录段的若干信息,如段号、段起点、段长度和段装入情况等。CPU通过访问段表,判断该段是否已调入主存,并完成逻辑地址与物理地址之间的转换。

      逻辑地址由段号S和段内地址W组成,段号S相当于逻辑段的段名,它表示该逻辑段的起始地址。在进行地址转换时,操作系统用S检索段表,段表中记录的信息1表明该段已调入主存,b是S段装入主存的起始地址,因此该逻辑地址对应的物理地址为b+W。
      在分段存储管理方式中,由于段的分界与程序的自然分界相对应,所以具有逻辑独立性,易于程序的编译、管理、修改和保护,也便于多道程序共享。但是,因为段的长度参差不齐,起点和终点不定,给主存空间分配带来了麻烦,容易在段间留下不能利用的“零头”,造成浪费

     

    3、段页式系统中的地址转换

     

    分页存储管理的主要特点是主存利用率高且对辅存管理容易,但模块化性能差;分段存储管理的主要特点是模块化性能好,但主存利用率不高且对辅存的管理比较困难。

    段页存储管理是将分段存储管理和分页存储管理结合起来的一种折中方案。它首先将程序按其逻辑结构划分为若干个大小不等的逻辑段,然后再将每个逻辑段划分为若干个大小相等的逻辑页。主存空间也划分为若干个同样大小的物理页。辅存和主存之间的信息调度以页为基本传送单位,每个程序段对应一个段表,每页对应一个页表。CPU访问时,段表指示每段对应的页表地址,每一段的页表确定页所在的主存空间的位置,最后与页表内地址拼接,确定CPU要访问单元的物理地址

    段页存储管理方式综合了段式管理和页式管理的优点,但需要经过两级查表才能完成地址转换,消耗时间多。

    五、置换策略

    置换算法有:最佳置换算法OPT、FIFO置换算法、最少使用页面置换算法、最近未使用页面置换算法、时钟页面置换算法等

    OPT算法是理论算法,它将不再使用的页面换出,而实际中不能预知哪个页面不再使用,但是这个算法是最优算法,可以作为评测其他算法的性能。

    FIFO算法:按照页面装进内存的时间进行置换,越老的页面最先被换出,不管该页面是否经常使用,这样就有可能导致缺页率增加,导致页面置换次数增加。

    最少使用页面置换算法:按照上次使用时间进行排序,将离上次使用时间最长的页面换出,可以采用栈的数据结构,每次页面被访问将该页面号放在栈顶。

    最近未使用页面置换算法:设置引用位R,每次调用将R=1,系统每个一段时间将R=0,当进行置换式检查哪个页面为零说明近期不会再使用,可以将其换出。

    时钟页面置换算法:采用应用为R,当R=1说明被引用过,这种方法是FIFO的改进,根据装入内存时间和是否被引用过作为标准,首先从时间最长项检查,若R=0则置换出,若为1则检查下一项并将R=0。若全部R=1,则按照FIFO方法进行置换。

    选择好置换的页面后,如何进行置换呢?

    首先判断被置换的页面是否被修改过,若没有则可以直接擦出该页框,如修改过则必须首先保存到外存中,然后再读入新页面。

    页面缓冲技术:不必先保存,因为每次都保存一个页面增加了IO操作,消耗过大。缓冲技术可以将被修改过和未修改过的页面存在缓冲区,然后对被修改过的页面进行批量保存,减少了IO操作。未修改的页面进行缓冲是为了防止在近期内被调用,不必再从外存调入内存,若在一段时间内不被调用则批量消除。

  • 相关阅读:
    POJ 1837 (DP)
    POJ 2255(分治递归)
    红球多于白球的概率(分治递归)
    HDOJ 4039 (Data_Structure)
    管道问题(prim)
    寻找给定区间内第K小的数(分治递归)
    大数加法
    1000元购物券 (分治递归)
    POJ 1308(并查集) (Data_Structure)
    我的2012年还不是世界末日
  • 原文地址:https://www.cnblogs.com/davy2013/p/3147569.html
Copyright © 2011-2022 走看看