从硬件角度看内存管理

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

固定分区

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

    ChatGLM的部署,主要是两个步骤: 在Github上下载chatglm的库文件 在Hugging Face上下载模型参数与配置文件 ChatGLM包 从Github上看ChatGLM项目文件的结构 ...

  2. 动态规划问题(三)最长递增子序列长度(LIS)

    问题描述 ​ 有一个数组,它内部的顺序是乱序的,现在要求你找出该数组中的最长的递增子序列长度. ​ 例如:对于数组 {10, 20, 9, 33, 21, 50, 41, 60, 80},它的最长递增 ...

  3. Azure Data Factory(十一)Data Flow 的使用解析

    一,引言 上一篇文字,我们初步对 Data Flow 有个简单的了解,也就是说可以使用 Data Flow 完成一些复杂的逻辑,如,数据计算,数据筛选,数据清洗,数据整合等操作,那我们今天就结合 Da ...

  4. k8s集群Node节点管理:节点信息查看及节点label标签管理

    k8s集群Node节点管理:节点信息查看及节点label标签管理 Kubernetes集群Node管理 一.查看集群信息 [root@k8s-master1 ~]# kubectl cluster-i ...

  5. 2023-05-14:你的赛车可以从位置 0 开始,并且速度为 +1 ,在一条无限长的数轴上行驶, 赛车也可以向负方向行驶, 赛车可以按照由加速指令 ‘A‘ 和倒车指令 ‘R‘ 组成的指令序列自动行驶

    2023-05-14:你的赛车可以从位置 0 开始,并且速度为 +1 ,在一条无限长的数轴上行驶, 赛车也可以向负方向行驶, 赛车可以按照由加速指令 'A' 和倒车指令 'R' 组成的指令序列自动行驶 ...

  6. Langchain-Chatchat项目:2.1-通过GPT2模型来检索NebulaGraph

      在官方例子中给出了通过chain = NebulaGraphQAChain.from_llm(ChatOpenAI(temperature=0), graph=graph, verbose=Tru ...

  7. 使用 C# 在Word中插入图表

    Word中的图表功能将数据可视化地呈现在文档中.这为展示数据和进行数据分析提供了一种方便且易于使用的工具,使作者能够以直观的方式传达信息.要通过C#代码来实现在Word中绘制图表,可以借助 Spire ...

  8. LiteAI 四大杀手锏,解锁物联网智能设备AI开发难关

    [摘要] IoT设备中嵌入AI能力实现产品的智能升级,已经是AIoT行业发展的重要通道,那怎样才能实现AIoT = AI + IoT呢?如何将AI模型塞到小小的IoT设备里,让它可以轻松运行起来呢?成 ...

  9. 云小课|HSS教您如何应对LockBit勒索事件

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

  10. Consider defining a bean of type 'org.springframework.security.authentication.AuthenticationManager' in your configuration.

    Consider defining a bean of type 'org.springframework.security.authentication.AuthenticationManager' ...