• 操作系统03-内存管理


    操作系统

    第三章: 内存管理

    存储器的层次结构

    CPU寄存器

    • 寄存器

    主存

    • 高速缓存

    • 主存储器

    • 磁盘缓存

    辅存

    • 固定磁盘
    • 可移动存储介质

    装入和链接

    • 装入

    • 绝对装入

      • 目标模块采用绝对地址
        • 逻辑地址和实际地址完全相同
        • 适用于单道环境
    • 可重定位装入

      • 在程序装入的时候装入
        • 存在地址变换,但是是直接找的当前合适的内存位置
        • 程序需要连续空间
        • 不存在在程序执行的过程中在内存移动
    • 动态运行时装入

      • 地址转换在程序需要真正执行时才进行
        • 可以在内存之中移动
        • 可以实现虚拟存储
    • 链接

    • 静态链接

      • 在程序运行之前,将各目标模块以及它们需要的库函数链接成一个完整的转入模块
    • 装入时动态链接

      • 在装入的时候边装入边链接
        • 便于修改和更新
        • 便于实现目标模块的共享
    • 运行时动态链接

      • 当程序需要的时候采取链接
        • 节约内存空间、加快装入过程

    连续分配方式

    • 单一连续分配

    • 固定分区分配

      • 分区使用表

      • 内存利用与回收

      • 缺点

        • 规定了分区大小,大程序无法装入
        • 限制了活跃进程的最大数
        • 碎片过多
        • 扩充和贡献困难
    • 动态分区分配

      • 算法

        • 首次适应算法
    • 每一次从头开始 导致空闲区间分配不均

    • 循环首次适应算法
      - 从上次找到的空闲分区的下一个空闲分区开始查找

      • 可能会有小的程序占据大的空闲分区,会缺乏大的空闲分区

        • 最佳适应算法
    • 以分区的容量大小 寻找第一个符合要求的
      - 会导致更多的小空间

        - **最坏适应算法**
        - 和上面的算法让容量递减
      
      • 会导致大的空闲空间不足
    • 管理空闲分区

        - 空闲分区表
      
      • 空闲分区链
    • 分区回收

        - 要回收的分区上或下存在空闲分区,则合并
      
      • 上下都有是则分区数减一,将下面的空闲分区从空闲表或链表中删掉

        • 上或者下有(只有一个)则不变
      • 不存在则自己新建为新 空闲分区数加一

      • 分区分配

        • 存在一个最小不可再分割的大小
      • 没有程序数目和大小的限制但是会产生过多的碎片

    • 动态重定位分配

      • 重定位寄存器
      • 地址变换机构
      • 目标程序
    • 伙伴系统

      • 伙伴算法
      • 内存分配
      • 内存回收
      • 在进程释放存储空间时,寻找伙伴合并,
        可以做到类似递归进行,知道找不到可以合并的伙伴为止
    • 交换

      • 以进程为单位
      • 以页或段为单位

    基本分页存储管理方式

    • 存储空间

      • 主存中为块
      • 进程的逻辑结构中为页
    • 页面与页表

      • 页表存放

        • 页表
        • 为记录页面在内存中对应的物理块
        • AcmKiY
      • 页表

      • 逻辑地址构成

        • 页号

          • 即在第几页
        • 页内位移

          • 即距离页面里面第一个地址的距离
          • 总的大小为页面大小,如1KB的页面,会有2的10次方的地址
        • 逻辑地址从0开始

    • 为解决连续分配方式存在的碎片

    • 地址变换机构

      • 分页逻辑地址

        • 页号和页内位移
          二进制:
          逻辑地址大小2m 页面大小2n
          则前m-n位表示页号 后n位表示页内位移
          十进制:
          记A为逻辑地址,L为页面大小,则:
          页号:P=int(A/L); 页内地址:d=A mod L
      • 映射

        • 页号得到物理地址的基地址

          • 基地址:页号对应的物理块号乘以页面大小即(块大小)
        • 基地址加上页内位移即实际物理地址

      • 快表

        • 设置的一个认为常用的页面集合

          • 因为:访问页表要访问2次以上主存
        • 局部性原理:所有的存储单元都趋于聚集在一个较小的连续区域

        • 增设一个具有并行查找能力的高速缓冲存储器

        • 存储频繁访问的页表项

      • 两级和多级页表

        • 每多一次页表会多一次对主存的访问

        • 将原来一张大的页表分为多个页表

        • 将地址组成部分的页表号分为多个部分

          • 每多一个部分表示多出一个页表对其进行记录,
            就相当于形成了多表结构
        • 实现可非连续存储页表

        • 级别增多会导致访问次数的增多

    • 信息共享

    • 可重入代码

    基本分段存储管理方式

    • 逻辑地址结构

    • 段表

    • 与分页的区别

    • 信息共享

    • 大小

      • 逻辑地址结构

        • 段号

          • 通过段号可以知道最多允许有多少分段
        • 段内地址

          • 可以知道每段的最大长度
          • 不定

    段页式存储管理方式

    • 逻辑地址结构

    • 先分段再分段

      • 所以会先访问段表再访问页表
      • 最后访问信息
    • 段表和页表

    程序局部性原理

    局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。

    • 程序运行时,无需全部装入内存,装载部分即可
    • 如果访问页不在内存,则发出缺页中断,发起页面置换
    • 从用户层面看,程序拥有很大的空间,即是虚拟内存

    虚拟存储器

    • 原理

      • 概念

        • 在一开始放入部分内存就开始执行
        • 请求调入和置换
        • 时间上表现为一个对象会在一个较短时间内执行
        • 空间上表现为当前执行的指令在一个较小的范围
      • 请求调入

        • 所访问的信息不在内存的时候
      • 置换

        • 操作系统将内存中暂时不使用的内容换出到外存
      • 局部性原理

        • 概念

          • 局部性原理是指程序在执行过程中一个较短时间内
            ,程序所执行的指令地址和操作数地址分别局限于一定区域内
        • 程序中少量分支和过程调用大都是顺序执行

        • 过程调用深度有限,

        • 存在着许多循环

        • 数组等数据结构

        • 体现

          • 时间局部性
          • 空间局部性
    • 物质基础

      • 相当数量的外存
      • 一定容量的内存
      • 地址变换机构
    • 内存分配和分配算法

      • 进程需要的最小物理块数

        • 执行一条指令所涉及的页面数确定

        • 单地址指令

          • 直接寻址
          • 间接寻址
          • 功能较强时
      • 进程的物理块数是固定还是可变

        • 固定分配局部置换
        • 可变分配全局置换
        • 可变分配局部置换
      • 按什么原则为进程分配物理块数

        • 平均分配算法
        • 按比例分配算法
        • 按优先级分配算法
        • 实现方案
      • 局部范围内

        • 页面置换算法

          • 最佳置换算法

            • 将来最长时间不会使用

            • 仅具有理论意义

        • 先进先出算法

            - 选择调入主存时间最长的页面予以淘汰
          
        • 最近最久未使用置换算法

          • 选择最近一段时间内最长时间没有被访问过的页面予以淘汰

            • 实现

            • 基于寄存器的方法

              • 配置一个n位寄存器,在进程访问页面的时候最左置1
                • 每过一段时间则计数器右移1位
              • 最小数值的寄存器即最近最久未使用的页面
            • 基于栈的方法

                - 栈顶存放最近使用过的页面
              
          • 时钟置换算法

          • 将页面设置成循环队列

            • 首次调入内存,置访问位置1
            • 被访问置访问位置1
          • 缺页中断的时候

            • 访问为0则淘汰

              • 不为0则置为0
              • 接上次判定界面位置
            • 改进:访问位和修改位分开考虑

            • 有四种情况

              • 先寻找访问位和修改位都为0的页面淘汰
              • 没有则再寻找访问页为0,修改位为1的淘汰,并将访问位设置为0
              • 没有重复一操作
          • 其他置换算法

    • 性能分析

      • 有效访问时间

        • 访问存储器所需时间的平均值
        • 在快表中,则需要访问一次主存
      • 不在内存,则要缺页中断时间

        • 缺页中断时间

          • 缺页中断时间
          • 界面传送时间
          • 进程重新执行时间
          • 仅考虑页面传送时间
        • 影响缺页率的因素

          • 分配给进程的物理块数
          • 页面本身大小
          • 程序编制方法
          • 页面置换算法
      • 抖动现象

        - 全局抖动
        - 局部抖动
        
        • 产生原因

            - 进程分配物理块太少
            - 置换算法选择不当
          
          • 全局置换使抖动传播
        • 预防与解除

            - 采用局部置换策略
            - 增加分配给相应进程的物理块
          
          • 挂起进程
      • 页面大小的选择

        - 有个最佳界面大小可以选择
        - 每个页表项需e个字节
        - 内存大小为m
        - 进程的平均长度为s
        - 计算开销  碎片项和页表项的总和(pm/2s + me/p)求最小值
        - p=2es的算术平方根
        
    • 实现方法

      • 请求分页存储管理方式

        • 调页策略

          • 何时

            • 预调页策略
            • 请求调页策略
          • 何处

            • 文件区

              • 存放文件
              • 离散分配
            • 对换区

              • 存放对换页面
              • 连续分配
              • 磁盘I/O较高
          • 情况

            • 对换区空间足够

            • 对换区空间不够

              • 将进程中可能被修改的调入对换区
            • UNIX方式

              • 全部存放在文件区
              • 运行过调出的放于对换区
              • 存在页面共享
        • 支持机构

          • 页表

            • 扩充的页表
          • 缺页中断机构

            • 缺页中断
            • 中断过程
          • 地址变换机构

            • 类似于分页存储管理
            • 进行缺页中断处理
      • 请求分段存储管理方式

        • 请求调段

        • 分段置换

        • 支持结构

          • 段表

          • 缺段中断机构

            • 类似缺页中断

            • 内存管理

            • 段的置换

              • 有空间则直接调入
              • 没有就检查空闲区之后是否满足
              • 再不符合则淘汰若干段
          • 地址变换机构

            • 动态地址变换
        • 分段共享

          • 实现

            • 为了实现分段共享,可在系统中设置一张共享段表,所有共享分段都在其中占有一表项
            • 增加共享进程计数
            • 存取控制字段
            • 共享段在不同进程中有不同的段号
        • 分配

          • 对于第一个请求使用该段的进程,系统为该共享段分配一个内存区,在将共享段调入
          • 同时将该区的始地址填入请求进程的段表
          • 在共享段表中增加一项,填写有关数据将count置1
          • 填入相关的数据结构
        • 回收

          • 释放该进程段,将count减一
          • 如果变为0则需要系统回收共享段的物理内存及有关表项
      • 分段保护

        • 越界保护

            - 用段表长度与逻辑地址中的段号比较
          
          • 段长与逻辑地址中的段内位移比较
        • 存取方式检查

          • 本段的访问方式
        • 环保护结构

            - 低编号环具有高优先权
          
          • 原则

              - 一个程序可以访问在相同的环或者较低环中的数据
              - 一个程序可以调用驻留在相同环或较高环中的服务
            
    • 特征

      • 多次性
      • 对换性
      • 虚拟性

  • 相关阅读:
    System.Threading
    HttpResponse类
    ASP.NET补充
    Leetcode练习(Python):双指针类:第125题:验证回文串:给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。
    Leetcode练习(Python):双指针类:第28题:实现 strStr():实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。
    Leetcode练习(Python):链表类:第25题:K 个一组翻转链表:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
    Leetcode练习(Python):链表类:第109题:有序链表转换二叉搜索树:给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
    Leetcode练习(Python):链表类:第23题:合并K个排序链表:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
    Leetcode练习(Python):链表类:第148题:排序链表:在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
    Leetcode练习(Python):链表类:第147题:对链表进行插入排序:插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。 重复直到所有输入数据插入完为止。
  • 原文地址:https://www.cnblogs.com/hiszm/p/13435844.html
Copyright © 2020-2023  润新知