内存管理(操作系统是如何管理内存的)
内存管理(操作系统是如何管理内存的)
在计算机的世界里,有两个比较宝贵的资源,CPU和内存。这是每个进程都要争抢的资源。这篇文章说说操作系统是怎样进行内存管理的。 因水平有限,加之内存管理涉及的细节又很多,所以这里只是简单的介绍内存管理的一些关键概念及发展过程。直面物理内存
在很久很久以前,内核与用户进程都是直接操作物理内存的。那个时候的物理内存模型大概可以简化成这样。物理内存按照固定大小编号,每个编号代表一个固定的二进制位。我们就像使用门牌号一样使用物理内存编号。这种模型的特点就是简单直接,但是带来的问题也很多而且很严重。问题1:用户进程之间内存冲突。
在这个模型中,如果同时运行多个进程,就会引发内存冲突。比如进程A访问16号物理内存,而这时进程B很有可能也访问16号物理,引发冲突。相当于你想进入16号房间,另一个人也想进入同样的房间,最后你俩肯定干起来。问题2:破坏操作系统。
因为内核跟用户进程都是直接操作物理内存,所以难免用户程序就跑去操作内核使用的内存了,引发系统瘫痪。
其实这个模型也不是一无是处。因为足够简单,而且直接操作硬件,所以在简单的嵌入式系统,收音机,微波炉的电脑版里,还是采用的这种方式。对了BIOS也是采用的这种方式。
继续前进,既然这种方案有诸多严重问题,那么我们就需要找到一个新的方案。注意,我们要解决的问题是同时运行多个进程,但不会造成访问物理内存地址冲突。地址空间
地址空间:一个进程可用于寻址内存的一套地址空间。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间(除了一些特殊情况可以共享)。
地址空间的概念,形象一点儿说类似于我们的电话号码,比如我们的手机号就是一个11位的阿拉伯数字组成的地址空间。生活中还有很多其他的地址空间概念的应用。基址寄存器与界限寄存器
虽然每个进程都有自己的地址空间(如下图a与b),但是还没有解决访问物理地址冲突的问题。因为进程A的16号内存跟进程B的16号内存很有可能还是同一块内存。
为了解决这个问题,发明了两个特殊的硬件,基址寄存器和界限寄存器。(关键时刻还得硬件工程师)
基址寄存器:存储进程访问内存的起始地址。
界限寄存器:存储进程的内存长度。举个例子
当第一个程序运行时,基址寄存器和界限寄存器的值分别为0,16384,运行第二个进程的的时候,这些值分别是16384和32768。如果第三个16KB的程序进来那么基址寄存器的值是32768和16384。如下图所示
每个进程的内存地址在送到物理内存之前。都会自动加上基址寄存器的值。这样每个进程都会在固定的内存范围内活动,这样就可以解决多个进程同时在内存中的问题。 为了避免用户进程随意更改寄存器中的值引起内存访问错误,很多系统中基址寄存器和界限寄存器都是只有操作系统可以访问。
这个模型看起来完美解决了多道程序运行问题,但是问题在于,每次访问内存都要做加法跟比较运算,加法运算速度太慢了。而且进程的内存都是动态变化的,所以这个方法也不是最优解。交换内存
我们先来看另外一个问题----内存超载。 每个程序员都希望有一块无限大的内存,但是这不现实。就像你想拥有无限多的钱一样。软件膨胀的速度,跟人的欲望是一样的,永远得不到满足。
交换内存:把一个进程完全载入内存,运行一段时间之后存入磁盘。然后将另外一个进程载入内存,继续运行。周期性进行交替,把空闲进程主要存储在磁盘上。
这个方案既可以解决同时运行多进程的问题,又可以解决内存超载问题。因为要频繁地往磁盘写入数据,但硬盘的写入速度又远没有内存快。所以这个方案一样不是我们寻找的最优解。 值得一提的是,虽然这个方案不能作为主流的内存管理方案,但是交换内存的概念还是被保留了下来,并且在实际应用中发挥了很大作用,后面还会提到。虚拟内存
为了解决同时运行多个程序,以及内存超载问题。所有操作系统的终极解决方案——虚拟内存。虚拟内存概念厉害之处在于,使程序只有一部分载入内存的情况下就可以运行。不用像上面介绍的那些模型一样,要全部载入内存,才能运行进程。
虚拟内存:每个程序拥有自己的虚拟地址空间,这个空间被分割成多块,每一块被称为一页或者页面(page)。每一页有连续的地址空间。这些也被映射到物理内存。但是并不是所有页都必须在内存中才能运行程序。当程序引用的页在物理内存时,由操作系统完成映射。当程序访问的页不在物理内存时(缺页中断),由操作系统负责把需要的页载入内存。当一个程序等待一部分内容读入内存时,可以把CPU交给其他进程。
上面这段话,有几个关键点,我帮大家梳理一下。虚拟地址
程序能够寻址的最大空间,所谓虚拟地址就是逻辑上假想出来的,真实没有那么大。32位操作系统最大的虚拟寻址空间就是2^32 大概是4G的空间 ,64位的操作系统最大虚拟寻址空间是2^64,抱歉我算不出来有多大。页面
虚拟地址空间按照固定大小划分成称为页面(page)的若干单元。页框
在物理内存中与虚拟页面一一对应的单元称为页框(page frame)。页面和页框的大小通常是一样的。如何映射--内存管理单元及页表。
将虚拟地址发送到内存管理单元(Memory Management Unit,MMU包含在CPU里),然后通过页表把虚拟地址映射为物理地址。页表的本质是个函数,输入虚拟地址,输出真实物理地址。缺页中断
我们知道进程的虚拟寻址空间很大,但是物理内存肯定没有那么大,也就是虚拟地址不可能全部映射到物理内存。当访问的页面不在物理内存时,就发生了页面中断,这个时候需要页面调度算法帮忙,把暂时不需要的页面置换到交换区,把需要的页面加载进内存。在等待换入页面的过程中,CPU会去处理其它进程。Linux会在磁盘中专门开辟出一个区域作为内存的交换区,以区别于IO系统的磁盘空间。举个例子
我们来简单看一下,如何把虚拟内存地址映射为真实的物理内存地址。假设有一台可以产生16位地址的计算机,最大寻址范围是0到64K(2^16),这台计算机实际物理内存是32K。我们虽然可以编写64K的程序,但他们却不能完全被载入内存。在磁盘上必须有一个64K大的空间,保证程序片段在需要时可以被载入内存。如下图
共享内存
为了更高效地使用内存,我们希望更多的共享内存。
多进程共享页面
在实际操作中,通常将指令空间和数据空间分开。指令空间的页面很方便共享,因为指令空间的内容是只读的。如果是数据空间共享页面,要么保证数据是只读的,要么在进行数据空间进行写操作时,复制一份副本出来。比如fork调用,只要有一个进程进行了写操作,就会拷贝一份副本,这样每个进程都是可读写的。这个过程叫做写时拷贝。
多进程共享库
这是共享内存的另外一个维度,共享页面是按照页面维度共享,这个是按照库的维度,有很多进程都会用到同样的底层库,比如windows的动态链接库(DLL).这样内存中只载入一份就OK了,大大节省了内存空间。结束
上面的内容大概介绍了一下操作系统管理内存的基本知识,还有很多细节没有涉及,比如页面置换算法,如何更快的将虚拟地址映射到物理地址。如何处理进程动态内存增长等问题,感兴趣的可以私下跟我交流,或者查阅相关书籍。
汽车acc线怎么找(汽车大灯acc线怎么找)这台宝马X3是20款的,早上才提的车下午才上的牌照,我到那边的时候还在贴膜,前挡已经贴好。这款宝马是高配的,带全车哈曼卡顿音响系统,带车道保持,全车氛围灯也非常高端漂亮,宝马的新款
iccid查询手机号码(如何查询联通ICCID码?)iccid查询手机号码(如何查询联通ICCID码?)小编在后台收到一位用户的私信,咨询联通ICCID如何查询,今天抽空给大家科普下这个ICCID码。什么是ICCID码?ICCID码
今日农历多少(最准确的老黄历看日子)明日黄历查询,明天黄历什么日子明日公历公元2021年6月28日星期一明天农历农民历二零二一年五月(大)十九明日回历伊斯兰历1442年11月18日明日岁次辛丑年甲午月丁未日明日五行天
规费是什么(建筑工程规费是什么意思)一什么是工程造价?所谓工程造价,就是研究一栋楼房到底花了多少钱?这些钱是由哪些要素构成的?二工程造价的构成要素是什么?如果你一点造价也不懂,就按我们的常识去思考,估计你也能说出个一
李林妲(李林妲长大照片)李林妲(李林妲长大照片)00后新生代小花李宛妲,被大家亲切地称作雨林精灵,她的父亲马悠来自德国,被称为雨林再造之父,母亲李旻果被称为当代三毛,两人隐居雨林,共同致力于西双版纳的雨林
咋查微信以前的聊天记录(微信聊天记录删除还原)咋查微信以前的聊天记录(微信聊天记录删除还原)微信现已成为我们最常用的谈天东西,因为微信的运用率十分高,我们也常常会收拾一下微信谈天记载和其他软件的缓存文件来腾出手机空间。但有时分
十七路军(十七路军有多少人)十七路军(十七路军有多少人)提起民国时期的十七路军,我相信即使对历史所知不多的人也会对它有所耳闻。当然,这种耳闻仅仅就是西安事变的那段历史罢了,至于说它的来龙去脉,则很少有人关注。
新闻光盘行动手抄报顺口溜近日光盘行动手抄报顺口溜登录上了百度热搜,受到广大网友们的关注,那么关于目前的光盘行动手抄报顺口溜相信小伙伴们都是想要了解到最新的信息吧,小编也是在网上进行了一些整理,收集到了一些
金汉斯多少钱(石家庄金汉斯自助餐)据了解,有着8年历史的济南本土老牌自助餐饮连锁企业金汉斯烤肉近日推出了一票制供应惠民服务,不仅对店内自助餐菜品进行了升级,而且可以免费畅饮其主打的自酿鲜啤,自助餐饮价格依旧不变。据
女星借钟南山话题恶意营销这两天关于女星借钟南山话题恶意营销在网上的热度是非常高的,很多网友们也都是非常关注女星借钟南山话题恶意营销这个事情,为此小编也是在网上进行了一番搜索查阅相关的信息,那么如果说有感兴
杨玏机场被送鱼近日有关于杨玏机场被送鱼的问题受到了很多网友们的关注,大多数网友都想要知道杨玏机场被送鱼的具体情况,那么关于到杨玏机场被送鱼的相关信息,小编也是在网上进行了一系列的信息,那么接下来
王中军卖香港豪宅关于到现在王中军卖香港豪宅这个话题,相信很多小伙伴都是非常有兴趣了解的吧,因为这个话题也是近期非常火热的,那么既然现在大家都想要知道王中军卖香港豪宅,小编也是到网上收集了一些与王中
李易峰为什么不火了(郑爽怀孕)11月6日,由李易峰金晨主演的电视剧隐秘而伟大,在一众影迷的期盼下,是终于开播了。虽然李易峰主演过多部民国题材的电视剧,但隐秘而伟大是李易峰首次参演谍战题材的剧作,该剧刚官宣时就已
圈9为什么不火(钻火圈)序言2004年超级女声冠军安又琪和2009年快乐女声冠军江映蓉,一起参加了乘风破浪的姐姐2。安又琪第一次公演之后就被淘汰了,江映蓉的成绩则中规中矩,短时期之内不会淘汰,但要想出道也
李易峰为什么不火了(范世琦)1王子异是不是被公司坑了?这个,没有一个唯一的答案,算是双方都有自己的理。的确,从法院的判决结果来看,的确是不支持王子异解约的,可是同时也确认了公司那边,对于王子异的发展规划有不足
无尽战区为什么不火(无尽战区亚斯兰)大家好,这里是正惊游戏,我是正惊小弟。停运游戏年年有,今年当然不例外,一年一度的清明节到了,这些游戏生前也是体面人,各位玩家要不上柱香再走吧!灵山奇缘玩法过时,竞争对手太过强大停服
星际战甲为什么不火(warframe后期无聊)近日,Steam上极为火热装备驱动游戏星际战甲(Warframe),在Steam上出现了大量玩家的差评,事情的起因是因为提供游戏简体翻译的义务翻译者因为泄露机密以及态度不佳被官方踢
时辰与养生(十二时辰养生歌!)时辰与养生(十二时辰养生歌!)顺天道以养生,道法自然,应天时调阴阳,时辰治病。古人有发现十二时辰和健康养生有很大关系。便根据每个时辰的阴阳变化规律,积累形成十二时辰养生法。子时养生
时辰与养生(十二时辰养生法)时辰与养生(十二时辰养生法)人与自然是统一的整体,从一年四季二十四节气,到一天十二时辰的变化都有其规律。黄帝内经阐释了时间节律对机体调节的重要性故阳气者,一日而主外,平旦人气生,日
时辰查询(十二时辰对照表)时辰查询(十二时辰对照表)时辰,古代人把一天划分为十二个时辰,每个时辰相等于现在的两小时。相传是根据十二生肖中的动物的出没时间来命名各个时辰。子时(23时至01时)夜半,又名子夜中
时辰对照表(十二时辰更对照表)时辰对照表(十二时辰更对照表)时辰,古代人把一天划分为十二个时辰,每个时辰相等于现在的两小时。相传是根据十二生肖中的动物的出没时间来命名各个时辰。子时(23时至01时)夜半,又名子
经典语录爱情(经典语录爱情美好短句打动人心)经典语录爱情(经典语录爱情美好短句打动人心)1。纵使你平淡无奇,亦是我的无二独一2。你对一个人有欲望,那叫喜欢,你为一个人忍住欲望,那叫爱。3。不管你是路顺众人扶还是墙倒众人推我都