从硬件角度看内存管理

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

固定分区

固定分区,就是在系统编译阶段主存被划分成许多静态分区.
优点:进程可以装入大于或者等于自身大小的分区。这个实现起来比较简单,操作系统管理开销也比较小
缺点
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. ubuntu frame 个人开发心得

    引言 有一次我在树莓派上安装 Ubuntu Core 我给创新创业项目开发一个可视化 gui 看板,用于展示数据. 然后我就找到了我需要的工具 Ubuntu Frame 初次尝试使用 Ubuntu F ...

  2. Head First 的学习之道

    <Head First 设计模式>是一本好书,正如书的封面上说的那样,这是一本重视大脑的学习指南.里面提到了一些学习方法,可以尝试下,看看哪些对你有用: 1. 慢一点,理解的越多,需要记得 ...

  3. Mybatis 源码6 结果集映射流程 ,mybatis插件实现原理和基于mybatis插件实现参数化类型TypeHandler

    一丶前情回顾 书接上回,下面是SimpleExecutor执行查询的主要逻辑 prepareStatement 实现获取数据库连接, 其中连接是从Transaction.getConnection方法 ...

  4. 玩转Sermant开发,开发者能力机制解析

    本文分享自华为云社区<开发者能力机制解析,玩转Sermant开发>,作者:华为云开源 . 前言: 在<Sermant框架下的服务治理插件快速开发及使用指南>中带大家一起体验了S ...

  5. 电商业务容器化遇瓶颈,公有云Docker镜像P2P加速很安全

    当前,电商平台会采用基于Docker的容器技术来承载618大促期间的一些关键业务版块,包括最简单的商品图片展示.订单详情页面等等. 通过容器化改造,电商平台的每个业务版块解耦,可以独立开发.部署和上线 ...

  6. 解析WeNet云端推理部署代码

    摘要:WeNet是一款开源端到端ASR工具包,它与ESPnet等开源语音项目相比,最大的优势在于提供了从训练到部署的一整套工具链,使ASR服务的工业落地更加简单. 本文分享自华为云社区<WeNe ...

  7. PPT 图片框架排版万能能公式

    图片作用 提升设计感 辅助表达 传递情感 如何选择一张高大上的图片? 星空.地球.城市.海洋.线条.粒子.山脉.壁纸(系统.手机厂商千挑万选的) https://cn.bing.com/images ...

  8. Swagger2 Unable to infer base url. This is common

    http://localhost:8080/swagger-ui.html 弹出: 解决方法:除了SwaggerConfig 上要加@EnableSwagger2 ,启动类上也要加 重启再次访问如下

  9. Ali266首次商用落地,助力优酷码率最高节省40%

    阿里云自研编码器Ali266于2022年1月在优酷正式上线,这是已知的业界首个H.266/VVC标准的编码器商用落地项目.经过两个月的实际运行数据显示,开启Ali266后,同等画面清晰度的情况下比原H ...

  10. 面对科技公司的制裁,俄罗斯放出封印7年的神兽:RuTracker

    大家好,我是DD! 最近俄乌冲突引发的科技公司站队,Oracle.微软.三星等全球知名科技公司都开始对俄罗斯实施制裁与封锁.就连崇尚自由的开源社区GitHub也发文会严格限制俄罗斯获得维持其咄咄逼人的 ...