对操作系统内存管理的总结和思考
什么是内存 ,内存解决了什么问题?
内存可以存放数据,程序执行前需要先放到内存中才能被cpu处理 他缓和了cpu与硬盘之间的速度矛盾
内存地址从0开始 内存中有一个个的存储单元 如果计算机按字节编址,则每个存储单元的大小为1字节 ,也就是8个2进制单位。
逻辑地址?
相对于这段内存起始地址来看的地址。 比如逻辑地址是10,就是相对于这段内存的起始位置向前走了10个位置
三种装入方式 三种将编译产生的逻辑地址 装入内存 变成物理地址的方法?
注意 : 程序经过编译 链接 后生成的指令中指明的是逻辑地址
绝对装入 编译时直接产生绝对地址
可重定位装入 装入时将逻辑地址转化为物理地址
动态重定位 在动态运行时装入 把地址转换推迟到程序真正要执行时才进行
从程序员写程序到运行经历了什么?
程序员写出来源代码 由编译程序编译成若干个目标模块 逻辑地址是分散的
由链接程序将编译后形成的一组目标模块 以及所需的库函数链接在一起 形成一个完整的装入模块
由装入程序将装入模块装入到内存中运行
链接的三种方式
内存空间的分配
三种连续分配方式如下
单一连续分配
固定分区分配
动态分区分配
两种常用的数据结构来记录内存的使用情况
空闲分区表 空闲分区链
动态分区分配都有什么算法呢?
首次适应算法
最佳适应算法
最坏适应算法
邻近适应算法
什么是分页存储?
内存 分成一个个分区 分区也可以叫 页框 内存块 物理块 物理页面
进程 分成一个个分区 分区也可以叫 页 页面
为了知道进程的每个页面在内存中存放的位置
操作系统给每个进程建立一张页表 页表通常存在PCB中
一个进程对应一张页表
进程的每个页面对应一个页表项
每个页表项由 页号 块号组成 这个块号就是内存的一个个分区的编号
问页表项占多少字节 就是问存储块号要多少字节
如何进行逻辑地址和物理地址之间的转化呢?
先确定某个逻辑地址对应的页号和页内偏移量
查页表找到对应页面在内存中的存放地址
物理地址 = 页面始址 + 页内偏移量
整个查询的流程是下面这样:
根据逻辑地址计算出页号,页内偏移量。判断页号是否越界。如果越界,就触发中断,没越界,就去页表寄存器,把页表始址和页表长度拿出来,去查询一下对应的页表,找到页号对应的页表项,确定页面存放的内存块号。用内存块号和页内偏移量计算得到物理地址。访问目标内存单元。
下面是具有快表的地址变换机构。
什么是快表?
作用 不是直接从内存中调度页表 而是先去看看TLB中有没有最近使用过的页表项 如果命中了就不用再访问内存了
多级页表
单级页表存在的问题 ?
问题1 :一张页表的页表项太多,需要太多的连续页框来存储单个页表。就丧失了离散存储的优势
问题2: 由局部性原理可知,很多时候,进程在一段时间内只需要访问几个页面就可以正常运行了,因此没必要让整个页表都常驻内存。只需要让这段时间需要使用的页面对应的页表项在内存中就可以了
如何解决存在的问题?
解决问题1 :
将长长的页表进行分组, 使每个内存块刚好可以放入一个分组 , 之后把分组离散的放到内存块当中 ,之后为了能找到这些分组,为这些分组再建立一个页表。这个页表称为 外层页表 顶层页表 页目录表。
注意 :顶级页表 存放在 PCB当中
如下图 一个大页表拆分成了1024个小页表 每个小页表有1024个页表项 每一个小页表在这里都正好可以放到一个内存块中 顶级页表记录了这些小页表存放在内存中的具体位置
这样原来20位的页号也可以拆成两个部分了
两级页表的访存次数分析:第一次访问内存中的PCB中的顶级页表 第二次访问内存中的二级页表 第三次访问最终目标的内存单元
总结一下就是 n级页表需要访存n + 1次
基本分段存储方式
和分页最大的区别就是 离散分配时所分配的地址空间的基本单位是不一样的
是什么?
进程的地址空间,按照程序自身的逻辑关系划分为若干段,每段都有一个段名,每段从0开始编址。
以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻
采用分段后,逻辑地址的结构变成了下面这个样子
段表
段表项的长度是相同的
地址变换的过程?
段表起始地址和段表的长度在进程没有上处理机运行的时候是存放在pcb当中的。上了处理机运行以后,会被放到段表寄存器当中。 根据段表寄存器中的这两个数据,可以知道段表是存放在什么位置的。当进程需要访问某个逻辑地址,系统会根据逻辑地址得到 段号和段内地址。之后用段号和段表地址对比 ,来判断段号是否产生了越界。如果段号大于了段表长度,就会产生越界中断。 段号从0开始,段表长度从1开始。之后根据段号和段表的始址来找到这个段号对应的段表项,也要判断一下段内地址是不是越界了。没越界的话,根据段内偏移和目标段在内存中的物理地址 来找到需要访问的目标段。
分页和分段的区别?
分页只用考虑物理大小。分段还需要考虑到信息之间的逻辑关系。 分页对用户是不可见的 分段对用户是可见的。
分段更容易实现信息的共享。也就是只需要让各个进程的段表项指向同一个段就可以了。
下图就是分页为什么不好被共享
在分段的方式中,访问一个地址需要几次访存?
还有段页式管理方式
先分段再分页
虚拟内存
解决问题2:可以在需要访问页面的时候才把页面调入内存,也就是虚拟存储技术。可以在页表项中增加一个标志位,用来表示该页面是不是已经调入内存。如果不在内存中,就会产生缺页中断,然后将目标页面从外存调入内存。
这些是传统的存储管理方案
传统的存储管理方案具有一次性(必须把资源一次性放到内存中才能开始执行)和驻留性。
虚拟存储技术是基于局部性原理的。
虚拟内存的概念
虚拟内存的特征
虚拟内存技术的实现
建立在离散分配的内存管理方式基础之上
在基础的传统非连续分配管理方式的基础上增加两个功能 请求调段和请求调页 / 页面置换和段置换功能
请求分页管理方式
页表机制
相对于基本分页存储管理的页表 新增了下面四个字段
这个也叫请求页表
为了实现请求调用 要引入缺页中断机构
和传统的过程区别就是找到页表以后判断在不在内存中
置换算法
也就是每次往后去找最久没出现的 但是这种不太可能被实现
没有回复内容