范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

深入剖析虚拟内存

  1. 前言
  虚拟内存的出现,主要是解决程序运行隔离、内存空间大小问题。CPU是分时运行的,但是内存不可以采用这种方式,如果内存采用分时运行,效率会大大降低(磁盘效率低)。而如果同时运行两个程序的话,如果程序A与程序B如果都在相同的地址上写入数据的话,那么程序的数据会混乱,两个程序会立即崩溃。
  引入虚拟内存之后,每个进程有独立的虚拟地址,程序之间的运行互不干涉 虚拟内存的意义
  - 对下层: 作为对磁盘上的地址空间的高速缓存
  - 对上层:
  - 为每个进程提供一致的地址空间
  - 保护了不同进程地址空间的相互隔离
  2. 虚拟内存地址和物理内存地址
  虚拟内存地址
  程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address)
  物理内存地址
  实际存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)
  操作系统将不同进程的虚拟地址和不同内存的物理地址映射起来,如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了。
  操作系统将虚拟地址映射成物理地址的机制是由CPU芯片当中的内存管理单元(MMU)提供的映射关系来转换为物理地址,然后再通过物理地址访问:
  MMU是Memory Management Unit的缩写,中文名是内存管理单元。它是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制等。
  3. 内存分段
  内存分段是操作管理虚拟地址与物理地址之间关系的方式之一
  程序是由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段(Segmentation)的形式把这些段分离出来。
  分段机制下,虚拟地址与物理地址的映射:
  在分段机制下,虚拟地址由两部分组成:段选择子、段内偏移量
  段选择子段选择子是一个16位的段描述符,该描述符指向定义该段的段描述符。
  RPL:请求特权级别
  TI:TI = 0查GDT表、TI = 1查LDT表
  Index:处理器将索引值乘以8在加上GDT或者LDT的基地址
  段选择子里面最重要的是段号,用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。
  段内偏移量虚拟地址中的段内偏移量应该位于 0 和段界限之间。如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址
  例如,我们将上面的虚拟空间分成以下 4 个段,用 0~3 来编号。每个段在段表中有一个项,在物理空间中,段的排列如下图的右边所示。
  分段的办法很好,解决了程序本身不需要关心具体的物理内存地址的问题,但它也有一些不足之处:
  内存碎片的问题。
  内存交换的效率低的问题。
  4.内存碎片4.1 什么是内存碎片?
  内存碎片分为内部碎片与外部碎片,都是指浪费而不能使用的空间。
  内部碎片是指已分配但未被使用的地址空间。例如在64位空间内,你只适用7字节但由于内存对齐不得不为你分配8字节空间,这就产生了1字节内部碎片。
  外部碎片是指未分配且未使用的地址空间。例如,你申请4字节的Int类型,再申请8字节的long类型,为了内存对齐,其中4字节无法装入8字节类型,这就产生了4字节的外部碎片,如下图所示。
  内部碎片是已被分配的空间,是操作系统不可利用的空间;外部碎片是未被分配的,是可分配的,但该空间过小(碎片的含义)无法装入资源,导致不可利用,但外部碎片是可解决的,可以将多个外部碎片紧凑成一个大的空闲空间,但这需要大量成本。
  4.2 分段导致外部碎片
  假设现在有1G的物理内存,现在开启三个进程:游戏占512MB、聊天软件占256MB、浏览器占128MB,此时我们关闭了浏览器,则空闲内存还有1024-512-256=256MB,如果此时这个256MB不是连续的,就会导致没有足够的空间再打开一个200MB的程序:
  内存碎片的问题
  这里的内存碎片的问题共有两处地方:
  外部内存碎片,也就是产生了多个不连续的小物理内存,导致新的程序无法被装载;
  内部内存碎片,程序所有的内存都被装载到了物理内存,但是这个程序有部分的内存可能并不是很常使用,这也会导致内存的浪费;
  解决外部内存碎片的问题就是内存交换。
  可以把聊天软件占用的那 256MB 内存写到硬盘上,然后再从硬盘上读回来到内存里。不过再读回的时候,我们不能装载回原来的位置,而是紧紧跟着那已经被占用了的 512MB 内存后面。这样就能空缺出连续的 256MB 空间,于是新的 200MB 程序就可以装载进来。
  这个内存交换空间,在 Linux 系统里,也就是我们常看到的 Swap 空间,这块空间是从硬盘划分出来的,用于内存与硬盘的空间交换。
  这是我朋友的MacBook,Mac默认也是开启交换内存空间的。
  分段为什么会导致内存交换效率低?
  对于多进程的系统来说,用分段的方式,内存碎片是很容易产生的,产生了内存碎片,那不得不重新 Swap内存区域,这个过程会产生性能瓶颈。
  因为硬盘的访问速度要比内存慢太多了,每一次内存交换,我们都需要把一大段内存数据写到硬盘上。
  所以,如果内存交换的时候,交换的是一个占内存空间很大的程序,这样整个机器都会显得卡顿。
  swap用英文表示是交换的意思,简单说Swap区就是服务器上的交换区,这块区域其实是硬盘,并不是内存,首先它的用法肯定是用来做交换的,系统是用内存和Swap区做交换,有两个目的,第一个就是减少系统内存碎片问题。第二个是增加内存的使用率,总的来说,它就是为了保证内存的最大化利用
  5.内存分页5.1 概念
  分段的好处就是能产生连续的内存空间,但是会出现内存碎片和内存交换的空间太大的问题。
  要解决这些问题,那么就要想出能少出现一些内存碎片的办法。另外,当需要进行内存交换的时候,让需要交换写入或者从磁盘装载的数据更少一点,这样就可以解决问题了。这个办法,也就是内存分页(Paging)。
  分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,我们叫页(Page)。在 Linux 下,每一页的大小为4KB。
  虚拟地址与物理地址之间通过页表来映射,如下图:
  内存映射
  页表实际上存储在 CPU 的内存管理单元(MMU) 中,于是 CPU 就可以直接通过 MMU,找出要实际要访问的物理内存地址。
  而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。
  5.2 分页如何解决分段的内存碎片、内存交换效率低?
  由于内存空间都是预先划分好的,也就不会像分段会产生间隙非常小的内存,这正是分段会产生内存碎片的原因。而采用了分页,那么释放的内存都是以页为单位释放的,也就不会产生无法给进程使用的小内存。
  如果内存空间不够,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉,也就是暂时写在硬盘上,称为换出(Swap Out)。一旦需要的时候,再加载进来,称为换入(Swap In)。所以,一次性写入磁盘的也只有少数的一个页或者几个页,不会花太多时间,内存交换的效率就相对比较高。
  分页的方式使得我们在加载程序的时候,不再需要一次性都把程序加载到物理内存中。我们完全可以在进行虚拟内存和物理内存的页之间的映射之后,并不真的把页加载到物理内存里,而是只有在程序运行中,需要用到对应虚拟内存页里面的指令和数据时,再加载到物理内存里面去。
  5.3 虚拟地址和物理地址是如何映射的?
  在分页机制下,虚拟地址分为两部分,页号和页内偏移。页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址:
  内存分页寻址
  总结一下,对于一个内存地址转换,其实就是这样三个步骤:
  把虚拟内存地址,切分成页号和偏移量;
  根据页号,从页表里面,查询对应的物理页号;
  直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。
  例如:虚拟内存中的页通过页表映射为了物理内存中的页
  上述的虚拟页与物理页的映射是一种简单的分页,但是这种简单的分页是存在缺陷的
  5.4 简单分页的缺陷
  有空间上的缺陷。
  因为操作系统是可以同时运行非常多的进程的,那这不就意味着页表会非常的庞大。
  在 32 位的环境下,虚拟地址空间共有 4GB,假设一个页的大小是 4KB(2^12),那么就需要大约 100 万 (2^20) 个页,每个「页表项」需要 4 个字节大小来存储,那么整个 4GB 空间的映射就需要有 4MB的内存来存储页表。
  这 4MB 大小的页表,看起来也不是很大。但是要知道每个进程都是有自己的虚拟地址空间的,也就说都有自己的页表。
  那么,100个进程的话,就需要400MB的内存来存储页表,这是非常大的内存了,更别说 64 位的环境了。
  这时候就需要引入多级页表了
  5.5 多级页表
  要简单分页所产生的问题,就需要采用的是一种叫作多级页表(Multi-Level Page Table)的解决方案。
  在前面我们知道了,对于单页表的实现方式,在 32 位和页大小 4KB的环境下,一个进程的页表需要装下 100 多万个「页表项」,并且每个页表项是占用 4 字节大小的,于是相当于每个页表需占用 4MB 大小的空间。
  假设 100 多万个「页表项」的单级页表再分页,将页表(一级页表)分为 1024个页表(二级页表),每个表(二级页表)中包含1024个「页表项」,形成二级分页:
  使用了二级表之后,映射4G的虚拟地址空间就需要4KB(一级页表)+4MB(二级页表)的内存,这样看来,貌似所占用的内存更大了。
  其实想要把二级页表全部用上的话,也就是4GB的虚拟地址全部映射到物理内存上的这种情况,二级分页所占用的空间确实更大了,但是在实际的运行当中,我们往往不会为一个进程分配那么多内存,换个角度来看,计算机当中还存在局部性原理:
  每个进程都有 4GB 的虚拟地址空间,而显然对于大多数程序来说,其使用到的空间远未达到 4GB,因为会存在部分对应的页表项都是空的,根本没有分配,对于已分配的页表项,如果存在最近一定时间未访问的页表,在物理内存紧张的情况下,操作系统会将页面换出到硬盘,也就是说不会占用物理内存。
  如果使用了二级分页,一级页表就可以覆盖整个 4GB 虚拟地址空间,但如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表。做个简单的计算,假设只有 20% 的一级页表项被用到了,那么页表占用的内存空间就只有 4KB(一级页表) + 20% * 4MB(二级页表)=0.804MB
  ,这对比单级页表的 4MB是不是一个巨大的节约?
  那么为什么不分级的页表就做不到这样节约内存呢?我们从页表的性质来看,保存在内存中的页表承担的职责是将虚拟地址翻译成物理地址。假如虚拟地址在页表中找不到对应的页表项,计算机系统就不能工作了。所以页表一定要覆盖全部虚拟地址空间,不分级的页表就需要有 100 多万个页表项来映射,而二级分页则只需要 1024 个页表项(此时一级页表覆盖到了全部虚拟地址空间,二级页表在需要时创建)。
  我们把二级分页再推广到多级页表,就会发现页表占用的内存空间更少了,例如使用64位系统的话,两级分页是不够的,需要采用四级分页:
  全局页目录项 PGD(*Page Global Directory*);
  上层页目录项 PUD(*Page Upper Directory*);
  中间页目录项 PMD(*Page Middle Directory*);
  页表项 PTE(*Page Table Entry*);
  多级页表虽然解决了空间上的问题,但是虚拟地址到物理地址的转换就多了几道转换的工序,这显然就降低了这俩地址转换的速度,也就是带来了时间上的开销。
  程序是有局部性的,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域。
  6.程序的局部性
  我们就可以利用这一特性,把最常访问的几个页表项存储到访问速度更快的硬件,于是计算机科学家们,就在 CPU 芯片中,加入了一个专门存放程序最常访问的页表项的 Cache,这个 Cache 就是 TLB(Translation Lookaside Buffer) ,通常称为页表缓存、转址旁路缓存、快表等。
  在 CPU 芯片里面,封装了内存管理单元(Memory Management Unit)芯片,它用来完成地址转换和 TLB 的访问与交互。
  有了 TLB 后,那么 CPU 在寻址时,会先查 TLB,如果没找到,才会继续查常规的页表。
  TLB 的命中率其实是很高的,因为程序最常访问的页就那么几个。
  7.段也是内存管理
  内存分段和内存分页并不是对立的,它们是可以组合起来在同一个系统中使用的,那么组合起来后,通常称为段页式内存管理。
  段页式地址空间
  段页式内存管理实现的方式:
  先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制;
  接着再把每个段划分为多个页,也就是对分段划分出来的连续空间,再划分固定大小的页;
  这样,地址结构就由段号、段内页号和页内位移三部分组成。
  用于段页式地址变换的数据结构是每一个程序一张段表,每个段又建立一张页表,段表中的地址是页表的起始地址,而页表中的地址则为某页的物理页号,如图所示:
  段页式管理中的段表、页表与内存的关系
  段页式地址变换中要得到物理地址须经过三次内存访问:
  第一次访问段表,得到页表起始地址;
  第二次访问页表,得到物理页号;
  第三次将物理页号与页内位移组合,得到物理地址。
  可用软、硬件相结合的方法实现段页式地址变换,这样虽然增加了硬件成本和系统开销,但提高了内存的利用率。
  总结
  通过深入了解虚拟内存的产生以及在演进过程中的各种改进设计,对于虚拟内存的工作原理,设计有了更加深入的了解,对于我们编程合理规范化使用内存,更大程序发挥内存的作用有着极大的帮助。

1959年人民大会堂举办国宴,天花板上藏着50名黑衣人,他们是谁?1959年的9月30日,喜迎新中国成立10周年,中央决定在人民大会堂举办国宴,邀请来自80多个国家的4000多名各界人士参加,现场气氛一片和谐,然而在人民大会堂的东南角。有一个身着革命者观后感篇一以前学习历史,只知道简简单单的一句话中国共产党成立发展不容易。现在这个不容易被搬上大荧幕才让人感同身受。电影以李大钊上刑的前几个小时为时间线,将铁路工人罢工,报童之死,五四青年以文学之笔描绘壮美画卷!我们这十年强富美高新江苏建设故事主题创作成果首发座谈会在宁召开现代快报讯(记者郑文静)2022年10月12日,我们这十年强富美高新江苏建设故事主题创作成果首发座谈会在南京举行。江苏省委宣传部副部长徐宁,省作协党组书记书记处第一书记汪兴国,省作金秋十月备婚难?8款结婚专用酒盘点,不丢面子不失里子时间都来到十月深秋时节了,因为数字寓意好的缘故,不少人结婚都会选在10月和9月,备婚选什么酒,需要买什么牌子,真的是难倒了一大堆的人,按照中国人的习俗,中世婚礼选酒一定要有大红大紫金秋十月自驾MPV推荐,本田奥德赛对比别克GL8金秋十月,气候适宜,既无酷暑的燥热,也无寒冬的凛冽,正是一个非常适合自驾旅行的季节。倘若带着全家人一起去自驾露营,对于中国大家庭而言,不仅同行人数多,而且行李物品多,想要舒适惬意享黄渤高圆圆张钧甯这些文案太美了有人祝福长命百岁,而有的人祝福乘风破浪。生命的意义更在乎深度和广度比心让人成熟的不是岁月,而是遇见的人爬过的山看过的风景。快乐是什么?是一杯热乎乎的奶茶做快乐的信差,解忧你今天的烦精神疲惫的你有多久没治愈了?这些话让你受益匪浅你太急切的想要一个答案了。想要风光的学位,瞬间的博学,想要意气风发,想闪着金光走向喜欢的人。但现实告诉我,操之过急便会败北,他要我等,要我耐得住不断延长的时间线,要我交付出足够的努把风关在门外临近傍晚时分,一个人走在回家的路上。越走越觉得耳边呼呼的像有人说话。定睛一看,原来是起风了。这个讨厌的风,如果你要跟着我,那就不要那么冷,吹的脸庞冰冷冰冷的。要不然就离开我,回到你写了一篇青少年的担当,欢迎评论点评回首往今,我们不难看出中国如今之变化,国富之繁强,人民之安康,这都是吾辈们辛苦打下来的江山,作为新一代的青年,我们是时候扛起吾辈身上的重担,顶着为往盛世而绝学,为万世而开太平的态度十二句自渡自愈的人生语录,有感而发一世间所有不尽意之事,全靠硬扛。接受成长,也接受所有的不欢散。二努只能及格,拼命才能优秀。早安!三选择任何种活式,都有得有失。所以不羡慕什么,也不抱怨什么。你所能做的,只有保持体和夜读人生该与微笑结伴同行微笑最美。人之姿态,千千万万,唯微笑最美。微笑,是一个人可贵的精神容貌,也是一种儒雅的品性修养。世间万物,都值得珍爱。哪怕是一朵花一株草一棵树,也赋予了生命的意义与希望。只要心里有
降温10,秋日的第一份安全感,面霜给的面霜,作为面部肌肤的保护者,在这个水乳远远招架不住的干燥天气里,是时候重新登场了。Ta具备增强皮肤脂质屏障的功能,有效防止水分流失刺激物或杂质毒素进入皮肤更深层。不仅保湿效果优秀,总是护理面部和身体,甚至嘴唇!什么时候考虑护理眼睛?开篇我们先不聊今天的主题产品,我们先聊一下眼部的保养问题,我相信大多数的女性或者男性,在眼睛护理这款不是很重视,其中主要的一个原因是目前市场上眼部护理类型的产品价格都不算很低。这也Nougat敦集好用又安全的植物染发剂推荐美妆界有句名言说换个发色堪比整容,这话一点也不夸张。染一个适合自己的发色,能够瞬间改变一个人的气质,烘托五官,营造出与众不同的美感。Nougat敦集所以,想要提升颜值,换个发色也是真正靠谱的眼霜,让您的明眸长久焕发迷人光彩眼部肌肤是面部最薄肌肤,同时又是活动最频繁的部位,而且还是化妆中拉扯皮肤次数最多的地方,不小心就黑眼圈眼袋水肿细纹干纹鱼尾纹脂肪粒缺乏神采等问题不断。眼睛是心灵的窗户,但这扇窗却十精选流行女发14款,剪完就是不一样,想不美都难既然你我相遇,那就是缘分,关注时尚,关注发型,关注刘丽丽拥有一款美美的发型,可以给我们的颜值加分不少,因此很多姐妹都想尝试比较流行的发型,今天就给大家精选了14款流行女发,剪完就是8款热门妊娠油测评!娇韵诗帕玛氏百洛油都不如它淡纹来得狠写在前面本篇淡化妊娠纹肥胖纹产品扒的品牌众多,不排除会得罪某些大腕,看到的朋友抓紧时间点赞收藏,以免内容被和谐!很多人说淡化妊娠纹肥胖纹产品都是智商税?我第一个不同意!毕竟是淡纹产秋冬能滋润及舒缓敏感肌肤,无酒精,无香料的洗面奶测评推荐秋冬能滋润及舒缓敏感肌肤,无酒精,无香料的洗面奶测评推荐!多芬微生态洁面液多芬向来是开架护肤品中的性价比王者,在清洁产品的洗感和温和度方面都做得非常不错。这瓶微生态洁面则是众多平价人生意义在哪里,修行修的是什么同样的环境和教育培养出来的人却截然不同,这是因为,人生来就有区别,区别在心智性格的不同。造成这种不同的原因是什么?佛陀说过要知前世因,今生受者是。今生的心智性格等,是前世修行所得。爱国要从身边做起各位老师各位同学大家好!今天我国旗下讲话的题目是爱国要从身边做起。同学们,当我们每一次面对庄严的五星红旗,你的心底是否涌动起热爱祖国报效祖国的壮志豪情?当我们又将迎来一年一度的国庆在新时代下成就无悔青春少年自有凌云志,不负黄河万古流。新时代青年应有凌云的壮志攻坚克难的本领和勇于奉献的精神,在这个大有可为的时代中,尽情展现自我成就自我,无论是冬奥会上运动健儿们的奋力一搏还是疫情防控哭泣的乌克兰乌克兰的鲁莽行为对俄罗斯来说,等于抵住胸口的一把尖刀。为了生存空间的安全,俄罗斯誓要拔掉这把刀。俄罗斯也是一个传统而骄傲的民族,普京不会认输,俄罗斯人的传统血性里也同样流着不承认失