从硬件角度看内存管理

①、在操作系统还没有出来之前,程序都是被存放在卡片上,计算机读取一张卡片就运行一条指令。这种从外部存储介质上直接运行指令的方法效率很低
②、单道编程的内存管理
所谓单道,就是整个系统只有一个用户进程和一个操作系统。在这种模式下,用户程序总是加载到同一个内存地址上运行。所以内存管理很简单,实际上不需要任何的内存管理单元,因为程序使用的地址就是物理地址,而且也不需要地址保护。缺点:无法运行比实际物理内存大的程序;其次,系统只运行一个程序,造成资源浪费;其三,无法移植到其他的计算机中运行
③、多道编程的内存管理
所谓多道变成,就是系统可以同时运行多个进程,在内存管理中,出现了固定分区动态分区两种技术

固定分区

固定分区,就是在系统编译阶段主存被划分成许多静态分区.
优点:进程可以装入大于或者等于自身大小的分区。这个实现起来比较简单,操作系统管理开销也比较小
缺点
1、程序大小和分区的大小必须匹配;
2、活动进程的数目比较固定;
3、地址空间无法增长。

因为固定分区方法有缺点,动态分区的方法自然而然就出现了

动态分区

动态分区的思想也比较简单,就是在一整块内存中首先划出一块内存是给操作系统本身使用,剩下的内存空间给用户进程使用。

比如:当第一个进程A运行时,先从这一大片内存中切割一块与进程A大小一样的内存给进程A使用。当第二个进程B准备运行时,我们可以从剩下的空闲内存中继续切割一块和进程B大小一样的内存块给进程B使用。以此类推,这样进程A和进程B以及后面进来的进程就可以实现动态分区了。

但是动态分区的方法有一个缺陷:那就是有可能会产生很多的内存空洞,导致内存的利用率也随着下降,其实这些内存空洞就是我们常说的内存碎片。那么这个内存碎片是怎么产生的呢?看一下下面的例子你们就能够理解了。

比如:进程A使用了操作系统往上的10MB内存,进程B使用了进程A往上的6MB内存,进程C使用了进程B往上的8MB内存。假如进程D需要的是5MB的内存,那么剩下的4MB(假设总共有32MB,除去操作系统的4MB剩下28MB)不足以装载进程D,那么第一个内存空洞就产生了。假设某个时刻,操作系统需要运行进程D,这时系统中没有足够的内存,就需要选择一个进程来换出,以便为进程D腾出足够的空间,假设操作系统选择进程B来换出,这样进程D就装载到了原来进程B的地址空间内,于是产生了第二个内存空洞(因为进程B占有的内存是6MB,而进程D只需要5MB,多出了1MB的内存)。那么动态分区这个缺点怎么来解决呢

为了解决碎片化的问题,操作系统需要动态的移动进程,使得进程占用的空间是连续的,并且所有空闲空间也是连续的。但是,整个进程的迁移是一个非常耗时的过程。不管是固定分区法,还是动态分区法,都存在很多问题:

a、进程地址空间保护问题:所有的用户进程都可以访问全部的物理内存,所以恶意的程序可以修改其他程序的内存数据,这是的进程一直处于危险和担惊受怕的状态下。即使系统里的所有进程都不是恶意进程,但是进程A依然可能不小心修改了进程B的数据从而导致进程B运行崩溃。这明显违背了“进程地址空间需要保护”的原则,也就是地址空间要相对独立。因此每个进程的地址空间都应该受到保护,以免被其他进程有意或者无意地伤害

b、内存使用效率低:如果即将要运行的进程所需要的内存空间不足,就需要选择一个进程进行整体换出,这种机制导致有大量的数据需要换出和换入,效率非常低下

c、程序运行地址重定位问题:进程每次在换出换入时运行的地址都是不固定的,这给程序的编写带来了一定的麻烦,因为访问数据和指令跳转时的目标地址通常是固定的,这就需要重定位技术了
由此可见,上述3个重大问题需要一个全新的解决方法,而且这个方案在操作系统层面已经无能为力了,必须要在处理器层面解决,因此产生了分段机制分页机制

分段机制

人们最早想到的一种机制叫做分段机制。其基本思想就是把程序所需要的内存空间的虚拟地址映射到某个物理地址空间中。

分段机制可以解决地址空间保护问题:两个不同的进程会被映射到不同的物理地址空间中,它们在物理地址空间是不会有重叠的。如果一个进程访问了没有映射的虚拟地址空间,或者访问了不属于该进程的虚拟地址空间,那么CPU会捕捉到这个越界访问,并且拒绝该次访问,同时CPU会发送一个异常错误给操作系统,由操作系统去处理这些异常情况,这就是我们常说的缺页异常。

分段机制解决问题的思路可以总结为:增加一个虚拟内存,进程运行时看到的地址是虚拟地址,然后需要CPU提供的地址映射方法,把虚拟地址转换为实际的物理地址,这样多个进程同时运行时,就可以保证每个进程的虚拟内存空间是相互隔离的,操作系统只需要维护虚拟地址到物理地址的映射关系即可。

但是分段机制也有不足之处:它的内存使用效率依然是比较低。分段机制对虚拟内存到物理内存的映射依然是以进程为单位,也就是当物理内存不足时,换出到磁盘的依然是真个进程,因此会导致大量的磁盘访问,从而影响系统性能。因此,分页机制就产生了

分页机制

上面提到的分段机制的地址映射的粒度太大, 以整个进程地址空间为单位的分配方式导致内存的利用率不高。
分页机制把这个分配机制的单位继续细分成固定大小的页,进程的虚拟地址空间也按照页来进行分割。这样常用的数据和代码就可以以页为单位驻留在内存中,而那些不常用的页可以交换到磁盘中,从而节省物理内存,这比分段机制要高效得多。
分页机制的实现离不开硬件的实现。在CPU内部有一个专门的硬件单元来负责这个虚拟页面到物理页面的转换,它就是内存管理单元(MMU)

内存管理单元(MMU)

ARM处理器的内存管理单元包括TLBTable Walk Unit两个部件。

TLB是一块高速缓存,用于缓存页表转换的结果,从而减少内存访问的时间。一个完整的页表翻译和查找的过程叫做页表查询,页表查询的过程是由硬件自动完成,但是页表的维护需要软件来完成。页表查询是一个相对耗时的过程,理想的状态是TLB里缓存有页表转换的相关信息。当TLB未命中时,才会去查询页表,并且开始读入页表的内容。

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux30025 人正在系统学习中

[转帖]Linux内存管理(一)——从硬件角度看内存管理的更多相关文章

  1. [转帖]Linux分页机制之分页机制的演变--Linux内存管理(七)

    Linux分页机制之分页机制的演变--Linux内存管理(七) 2016年09月01日 20:01:31 JeanCheng 阅读数:4543 https://blog.csdn.net/gatiem ...

  2. [转帖]linux 内存管理——内核的shmall 和shmmax 参数

    (转)linux 内存管理——内核的shmall 和shmmax 参数   内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个 ...

  3. linux内存管理解析1----linux物理,线性内存布局及页表的初始化

    主要议题: 1分页,分段模式及实模式 2Linux分页 3linux内存线性地址空间布局及物理内存空间布局 4linux页表初始化及代码解析 1.1.1内存寻址和保护模式 在X86平台上,内存控制单元 ...

  4. arm-linux内存管理学习笔记(1)-内存页表的硬件原理

    linux kernel集中了世界顶尖程序猿们的编程智慧,犹记操作系统课上老师讲操作系统的四大功能:进程调度 内存管理 设备驱动 网络.从事嵌入式软件开发工作,对设备驱动和网络接触的比較多. 而进程调 ...

  5. Linux操作系统基础(四)保护模式内存管理(2)【转】

    转自:http://blog.csdn.net/rosetta/article/details/8570681 Linux操作系统基础(四)保护模式内存管理(2) 转载请注明出处:http://blo ...

  6. [转帖]Linux中buff/cache内存占用过高解决办法

    Linux中buff/cache内存占用过高解决办法 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html /proc/sys/vm/drop_cac ...

  7. [转帖]linux下CPU、内存、IO、网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具

    linux下CPU.内存.IO.网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具 https://blog.51cto.com/hao360/1587165 linux_python关 ...

  8. linux学习的任督二脉-进程调度和内存管理

    转自 宋宝华老师的博客原文:https://blog.csdn.net/21cnbao/article/details/77505330 内功心法 学习或遇到问题时,反过来主动思考如果我是设计者,我会 ...

  9. 【深入理解Linux内核架构】第3章:内存管理

    3.1 概述 内存管理涵盖了许多领域: 内存中物理内存页的管理: 分配大块内存的伙伴系统: 分配小块内存的slab.slub.slob分配器: 分配非连续内存块的vmalloc机制: 进程的地址空间. ...

  10. [转帖]Linux学习笔记之rpm包管理功能全解

    Linux学习笔记之rpm包管理功能全解 https://www.cnblogs.com/JetpropelledSnake/p/11177277.html rpm 的管理命令 之前学习过 yum 的 ...

随机推荐

  1. 欢迎 Mixtral - 当前 Hugging Face 上最先进的 MoE 模型

    最近,Mistral 发布了一个激动人心的大语言模型: Mixtral 8x7b,该模型把开放模型的性能带到了一个新高度,并在许多基准测试上表现优于 GPT-3.5.我们很高兴能够在 Hugging ...

  2. java实现一个录像大师

    java实现一个录像大师 javacv从入门到入土系列,发现了个好玩的东西,视频处理,于是我想搞了个屏幕录屏大师,这里我使用javafx进行页面显示. 依赖 <!-- 需要注意,javacv主要 ...

  3. Java 并发编程(七)线程池

    任务的创建与执行 在多线程的编程环境中,理想的情况是每个任务之间都存在理想的边界,各个任务之间相互独立,这样才能够享受到并发带来的明显的性能提升,并且,由于每个任务之间如果都是独立的,对于并发的处理也 ...

  4. 文心一言 VS 讯飞星火 VS chatgpt (46)-- 算法导论6.1 4题

    四.假设一个最大堆的所有元素都不相同,那么该堆的最小元素应该位于哪里? 文心一言: 最大堆的最小元素位于堆的根结点.由于最大堆的性质,根结点是堆中所有元素的最大值,因此它也是堆中所有元素的最小值. 讯 ...

  5. 8种桌面IDE CodeArts智能代码补全类型

    摘要:代码补全可以有效的提升开发效率.减少拼写错误和输入代码量.CodeArts 依赖于 codearts.smartassist-java-ls 插件实现代码补全功能. 本文分享自华为云社区< ...

  6. 云图说|玩转华为HiLens之端云协同AI开发

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: 华为HiLens ...

  7. 论文解读丨LayoutLM: 面向文档理解的文本与版面预训练

    摘要:LayoutLM模型利用大规模无标注文档数据集进行文本与版面的联合预训练,在多个下游的文档理解任务上取得了领先的结果. 本文分享自华为云社区<论文解读系列二十五:LayoutLM: 面向文 ...

  8. 一起玩转玩转LiteOS组件:Opus

    摘要:Opus编码器是一个开源的有损声音编码格式,适用于网络实时声音传输,标准格式为RFC 6716,相对于其他编码格式来说,保真性更好. 本文分享自华为云社区<LiteOS组件尝鲜-玩转Opu ...

  9. 万字保姆级长文——Linkedin元数据管理平台Datahub离线安装指南

    ​ 元数据管理平台Datahub最近的热度越来越高.已经更新到了0.8.40的版本,来咨询我的小伙伴也越来越多,特别是安装过程有很多问题. ​ 考虑到有些企业部分数据服务是部署在内网的,那么离线安装D ...

  10. Solon 的常用配置

    一.服务端基本属性 #服务端口(默认为8080) server.port: 8080 #服务的 http 信号端口(默认为 ${server.port}) server.http.port: 8080 ...