[转帖]Linux内存管理(一)——从硬件角度看内存管理
从硬件角度看内存管理
①、在操作系统还没有出来之前,程序都是被存放在卡片上,计算机读取一张卡片就运行一条指令。这种从外部存储介质上直接运行指令的方法效率很低
②、单道编程的内存管理
所谓单道,就是整个系统只有一个用户进程和一个操作系统。在这种模式下,用户程序总是加载到同一个内存地址上运行。所以内存管理很简单,实际上不需要任何的内存管理单元,因为程序使用的地址就是物理地址,而且也不需要地址保护。缺点:无法运行比实际物理内存大的程序;其次,系统只运行一个程序,造成资源浪费;其三,无法移植到其他的计算机中运行
③、多道编程的内存管理
所谓多道变成,就是系统可以同时运行多个进程,在内存管理中,出现了固定分区和动态分区两种技术
固定分区
固定分区,就是在系统编译阶段主存被划分成许多静态分区.
优点:进程可以装入大于或者等于自身大小的分区。这个实现起来比较简单,操作系统管理开销也比较小
缺点:
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处理器的内存管理单元包括TLB
和Table Walk Unit
两个部件。
TLB
是一块高速缓存,用于缓存页表转换的结果,从而减少内存访问的时间。一个完整的页表翻译和查找的过程叫做页表查询,页表查询的过程是由硬件自动完成,但是页表的维护需要软件来完成。页表查询是一个相对耗时的过程,理想的状态是TLB里缓存有页表转换的相关信息。当TLB未命中时,才会去查询页表,并且开始读入页表的内容。
[转帖]Linux内存管理(一)——从硬件角度看内存管理的更多相关文章
- [转帖]Linux分页机制之分页机制的演变--Linux内存管理(七)
Linux分页机制之分页机制的演变--Linux内存管理(七) 2016年09月01日 20:01:31 JeanCheng 阅读数:4543 https://blog.csdn.net/gatiem ...
- [转帖]linux 内存管理——内核的shmall 和shmmax 参数
(转)linux 内存管理——内核的shmall 和shmmax 参数 内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个 ...
- linux内存管理解析1----linux物理,线性内存布局及页表的初始化
主要议题: 1分页,分段模式及实模式 2Linux分页 3linux内存线性地址空间布局及物理内存空间布局 4linux页表初始化及代码解析 1.1.1内存寻址和保护模式 在X86平台上,内存控制单元 ...
- arm-linux内存管理学习笔记(1)-内存页表的硬件原理
linux kernel集中了世界顶尖程序猿们的编程智慧,犹记操作系统课上老师讲操作系统的四大功能:进程调度 内存管理 设备驱动 网络.从事嵌入式软件开发工作,对设备驱动和网络接触的比較多. 而进程调 ...
- Linux操作系统基础(四)保护模式内存管理(2)【转】
转自:http://blog.csdn.net/rosetta/article/details/8570681 Linux操作系统基础(四)保护模式内存管理(2) 转载请注明出处:http://blo ...
- [转帖]Linux中buff/cache内存占用过高解决办法
Linux中buff/cache内存占用过高解决办法 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html /proc/sys/vm/drop_cac ...
- [转帖]linux下CPU、内存、IO、网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具
linux下CPU.内存.IO.网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具 https://blog.51cto.com/hao360/1587165 linux_python关 ...
- linux学习的任督二脉-进程调度和内存管理
转自 宋宝华老师的博客原文:https://blog.csdn.net/21cnbao/article/details/77505330 内功心法 学习或遇到问题时,反过来主动思考如果我是设计者,我会 ...
- 【深入理解Linux内核架构】第3章:内存管理
3.1 概述 内存管理涵盖了许多领域: 内存中物理内存页的管理: 分配大块内存的伙伴系统: 分配小块内存的slab.slub.slob分配器: 分配非连续内存块的vmalloc机制: 进程的地址空间. ...
- [转帖]Linux学习笔记之rpm包管理功能全解
Linux学习笔记之rpm包管理功能全解 https://www.cnblogs.com/JetpropelledSnake/p/11177277.html rpm 的管理命令 之前学习过 yum 的 ...
随机推荐
- Linux-LVM 磁盘扩容
LVM技术详解:视频1.视频2.视频3 安装lvm2后才支持如下命令 yum install -y lvm2 序号 功能 PV物理卷命令 VG卷组命令 LV逻辑卷命令 01 扫描功能 pvscan v ...
- C++通过文件指针获取文件大小
目录 1. 叙述 2. 结论 1. 叙述 对于读取本地文件,很多时候需要预先知道本地文件的大小在进行读取.网上给出的方案是移动文件指针,计算文件头和文件尾的偏移,计算出文件的大小.但是我总觉得这样做可 ...
- 设备如何使用go sdk轻松连接华为云IoT平台?
摘要:本文介绍使用huaweicloud-iot-device-sdk-go 连接华为云IoT平台,实现简单的华为云文档介绍的四个功能:设备连接鉴权.设备命令.设备消息和设备属性. 本文分享自华为云社 ...
- 华为云开天aPaaS 上线,服务千万开发者,使能行业场景化创新
摘要:9月25日,华为云在华为全联接2021发布四大生态策略,并宣布2022年投入1亿美元升级沃土云创计划.华为云开天aPaaS正式上线,实现经验即服务,使能行业场景化创新. 本文分享自华为云社区&l ...
- 基于CREATE TYPE语法自定义新数据类型
摘要:介绍CREATE TYPE语法可以在数据库中定义一种新的数据类型. 本文分享自华为云社区<GaussDB(DWS)数据类型之自定义数据类型(复合类型)>,作者: 清道夫. CREAT ...
- cxf 动态调用 WebService No compiler detected, make sure you are running on top of a JDK instead of a JRE
WebService cxf No compiler detected, make sure you are running on top of a JDK instead of a JRE [202 ...
- 一个IT老码农的创业和生活(一)抑郁和自杀
2019年2月18日,离我的38周岁生日还差两个月,我的编程培训班"源栈"开张了. 在此之前,从我2002年大学毕业,6年时间,我先后做过英语教师.实习律师.公司法务.装修公司 ...
- 【算法学习笔记】区间DP
基本的知识点引用自 OI wiki,感谢社区的帮助 什么是区间 DP? 区间类动态规划是线性动态规划的扩展,它在分阶段地划分问题时,与阶段中元素出现的顺序和由前一阶段的哪些元素合并而来有很大的关系.令 ...
- AcWing 每日一题 - 暑假
本篇解题记录题源来自 AcWing 的每日一题 · 暑假 补题链接:Here Week 1 星期四 AcWing 3761. 唯一最小数 利用 map 存出现过数的下标和次数即可 vector< ...
- Python | PyQt5 Could not find the Qt platform plugin windows错误解决方法
在写Python大作业的时候发现运行PyQt5时有报错 出现该问题的原因是环境变量没有添加. 解决方法: 在环境变量中增加: QT_QPA_PLATFORM_PLUGIN_PATH 样例路径(这里填你 ...