当前位置: 首页 > news >正文

操作系统 == 内存管理

内存管理概念

内存管理的基本原理

内存管理主要功能包括:

地址转换,内存分配和回收,内存空间的扩充(虚拟存储技术),内存共享,存储保护

逻辑地址和物理地址

       编译后,每个模块都从0开始进行编址,这称为目标模块的逻辑地址

       Note:进程在运行过程中,看到的和使用的都是逻辑地址

       逻辑地址经过地址转换变为物理地址

       物理地址指的是内存中的实际地址,内存地址空间是内存中物理单元的合集

       地址转换是由MMU(内存管理部件)实现的

程序的链接和装入

       将用户程序编程可执行程序,一般需要以下几步

              编译,链接,装入

       装入分为以下几种

  1. 绝对装入:

逻辑地址与实际地址完全相同,只适合单道程序环境,在编译时就知道程序存放在内存哪个位置

  1. 可重定位装入(静态重定位)

地址转换在进程装入时就完成,缺点是一个作业装入内存,必须给它分配足够的存储空间,且运行期间无法移动

  1. 动态运行时装入

看到这个名字,相比你就知道其与上面的区别了,虽然装入模块被装入到内存,但是只有运行的时候才会发生地址转换,存在一个重定位寄存器来实现动态运行时装入‘

       然后就是链接:分为静态链接·和动态链接

  1. 静态链接

将各目标模块与其所需库函数链接成一个完整的装入模块,以后不在拆分

  1. 动态链接

采用边装入边链接的方式

  1. 运行时动态链接

在程序运行需要某目标模块的时候,才对其进行链接

内存映像

内存映像一般包含:代码段,数据段,堆,栈等基本要素

内存保护

  1. 在CPU设置一对上下限寄存器,存放用户进程在主存中的下限和上限地址
  2. 采用重定位寄存器和界地址寄存器进行越界检查,重定位寄存器内存放的为初始物理地址,界地址寄存器存放的为进程最大逻辑地址(由于逻辑地址从0开始,所以这就是长度)

内存共享:只有只读区域才可以共享

内存分配和回收

连续分配管理方式

指的是为一个用户空间分配一篇连续的内存空间

  1. 单一连续分配:用户独占用户区,内存中只有一道程序
  2. 固定分区分配:将用户空间划分为多个固定大小的分区
    1. 分区大小相等
    2. 分区大小不等

使用分区使用表来标识各跟去的起始地址,大小和状态

  1. 动态分区分配:根据进程需要,动态分配内存

动态分区分配涉及多种分配算法:

  1. 首次适应算法:按地址递增次序排列,每次分配,顺序查找
  2. 临近适应算法(循环首次适应算法)
  3. 最佳适应算法:空闲分区按照容量递增排序,每次顺序查找第一个满足大小的分区
  4. 最坏适应算法:空闲分区按照容量递减排序
  5. 索引分配算法:
    1. 伙伴系统:所有分区大小伟2的k次幂
    2. 哈希算法:
    3. 快速适应算法:用常用空间大小进行划分

这三种算法的共同特点就是在主存中连续存放用户程序

基本分页存储管理

思想:将内存分为若干固定大小的分区,称为页框,页帧,物理块

进程的逻辑地址空间同样分为若干与块大小相等的区域,称为页或者页面

这样就不会产生外部碎片,且只会在进程最后一个不完整的块申请主存块空间的时候,才会产生内部碎片

分页存储的几个基本概念

  1. 页面和页面大小
    进程的逻辑地址空间每个页面有一个编号,称为页号,从0开始,同样的,内存页框也有自己的编号,称为页框号,从0开始,为方便地址转换,页面大小为2的整数次幂。
  2. 地址结构
    1. 逻辑地址,每个分页存储管理的逻辑地址由页号和页内偏移量组成
  3. 页表
    为了便于找到每个页面在内存中存放位置,系统为每个进程建立了一张内存映射表,简称页表,进程每个页面对应一个页表项,记录页号和块号
  4. 基本地址变换机构
    主要任务是将逻辑地址转换为物理地址,为了提高地址变换速度,系统中存在一个页表寄存器,存放页表在内存中的起始地址和页表长度,一般单CPU系统只有一个页表寄存器,当进程被调度执行的时候,将页表的起始地址和页表长度放到页表寄存器中。
  5. 物理地址的计算
    页号P = A/L ,就是逻辑地址/页面大小
    页内偏移两 W = A%L 就是逻辑地址%页面大小
    先判断是否越界,如果没有越界的话,那么就区找对应页表项,即查询物理块号
    note:这里的P对应页表项的地址为页表起始地址加上P乘以页表项长度
    计算物理地址 E = bL * W,b为对应物理块号
    note:地址转换是由硬件来完成的

快表(TLB)

具有并行查询能力的高速缓冲寄存器
由于局部性原理,这里面会存储一些访问过的若干页表项,对快表进行遍历查询的时间几乎可以忽略不计,通过快表命中访存次数就会降低到1次

多级页表

如果页表项较多,但是页表还要求连续存储,这显然不切实际

故为了使得页表离散存储,引入多级页表,对页表在进行分页,然后上一级页表项存储对应页表对应的块号

基本分段存储管理

分段管理的方式考虑到了程序员和用户,将用户进程逻辑地址空间划分为若干大小不等的段,并分配一段连续的地址空间

段表:包含段号,段长,本段在主存中的起始地址

分段和分页的区别

  1. 页是物理信息的基本单位,段是信息的逻辑单位
  2. 页的大小固定,段大小不固定
  3. 分页管理的地址空间是一维的,分段管理的地址空间是二维的

段的共享

内存中配置张共享段表,所有共享的段在共享段表中占据一个表项

段页式存储管理

其实就是将每段再分为若干页

逻辑地址结构如下

段号 页号 业内偏移量

http://www.xdnf.cn/news/366427.html

相关文章:

  • postgresql 参数wal_level
  • 【计算机网络-数据链路层】以太网、MAC地址、MTU与ARP协议
  • 7:点云处理—眼在手外标定
  • Grafana v10.1.5 升级至最新v12.0.0
  • 18.模方ModelFun设置教程
  • CSdiy java 07
  • GET请求如何传复杂数组参数
  • uniapp 和 webview 之间的通信
  • 上班摸鱼远程打游戏,哪款远控软件好用点?
  • 服务逃生(隐藏)-困难-其他,排序
  • 【Java基础】——集合篇
  • 使用Tomcat部署war包查看内存使用情况
  • 【0-3h PN相关2】GNSS天顶总延迟数据同化对意大利短期水汽和降水预报影响的研究
  • c++:编译链接过程
  • 40-算法打卡-二叉树-深度优先(前、中、后序遍历)-递归遍历-第四十天
  • Langchain、RAG、Agent相关
  • 【MyBatis-6】MyBatis动态SQL:灵活构建高效数据库查询的艺术
  • AI融合SEO关键词智能优化
  • 三轴云台之视觉跟踪系统篇
  • 算法设计与分析复习代码(hnust)
  • 聊一部很癫的电影
  • 数据结构与算法分析实验10 实现最短路径算法
  • Linux——多线程
  • 前端常见七种报错类型及解决方案
  • Linux vi/vim编辑器常用命令
  • 多分类问题softmax传递函数+交叉熵损失
  • 嵌入式学习笔记 - 关于结构体成员地址对齐问题
  • Edu教育邮箱申请成功下号
  • Knife4j文档的会被全局异常处理器拦截的问题解决
  • Python MNE-Python 脑功能磁共振数据分析