zoukankan      html  css  js  c++  java
  • 系统内存管理简介

    系统内存管理简介

    系统以为单位,将内存划分为一个个存储单位,每个存储单位都有一个地址。指向地址的指针以字的大小为单位移动。目前常见的字单位为32位(4byte)或者64位(8byte)。

    常见的名词解释

    • 逻辑地址(logical address):仅对程序可见,从0开始计量
    • 真实地址(physical addr):系统对内存的真实地址编号
    • 地址联编(addr binding):将逻辑地址映射到真实地址

    就地址联编这一块,不同的内存管理方式联编的方式也不同。逻辑与物理两套地址的规划,使得内存管理有极大的自由。程序编译阶段,使用地址就是逻辑地址,当机器码loading进系统开始运行的时候,系统才开始地址联编。这使得程序中地址表示是一致的,具体真实占用哪些地址,到地址联编的决定。

    单块内存管理法

    想象这样一种理想状况,系统中除了操作系统(OS)只有一个APP。那么除了OS占用部分内存,剩下的都是APP进程的内存。

    单块内存管理

    图1 单块内存管理法

    我们使用两套地址管理,逻辑地址和物理地址。物理地址面向程序,从0开始计数,物理地址描述内存的实际地址规划。

    图1中表示的是逻辑地址+基本地址=物理地址。基本地址A加上逻辑地址L,得到真实地址。

    分区管理法

    单块内存管理中只允许单个APP运行,实际上内存可以容纳多个APP同时运行。这时候的做法是将内存分为多个区,除了OS外,每一个APP占用一个连续、独立的分区。

    分区方式有:

    • 固定分区:引导OS初期就固定分好区间,以后不再变
    • 动态分区:根据需求动态分配区间,区间可以在内存中移动

    无论单块内存,还是分区内存,同样遵循逻辑地址和真实地址两套管理法。每个分区都有自己的一套逻辑地址,用于内部交流,但最终和系统交互的时候,都需要采用物理地址。即联编方式,分区管理中地址信息存储在寄存器中。基址寄存器存储分区当前分区的起始位置,界限寄存器存储分区的长度。当前进程的请求地址不可以超过分区长度。

    分区管理

    图2 分区内存管理

    那么分区的大小如何决定,这取决于匹配进程的方式。总共有三种方式:

    • 最先匹配:验证当前内存往下走,第一个符合进程需求的大小分配分区
    • 最佳匹配:寻找可用容器中最小的分区
    • 最差匹配:寻找最大的符合进城需求的分区

    前两者适用于固定分区,便于节省内存。

    最后一个符合动态分区,动态分配要求尽量满足当前需求,后期再进行调整。连续的小空分区,可以合并成一个大的空分区。并且作业也可以在内存中移动,以空出更大的空间,成为压缩

    最后,无论是固定分区还是动态分区,整个进程必须同时载入内存中,一个分区必须能够容纳整个APP。这也就可以看出页式内存管理的优越性,他引出了虚拟内存的的概念。

    页式管理法

    页式管理同样遵循逻辑地址和物理地址的概念,但是这里启用两个新的概念,面向物理地址,面向进程地址。

    页式管理中,将进程(Process)以页为单位分割,同时将内存划分为一个个帧。页和帧可以大小不同,为了方便起见,这里将其视为相同。

    总结下来,帧描述内存,页描述进程。内存加载进程的方式是通过帧载入页

    程序面向的是页地址,这时地址联编需要找的是帧,这就需要一本字典,即PMT(page map table)。每一个进程都需要维护一张PMT,表中记录每一个对应的

    内存PMT设置

    图3 页式内存管理法

    这样的规划管理上增加了复杂度,但是好处也是巨大的。

    无论是单块内存管理还是分区管理,都需要整块连续的内存用来存储进程,相比页式管理内存的利用率则相差太多。分区管理中,如果找不到能够容纳整个进程的连续地址,则无法载入进程。页式管理中,内存和页都是一块块的,他们分散在各处,无需专门开辟一块连续的空间,内存可以见缝插针为页分配可用的页。

    同时,分页内存管理的方式也引入了请求分页虚拟内存的概念。请求分页意思是,由于CPU同一时刻只需要进程的部分数据,因此就不必将整个进程都加载进内存。当某些页面被需要的时候,系统先访问内存,如果该页面不存在,则访问二级存储将信息加载进内存,与此同时,新的页面加入使得原有的页面退出该帧的使用,该过程称为页面交换

    请求分页的引入使得有时候,内存好像无限大一样,内存载入的进程的总大小远远大于内存大小,这种现象称为虚拟内存

    页面交互大大提高了内存的利用率,但是当页面频繁交换的时候,交换过程占用过多的时间,使得进程显得不稳定,表现为使用不断地卡顿,这个现象称为系统颠簸

    帧与页

    帧就是大小固定的内存块,比如为1024。页就是进程地址,表示为一个坐标<页位置,偏移量>。系统中(逻辑地址/1024)的商为页面位置,余数为偏移量。因此,页坐标不得大于帧大小。根据页坐标和PMT就可找到物理地址(帧地址)。这就形成了从逻辑地址到物理地址的闭环。(仅凭记忆回顾,存疑

    小结

    最后总结一下页式管理法。一个APP载入系统,在系统表现为进程,一个或者多个。系统为每一个进程分配内存,将Process分割成,将内存分割成。之后,根据情况为分配,同时给每一个进程维护一张PMT用于地址联编。

    参考

  • 相关阅读:
    ExtJs控件属性配置详细
    static void和void区别(转)
    OpenSSL 内存管理分析笔记
    Openssl 之大数运算函数 BN
    python学习:字符串
    python学习:字典
    python学习:购物车程序
    python学习:元组和嵌套
    python学习:列表
    python学习:continue及break使用
  • 原文地址:https://www.cnblogs.com/Franken-Fran/p/memory_manage.html
Copyright © 2011-2022 走看看