zoukankan      html  css  js  c++  java
  • 操作系统--存储管理1

    0.先复习组成原理的一些相关的知识点
    * 程序必须被装入内存后(此时是以机器指令形式存在),才能被(以进程为单位)CPU 解析并执行。注意:内存中存储的是数据/机器指令。
    * CPU访问主存过程(各种类型数据通过总线传送)
    分类:读过程、写过程(涉及:控制总线、地址总线、数据总线)
    读过程:将地址发送给地址总线同时向控制总线传读命令,根据地址
    在内存中找到相应的存储单元,将需要的数据通过数据总线返回。
    写过程:将数据发到数据总线,将地址发给地址总线,向控制总线发写
    命令,将数据存储在相应的存储单元内部。
    * CPU能够直接访问的存储结构:主存和寄存器;
    CPU访问寄存器速度快,访问主存速度慢
    * cache:位于CPU内部,将CPU经常访问的数据/指令copy一份在其中
    目的是为了减少CPU访问主存的次数,减小获取数据的时间。
    * 通常低地址空间存储的是OS内核代码;高地址空间存储的是用户进程代码
    存储管理
    * 逻辑地址空间:是程序中表达位置的符号,程序/cpu看到的地址全是逻辑地址
    逻辑地址空间的范围可能大于实际的地址空间。CPU要进行访问内 存的时候,先经过地址转化,再将这个地址传递给地址总线。
    * 物理地址空间:实际的地址-绝对地址;地址总线上真实的地址,范围根据总线
    的条数决定;通常以数值的形式给出。
    * 指令和数据的地址绑定---将逻辑地址转化为物理地址的时间
    地址绑定:将程序的符合地址--转化为程序执行需要的绝对地址的过程。
    这个过程可能发送在3个阶段。
    1.编译时期
    如果代码、数据的存放的首地址已知,编译阶段可以确定绝对地址。
    如果首地址变更,则需要重新编译。
    2.装入的时候
    如果代码、数据的存放的首地址未知,编译阶段生产的地址是可重定为的
    地址,只有在装入的时候才可以确定其绝对地址。
    3.运行的时候
    如果允许进程在执行的时候迁移其代码、数据(允许进程在执行的时候地址进行 改变),那么地址绑定也在执行的时候进行。需要硬件支持其地址映射。

    * 存储管理单元(MMU)
    MMU是CPU内部的硬件装置,功能是将逻辑地址转化为物理地址,速度比较快。
    地址转化的时间:就是将地址传给地址总线之前完成转化。
    注意:具体转化的策略存在不同。
    注意:用户进程只能对逻辑地址进行处理。CPU也只能看到逻辑地址。物理地址是
    固定不变的。
    * 动态连接(C/C++)
    进程即将用到的代码段,不会被预先连接进入程序,只有真正被调用的时候
    才会被连接;该技术需要OS的动态连接库配合(windows的.dll)
    * 动态装入--提高对内存的利用率
    简单的说:进程的代码不会一次性加载进内存,而是根据需要进行加载进内存
    不需要OS进行特别的支持
    * 交换技术:进程从内存中换出/换入--换出后存储在外存的交换区--硬盘
    交互的过程:大部分时间都在传送进程数据,是比较花费时间,通常只有当要
    换出的数据比较多的时候,统一换出。
    注意:OS只要保证就绪队列的进程位于内存中,其他队列的进程就直接全部
    换出,在其再次进入就绪队列的时候换入。
    交换的思想:已经被主流OS采用,是比较重要的思想。
    * 交换技术和覆盖技术的区别:
    覆盖 一个程序不需要把所有的指令和数据都装入内存,而是将程序划分为若干
    功能相关独立的程序段,按照程序逻辑结构把若干功能相对独立的片段共 享一段内存,这样使得用户感觉内存扩大,程序源需要提供清晰的覆盖结 构,对程序员的要求比较高。
    交换 先将内存的部分程序写到外存的交换区,按照需求,在从外存交互区中
    读程序到内存中执行。交互完全是OS提供实现,对程序员透明。
    区别:交换的单位是进程,覆盖的单位是某个进程的部分片段代码。

    1.OS内存管理的基本思想--主要是对主存的管理
    * 围绕这如何将逻辑地址转化为物理地址;定义一种地址映射的关系
    y = f(x):x逻辑地址,y物理地址-->进而产生各种内存分配策略
    不同的内存分配策略对应一种不同的地址映射函数。
    (其实这个过程中又产生了许多新的问题用来支持这个操作)
    * 如何对存储管理算法的评价和比较
    # 硬件支持 # 性能 # 碎片 # 重定位 # 交换
    # 内存共享 # 内存保护
    2.连续内存分配--(进程全部进内存地址连续)
    * 概念:
    给进程分配一块 >= 进程大小的连续内存空间
    * 连续区内存分配硬件支持
    运用重定为寄存器防止用户进程访问其他的进程空间,或修改OS的代码和数据
    base寄存器--基地址寄存器:保存了进程的逻辑地址的起始地址
    bound寄存器--界限寄存器:保存了进程逻辑地址范围。
    MMU:通过上面的寄存器使得MMU能够动态的映射没一个逻辑地址到物理地址
    注意:在CPU将地址传给总线前转化的过程中,MMU先检查范围在进行转化,
    假如不符合范围base/base+bound则发生异常进入OS内核态,通常情况
    OS就会终止该用户进程。
    * 连续内存分配产生的问题
    # 多个长度不等的hole散布在内存内
    # 当一个进程申请进入内存,OS选择一个合适的hole分配给这个进程
    此时存在不同的分区选择算法
    # OS维护一些管理信息:分区分配情况,已经分配和未分配的hole
    ---出现的问题:OS如何在一串hole为某个进程选择一个Hole?---
    即动态存储分配--存在几种常见的策略
    first-fit:首次适应,每次从头开始找,找到的第一个满足条件就分配给进程
    best-fit:遍历整个hole,找到所有满足的hole,将这些满足中的最小的hole
    分配给进程。【将Hole按照长度递增放在一个队列里面】
    存在的问题:每次进程结束释放的分区都是相对较小的
    worst-fit:和best-fit相反,每次分配都是找的最大的hole分配给进程
    next-fit:找到第一个合适的hole后再继续找到下一个合适的hole并分配
    ---动态分配后新的问题碎片----存在内部/外部碎片
    # 外部碎片:其实就是进程被分配分区/释放分区后剩余的主存的不连续hole;
    这些hole通常比较小,无法用于进程分配。通常将这些hole合并
    可能时候分配某个进程
    # 内部碎片:指的:分配给进程的hole >进程占的内存大小;这些内部碎片
    是属于分区内部,无法被再次利用。
    OS如何应对减少这些碎片,以提高内存的利用率
    1.对于外部碎片:采取紧缩的技术--重排内存块
    将所有的hole合并成一个大的hole;
    前提条件:支持在运行时的代码数据重定位。
    2.分区对换:抢占处于等待的进程的内存资源:
    具体实现将等待的进程换出到外存的交换区,腾出内存空间
    注意:紧缩技术代价较高,需要进行数据复制,此时CPU不能做其他操作
    连续分区分配存在内部碎片+外部碎片
    * 连续分配的缺点:
    1,产生内部/外部碎片
    2,内存利用率低

  • 相关阅读:
    Golang Gin 实战(一)| 快速安装入门
    6 款最棒的 Go 语言 Web 框架简介
    Golang教科书般的web框架
    vgo简明教程
    go mod常用命令 已经 常见问题
    线程池原理讲解 Java专题
    Python 3.9安装与使用
    消息队列的基本概念
    实践——GIT安装(2021/05/01)
    vue2.0数据双向绑定原理分析及代码实现
  • 原文地址:https://www.cnblogs.com/sun1993/p/7743236.html
Copyright © 2011-2022 走看看