操作系统考研复试复习-3

第三部分:内存管理

1,为什么要进行内存管理?
因为现代计算机的程序是并发运行的,内存中存在许多进程,内存管理就是对内存中资源进行管理。
2,内存管理要做那些工作?
(1)内存空间的分配与回收
(2)地址转换
(3)内存空间的扩充
(4)各个进程存储空间的保护
3,内存空间如何分配和回收?
    1,程序从外存到内存的过程?
    编译:将代码编译为目标模块
    链接:形成完整的装入模块的逻辑地址
    分为三种方式:(1)静态链接(2)装入时动态链接(3)运行时动态链接
    装入:在装入时会发生从逻辑地址到物理地址的转换
    分为三种方式:
        (1)绝对装入:在链接时就生成物理地址(适合单道处理机)
        (2)可重定位装入【又称静态重定位】:在装入时形成物理地址(多道批处理)
        (3)动态运行时装入:在运行时形成物理地址(现代操作系统)适合运行时程序位置可能会发生的OS,需要重定位寄存器的支持。
    2,如何决定占用哪一块的内存?
    内存空间的管理:
    (1)连续分配:
        单一连续分配:单道OS,将内存分为系统区和用户区
        固定分区分配:【为了支持多道程序】分为分区大小相等和分区大小不等两种
        利用分区表说明分区
        动态分区分配:【为了提高并发性,提高内存空间的利用率】
        问题:如何记录?如何分配?如何回收?
        (1)记录:用空闲分区表或空闲分区链
        (2)分配:动态分区分配算法:首次适应,最佳适应,最坏适应,临近适应算法
    (2)非连续分配:
            逻辑地址结构决定了虚拟内存寻址空间大小
            PCB存放内存中的系统区中。
        1,页式存储管理(产生内部碎片):
        (1)通过页表来实现地址变换(逻辑地址到物理地址),页表相当于一张索引表。
        过程:逻辑地址由逻辑页号和页内偏移组成,先用页号检索页表得到相应的物理块号,物理块号与页内地址拼接形成物理地址,访问内存。
        检索的过程:首先检查逻辑地址的页号是否大于页表的长度,如果大于则产生越界中断,反之,则用页号×页表项的长度+页表起始地址(页表寄存器中记录)
        页式存储管理地址空间是一维的。
        (2)加入快表之后的地址变换:
        将页号与页表长度进行越界判断之后就根据页号查询快表(TLB),未命中,再查慢表(内存中的页表):快表需要存储页号,并且快表为相联存储器(按内容寻址)
        2,段式存储管理(产生外部碎片):
        段式存储空间管理有利于共享和信息的保护、程序的编译和动态增长,并且符合人类的编程思维。
        通过段表来实现地址变换,变换过程:
        首先比较段号与段的总数,如果大于,则产生越界中断,反之,则将段号×段表项长度,找到段号所对应的行,再比较段内地址与段长,如果大于,则产生越界中断,反之用物理段号加段内偏移地址即是物理地址。
        段式存储空间管理是二维的,不仅要给出段数,而且要给出段长(每段长度不固定)
        3,两级页表
        页表需要连续存储,当程序很大时就需要很多连续的空间去存储页表项,两级页表就是页表的页表,使页表不需要连续存储,但是增加了访存的次数(3次)。
        4,段页式存储
        为什么需要段页式存储?结合段式存储与页式存储的优点,即方便编程,又方便计算机OS的管理。
        每一个进程都有一张段表,每一个段对应一张页表,在进行地址转换时:先查段表得到该项页表的物理地址,再查页表。得到最终的物理地址。
3,内存空间的扩充——虚拟存储器
思想:将内存看作外存的高速存储器,既有内存的速度,又有外存的大小。
    1,为什么要引入虚拟内存?
    因为传统的内存管理有一次性和驻留性,需要每次将整个作业装入内存才能运行,且运行过程中不能换入换出(即时部分程序不常用),不利于大作业及多道并发工作。
    基于局部性原理:只需要把程序的一部分装入内存就可以运行,如果运行过程中,需要不在内存中的信息,再由OS将所需要的部分调入内存即可。在运行过中,把暂时不需要的内容调出内存,换入更加需要的信息。完成多次性和对换性
    2,引入虚拟内存之后需要那些变化
    虚拟内存大小?如何分配页面数?如何换入换出?如何进行逻辑地址的转换?
    (1)需要一些硬件支持
    需要缺页中断机制和地址变换机制
    (2)页表项的变化
    需要增加有效位以表示该页是否在内存中,增加修改位说明该块是否进行了写操作,增加外存地址,增加访问字段以决定如何进行块的淘汰。
    虚存大小由虚拟地址结构决定
    (3)内存不够时如何决定让哪一页换出?——页面置换算法
        FIFO:选择最先进入内存的页面淘汰,可能会造成Belady异常
        OPT:最佳置换算法:向后看,选择未来访问最少的页或不再访问的页面(是无法实现的,常被用作评价其他算法的标准)
        LRU:最近最少使用,开销大(需要记录每个页面的访问次数),性能好
        CLOCK:为了解决LRU开销大的问题
                       (1)简单的clock算法:用访问位作为参考,先选择访问位为0的页面换出
                         在循环扫描的过程中将自己扫描过的页面的访问位置为零。
                       (2)改进的clock算法:选择访问位和修改位作为参考
                         最多进行四轮:优先级(0,0)<(0,1)<(1,0)<(1,1)
    (4)如何确定给每一个进程分配的页面数目大小?三种策略:
        1,固定分配,局部变换 :每一个进程分配固定的页面数目,在自己的页面数目上进行换入换出
        2,可变分配,全局置换:操作系统预留一个空白页面集,每当某一个进程发生缺页时就分配给该进程一个页面。
        3,可变分配,局部置换:只有当该进程频繁出现缺页现象才分配给该进程页面。
    (5)用工作集的大小确定驻留集(分配页面数)的大小
    驻留集:已经分配的内存页面数
    工作集:在工作窗口中的页面的集合
    分配的驻留集应该大于工作集的大小
    如果驻留集 < 工作集 可能会产生颠簸现象(页面频繁换入换出)
    (6)如何从外存调入页面
将外存分为文件区和对换区,调入调出页面在对换区进行,为了提高对换区的换入换出速度采用连续存储,而文件区采用离散存储。

posted @ 2022-03-15 21:46  希望25分钟跑完5公里  阅读(123)  评论(0编辑  收藏  举报