• 内存管理


    第八章 内存管理
    1.背景
    1)内存:
    由存储单元(字节或字)组成的一维连续地址空间;
    由顺序编址的块组成,每块包含相应的物理单元;
    用来存放当前正在运行的程序的代码或数据;
    是程序中指令本身(程序计数器)所指向的存储空间。
    内存可以分为:
    系统区:用于存放操作系统。
    用户区:用于装入并存放用户程序和数据。
    防止用户进程越界,只访问其合法空间办法:基地址寄存器(存放最低合法物理内存地址),界限地址寄存器(偏移量)
    2)指令与数据进行地址绑定:
    1.编译时期 如果内存位置已知,可生成绝对代码;如果开始位置改变,需要重新编译代码。
    2.加载时期 如果存储位置在编译时不知道,则必须生成可重定位代码。
    3.执行时期 如果进程在执行时可以在内存中移动,则地址绑定要延迟到运行时。需要硬件对地址映射的支持,例如基址和限长寄存器。
    3)逻辑地址与物理地址
    逻辑地址与物理地址的映射方法:
    静态地址重定位:在虚拟空间程序执行之前由装配程序完成地址映射工作。
    优点:容易实现,无需硬件支持。
    缺点:
    1.程序经地址重定位后就不能移动了,因而不能重新分配内存,不利于内存的有效利用。
    2.必须占用连续的内存空间,这就难以做到程序和数据的共享。

    动态地址重定位: 在程序执行过程中,在CPU访问内存之前,将要访问的程序或数据地址转换成内存地址。
    优点:
    1.可以对内存进行非连续分配
    对于同一进程的各分散程序段,只要把各程序段在内存中的首地址统一存放在不同的BR中,则可以由地址变换机构变换得到正确的内存地址。
    2.动态重定位提供了实现虚拟存储的基础
    动态重定位不要求在作业执行前为所有程序分配内存,也就是说,可以部分地、动态地分配内存。
    3.有利于程序段的共享
    缺点:
    需要附加的硬件支持。
    实现存储管理的软件算法比较复杂。
    4)静态链接与动态链接
    静态链接:为了程序正确执行,必须由连接装配程序把它们连接成一个可运行的目标程序
    问题:花费时间,浪费空间
    动态链接: 在程序开始运行时,只将主程序段装配好并调入内存,其它各段的装配是在主程序段的运行过程中逐步完成。每当需要调用一个新段时,再将这个新段装配好,并与主程序段链接
    2.交换
    进程可以从内存中暂时交换到备份存储上,当需要执行再交换回来。
    滚入,滚出—交换的操作:在基于优先级的算法中,低优先级的进程被换出,这样高优先级的进可以被装入和执行。
    3.连续内存分配(单一连续分配)
    1)内存映射与保护
    CPU逻辑地址先与界限地址寄存器比较,若相比较小则没有超出界限可以与重定位寄存器相加得到物理地址;否则地址错误。
    2)内存分配办法:
    固定分区法(将内存分为固定大小的分区,每个分区可以容纳一个进程)
    特点:管理简单,系统开销小
    不灵活、大程序可能无法装入
    利用率低,浪费,内部碎片大
    可变分区法(这里需要看课件或者书)
    一开始所有内存都可被应用,称为孔,有进程需要时就查找足够大的孔。
    选择空闲孔的办法:
    1首次适应:寻找第一个足够大的孔。
    l 优点:
    l 1.算法简单
    l 2.由于每次从低地址开始分配,高地址部分的大的空闲区被划分的机会比较少,比较容易满足大作业的需要空
    l 缺点:
    .留下碎片造成存储空间浪费
    2.最佳适应:分配最小的足够大的孔。
    l 优点:

    l 1.先使用小存储区,以便把大存储区留给大的作业
    l 缺点:
    l 1.每次都要按空闲区大小重新调整可用表或自由链,算法复杂
    l 2.留下无法利用的小碎片造成存储空间浪费
    3.最差适应:分配最大的孔
    l 优点:
    l 1.避免留下无法利用的小碎片造成存储空间浪费
    l 缺点:
    1.每次都要按空闲区大小重新调整可用表或自由链,算法复杂
    3)碎片
    外部碎片:(首次适应与最佳适应均会留下外部碎片)随着进程装入载出内存剩余的空闲空间被分割为小片段。
    内部碎片:进程所分配的内存大于所需要的内存。
    解决办法:紧缩(移动内存内容,合并成一块)。
    4.分页(不具备用户视角,映射对用户不可见)
    分页允许进程的物理地址空间可以是非连续的。
    1)基本方法
    将物理内存分为固定大小的块(称为帧);将逻辑内存分成同样大小的块(称为页);执行一个大小为n页的进程,要发现n个空闲帧并把程序装入其中。
    分页技术不会产生外部碎片,只会有少量内部碎片。
    2)页物理地址与逻辑地址的转换(这个需要记忆啊)
    逻辑地址%页大小=页偏移 逻辑地址/页大小=页号(对应帧号)
    物理地址=对应帧号*块大小+页偏移
    3)分页的硬件支持
    (PTBR) 页表基址寄存器指向页表
    (PRLR) 页表长度寄存器定义页表的大小
    (TLBs)关联的快速内存,特殊的硬件缓冲,也称相联存储器或转换表缓冲区
    页号在TLB中被找到概率:命中率。
    4)内存保护
    通过每个帧相关联的保护位来实现
    1.一位用来定义页是可读写的还是只读的。
    2.一位与页表中的每一条目关联:有效无效位,有效说明在进程的逻辑地址空间中
    5)共享页
    进程之间的共享只读代码(可重入代码,纯代码)留一份拷贝,放到共享页中。
    5.页表结构(需要看课件书)
    1.层次页表(P256)
    将大页表进行分层
    多级页表结构
    2.哈希页表
    算法:虚拟地址中的虚拟页号转换到哈希表中,用虚拟页号与链表中的每一个元素的第一个域比较,如果相等,就用第二个域来形成物理地址。(P258)
    3.反向页表(P259)
    反向页表中对于每个真正的内存页或帧才有一个条目
    表项包含真正内存地址的页的虚拟地址,它包括拥有这个页的进程的信息

    这样从两方限定了页表范围。
    6.分段(体现用户视角,映射对用户可见)
    1)基本方法
    逻辑地址空间是由一组段组成,每个段都有自己的名称长度。地址指定了段名称,段内偏移。用户可以指定两者。
    实现机制:段表,每个条目均有段基地址和段界限。
    2)硬件结构
    (STBR)段表基址寄存器指向内存中的段表地址
    (STLR)段表长度寄存器指出进程中的段数
    3)段物理地址与逻辑地址转换
    段号用作段表的索引,段偏移小于段界限时,偏移与段基地址相加为物理地址。

  • 相关阅读:
    对生产稳定的一些思考
    tsar指标解释
    tsar采集nginx指标
    Nginx如何处理一个连接
    Java : 如何更优雅的设计异常
    MySql的索引实现
    IntelliJ Idea 常用配置
    ICSharpCode.SharpZipLib.dll 压缩、解压Zip文件 附源码
    Java BigDecimal使用
    社交系统中用户好友关系数据库设计
  • 原文地址:https://www.cnblogs.com/rickhsg/p/3770502.html
Copyright © 2020-2023  润新知