从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • 计算机简史

  • 数字电路

  • 计算机组成原理

  • 操作系统

    • 我的操作系统学习笔记

    • 我的操作系统实验笔记

    • 操作系统网课-王道考研

      • 0_课程白嫖指南
      • 1_1_操作系统的概念(定义)、功能和目标
      • 1_2_操作系统的特征
      • 1_3_操作系统的发展与分类
      • 1_4_操作系统的运行机制与体系结构
      • 1_5_中断和异常
      • 2_1_6_系统调用
      • 2_1_1_进程的定义、组成、组织方式、特征
      • 2_1_2_进程的状态与转换
      • 2_1_3_进程控制
      • 2_1_4_进程通信
      • 2_1_5_线程概念和多线程模型
      • 2_2_1_处理机调度的概念、层次
      • 2_2_2_进程调度的时机、切换与过程、方式
      • 2_2_3_调度算法的评价指标
      • 2_2_4_FCFS、SJF、HRRN调度算法
      • 2_2_5_调度算法:时间片轮转、优先级、多级反馈队列
      • 2_3_1_进程同步、进程互斥
      • 2_3_2_进程互斥的软件实现方法
      • 2_3_3_进程互斥的硬件实现方法
      • 2_3_4_信号量机制
      • 2_3_5_用信号量实现进程互斥、同步、前驱关系
      • 2_3_6_生产者-消费者问题
      • 2_3_7_多生产者-多消费者问题
      • 2_3_8_吸烟者问题
      • 2_3_9_读者-写者问题
      • 2_3_10_哲学家进餐问题
      • 2_3_11_管程
      • 2_4_1_死锁的概念
      • 2_4_2_死锁的处理策略—预防死锁
      • 2_4_3_死锁的处理策略—避免死锁
      • 2_4_4_死锁的处理策略—检测和解除
      • 3_1_1_内存的基础知识
      • 3_1_2_内存管理的概念
        • 内存空间的分配与回收
        • 内存空间的扩展
        • 地址转换
        • 内存保护
        • 小结
      • 3_1_3_覆盖与交换
      • 3_1_4_连续分配管理方式
      • 3_1_5_动态分区分配算法
      • 3_1_6_基本分页存储管理的基本概念
      • 3_1_7_基本地址变换机构
      • 3_1_8_具有快表的地址变换机构
      • 3_1_9_两级页表
      • 43_3_1_10_基本分段存储管理方式
      • 3_1_11_段页式管理方式
      • 3_2_1_虚拟内存的基本概念
      • 3_2_2_请求分页管理方式
      • 3_2_3_页面置换算法
      • 3_2_4_页面分配策略
      • 4_1_1_初识文件管理
      • 4_1_2_文件的逻辑结构
      • 4_1_3_文件目录
      • 4_1_4_文件的物理结构(上)
      • 4_1_4_文件的物理结构(下)
      • 54_4_1_5_文件存储空间管理
      • 4_1_6_文件的基本操作
      • 4_1_7_文件共享
      • 4_1_8_文件保护
      • 4_1_9_文件系统的层次结构
      • 4_2_1_磁盘的结构
      • 4_2_2_磁盘调度算法
      • 4_2_3_减少磁盘延迟时间的方法
      • 4_2_4_磁盘的管理
      • 5_1.2_I-O 控制器
      • 5_1.3_I-O 控制方式
      • 65_5_1_1_I-O 设备的概念和分类
      • 5_1_4_I-O 软件层次结构
      • 5_1_5_I-O 核心子系统
      • 5_1_6_假脱机技术
      • 5_1_7_设备的分配与回收
      • 5_1_8_缓冲区管理
  • Linux

  • 计算机网络

  • 数据库

  • 编程工具

  • 装机

  • 计算机基础
  • 操作系统
  • 操作系统网课-王道考研
2023-05-15
目录

312_内存管理的概念

# 3.1_2_内存管理的概念

‍各位同学大家好,在小节中我们会介绍内存管理相关的一些概念,‍‍其实就是来探讨一下内存管理到底应该做一些什么事情。

​

‍‍

# 内存空间的分配与回收

我们知道‍‍操作系统它作为系统资源的管理者,当然也需要对系统当中的各种软硬件资源进行管理,包括内存这种资源,‍‍那么操作系统在管理内存的时候需要做一些什么事情来看

第一个问题,‍‍我们知道各种进程想要投入运行的时候,需要先把进程相关的一些数据放入到内存当中,就像这个样子。‍‍那么内存当中有的区域是已经被分配出去的,而有的区域是还在空闲的,‍‍操作系统应该怎么管理这些空闲或者非空闲的区域呢?‍‍

另外如果有一个新的进程 3 想要投入运行,那么进程相关的数据需要放入内存当中,‍‍但是如果内存当中有很多个地方都可以放入进程相关的数据,这个数据应该放在什么位置呢?‍‍这也是操作系统需要回答的问题

第三‍‍如果说有一个进程运行结束了,那么进程之前所占有的那些内存空间应该怎么被回收呢?‍‍所有的这些都是操作系统需要负责的问题。‍‍

因此内存管理的第一件事就是要操作系统来负责内存空间的分配与回收,‍‍内存空间的分配与回收这个问题比较庞大,现在暂时不展开细聊,‍‍之后还会有专门的小节进行介绍。‍‍

​

# 内存空间的扩展

接下来再来看内存管理要实现的第二个功能。‍‍在第一个章节当中我们提到过一个例子,‍‍在我的电脑当中是可以运行一个叫做 GPA 的游戏,这个游戏大小超过 60GB,但是我的电脑内存才有 4GB,‍‍但理论上来说这个游戏想要正常运行,想要被 CPU 处理的话,那么应该把这 60g 的数据全部放到内存里,‍‍然而我的电脑内存才 4GB,为什么这个游戏还可以顺利的运行呢?‍‍

其实这就采用了所谓的虚拟技术,这也是操作系统虚拟性的一个体现。‍‍除了这个游戏之外,其实计算机当中也经常会遇到实际的内存空间不够所有的进程使用的问题,‍‍所以操作系统对内存进行管理也需要提供某一种技术,‍‍从逻辑上对内存空间进行扩充,也就是实现所谓的虚拟性,‍‍把物理上很小的内存拓展为逻辑上很大的内存,‍‍这个问题也暂时不展开细聊之后还会有专门的小节进行介绍。‍‍

​

# 地址转换

第三个需要实现的事情是地址转换,‍‍为了让编程人员编程更方便,程序员在写程序的时候,应该只需要关注指令数据的逻辑地址,‍‍而逻辑地址到物理地址的转换或者说地址重定位,这个过程应该由操作系统来负责进行,‍‍这样的话程序员就不需要再关心底层那些复杂的硬件细节。‍‍所以内存管理的第三个功能就是应该实现地址转换,就是把程序当中‍‍使用的逻辑地址,把它转换成最终的物理地址

​

那么实现转换的方法,咱们在上个小节已经介绍过,用三种装入方式,‍‍分别是绝对装入,可重定位装入和动态运行时装入,绝对装入是在编译的时候就产生了绝对地址,‍‍或者说在程序员写程序的时候直接就写了绝对地址,那么这种装入方式只在单道程序阶段才使用,‍‍但是单道程序阶段其实暂时还没有产生操作系统,所以这个地址转换其实是由编译器来完成的,而不是由操作系统来完成的。‍‍

第二种方式叫做可重定位装入或者叫静态重定位,‍‍就是指在装入的时候把逻辑地址转换为物理地址,转换的过程是由装入程序负责进行的,装入程序也是操作系统的一部分。‍‍这种方法一般来说是用于早期的多道批处理操作系统当中。‍‍

第三种装入方式叫做动态运行时装入或者叫动态重定位,就是运行的时候才把‍‍逻辑地址转换为物理地址,当然这种转换方式一般来说需要一个硬件重定位寄存器的支持,‍‍而这种方式一般来说就是现代操作系统采用的方式,咱们之后在学习页式存储还有段式存储的时候,会‍‍大量的接触这种动态运行时装入的方式,‍‍所以说操作系统一般会用可重定位装入和动态运行时装入这两种方式,‍‍实现从逻辑地址到物理地址的转换,而采用绝对装入的那个时期,暂时还没有产生操作系统,‍‍这就是内存管理需要实现的第三个功能地址转换。‍‍

​

# 内存保护

第四个功能叫内存保护,就是指操作系统,要保证各个进程在各自存储空间内运行互不干扰,‍‍我们直接用一个图让大家更形象的理解,‍‍在内存当中一般来说会分为操作系统使用的内存区域,还有普通的应用程用户程序使用的内存区域

各个用户进程都会被分配到各自的内存空间,比如说进程一使用的是这一块内存区域,进程二使用的是这块内存区域。‍‍如果说进程一想对操作系统的内存空间进行访问的话,很显然这个行为应该被阻止。‍‍如果进程一可以随意的更改操作系统的数据,那么很明显会影响整个系统的安全。‍‍

另外如果进程一想要访问其他进程的存储空间的话,那么显然这个行为也应该被阻止。‍‍如果进程一可以随意的修改进程二的数据的话,那么显然进程二的运行就会被影响,这样也会导致系统不安全。‍‍所以进程一只能访问进程一自己的内存空间,所以这就是内存保护想要实现的事情,‍‍让各个进程只能访问自己的那些内存空间,而不能访问操作系统的,也不能访问别的进程的空间。‍‍

我们假设进程一的逻辑地址空间是 0~ 179,实际的物理地址空间是 100 ~ 279,‍‍也就是从 100 内存单元开始存储,‍‍我们可以采用这样的方式来进行内存保护,就是在 CPU 当中设置一对上限寄存器和下限寄存器,‍‍分别用来存储这个进程的内存空间的上限和下限。‍‍如果进程一的某一条指令想要访问某一个内存单元的时候,CPU 会根据指令当中想要访问的内存地址‍‍和上下限寄存器的这两个地址进行对比,只有在这两个地址之间才允许进程一访问,因为只有这两个地址之间的部分才属于进程一的内存空间,‍‍这是第一种方法,可以设置一对上下限寄存器。‍‍

​

第二种方法我们可以采用重定位寄存器和界地址寄存器来判断此时是否有越界的嫌疑。‍‍那么重定位寄存器又可以称为基址寄存器,界地址寄存器又称为限长寄存器。‍‍重定位寄存器的概念,咱们在上个小节已经接触过,在动态运行时装入那种方式里,‍‍我们需要设置一个重定位寄存器来记录每一个进程的起始物理地址。‍‍界地址寄存器又可以称为限长寄存器,就是用来存放进程的最大逻辑长度的。‍‍

比如说像进程一它的逻辑地址空间是 0 ~ 179,所以界地址寄存器当中应该存放的是它的最大的逻辑地址,也就是 179。‍‍而重定位寄存器的话,应该存放进程的起始物理地址也就是 100。‍‍

那么假如现在进程一想要访问逻辑地址为 80 的‍‍内存单元的话,首先逻辑地址会和界地址寄存器当中的值进行一个对比。‍‍如果说没有超过界地址寄存器当中保存的最大逻辑地址的话,那么我们就认为‍‍这个逻辑地址是合法的,如果超过了,那么会抛出一个越界异常

没有越界的话,逻辑地址会和重定位寄存器的起始物理地址进行一个相加,最终就可以得到实际的想要访问的物理地址也就是 180。‍‍

​ ‍

# 小结

这个小节中我们学习了内存管理的整体框架,内存管理总共需要实现 4 个事情,内存空间的分配与回收,‍‍内存空间的扩充,实现虚拟性,另外还需要实现逻辑地址到物理地址的转换。‍‍

那么地址转换一般来说有三种方式,就是上个小节学习的内容绝对装入可重定位装入和动态运行时装入。其中绝对装入这个阶段,其实是在早期的单道批处理阶段才使用的,这个阶段暂时还没有操作系统产生,‍‍而可重定位装入一般用于早期的多道批处理系统,现在的操作系统大多使用的是动态运行时装入,‍‍

另外内存管理还需要提供存储保护的功能,‍‍就是要保证各个进程,他们只在自己的内存空间内运行,不会越界访问,一般来说有两种方式,第一种是设置上下限寄存器,‍‍第二种方式是利用重定位寄存器和借地址寄存器进行判断,那么重定位寄存器又可以叫做基址寄存器,‍‍而界地址寄存器又可以叫做限长寄存器,这两个别名大家也需要注意。‍‍

那么本章之后的内容还会介绍更多的内存空间的分配与回收,还有内存空间的扩充的一些相关策略。‍‍这个小结的内容不算特别重要,只是为了让大家对内存管理到底需要做什么,形成一个大体的框架。‍‍

​

上次更新: 2025/5/9 14:55:39
3_1_1_内存的基础知识
3_1_3_覆盖与交换

← 3_1_1_内存的基础知识 3_1_3_覆盖与交换→

最近更新
01
学点统计学:轻松识破一本正经的胡说八道
06-05
02
2025 年 5 月记
05-31
03
《贫穷的本质》很棒,但可能不适合你
05-27
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式