1 虚拟内存
为何需要虚拟内存?
因为假设是单片机,由于没有操作系统,需要把代码用工具3烧录进去,单片机的CPU直接操作内存的物理地址,所以内存不能同时运行两个进程,第一个程序在2000的位置写入一个新的值,将会从擦掉第二个程序存放在相同位置上的所有内容。操作系统为了解决这个问题,引入了虚拟内存地址。。就是操作系统提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来,每个进程都分配一套独立的虚拟地址,当程序访问虚拟地址时,由操作系统转换成不同的物理地址,然后写入的就是不同的物理地址,这样子避免冲突。
虚拟内存地址:程序所使用的内存地址。
物理内存地址:实际硬件里面的空间地址。
进程持有的虚拟地址会通过CPU芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存——
操作系统如何管理虚拟地址与物理地址的关系?
主要通过内存分段和内存分页来管理。
内存分段:程序由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。不同段是有不同的属性的,所以就用分段的形式把这些段分离出来。
分段机制下,虚拟地址和物理地址是如何映射的?
分段机制下,虚拟地址由两部分组成:段选择因子和段偏移量
段选择因子就保存在段寄存器里面。段选择因子里面最重要的是段号,用来作段表的苏索引。段表里面保存这个段的基地址、段界限、特权等级。
虚拟地址就是通过段表与物理地址进行映射的,分段机制会把程序的虚拟地址分成4个段。每个段z在段表中有一个项。
2 内存分段
分段的弊端:内存碎片 , 内存交换效率低
为何分段会有内存碎片?
![](https://img-blog.csdnimg.cn/20210713150422789.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hcmtfamllNjY=,size_16,color_FFFFFF,t_70)
解决外部内存碎片的问题方式:内存交换
为何分段会导致内存交换效率低?
因为使用分段方式很容易产生内存碎片,然后经常需要重新Swap内存区域,容易有性能瓶颈,要是内存交换的是一个很大的空间,就会让机器显得卡顿。
3内存分页
为了解决内存交换效率低的问题,出现了内存分页。
分段好处是产生连续的内存空间。
分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,叫做页,在Linux下,每一页大小为4KB
页表是存储在内存里的,内存管理单元(MMU)就将虚拟内存地址转换成物理地址的工作。而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程运行。
分页如何解决分段的内存碎片和内存交换效率低的问题的?
因为采用分页把内存空间预先划分好,然后内存的释放都是以页为单位的,不会产生无法给进程使用的小内存。当内存空间不够时,操作系统会把运行的进程中的其他最近没有使用的内存页面给释放:就是暂时写在硬盘上,叫做换出,一旦需要了,就加载进来,叫做换入(Swap in),这样子一次性写入磁盘的也是几个页,不用太多时间,内存交换效率比较高。
分页机制下,虚拟地址和物理地址如何映射?
此机制下,虚拟地址分为两部分,页号和页内偏移。页号作为页表的索引,页表包含物理每页所在物理内存的基地址。
内存地址转换步骤:
1 把虚拟内存地址切分为页号和偏移量
2 根据页号查页表得到对应的物理页号
3拿得到的物理页号与偏移量组合形成物理内存地址。
简单分页有什么缺点?
操作系统同时运行很多进程时,需要的页表会很庞大,
多级页表
为解决上面的弊端,使用多级页表,将单级页表再分项,将页表(一级页表)分为1024个页表(二级页表),每个(二级页表)中包含1024个页表项,形成二级分页。如果某个一级页表的页表项没有被用的,也不需要创建这个页表项对应的二级页表,即可以在需要时才创建二级页表。一级页表覆盖到全部虚拟空间,二级页表在需要时创建。
TLB:页表缓存、转载旁路缓存、快表等。
把最常访问的几个页表项存储到访问速度更快的硬件中,所以在CPU芯片中加入一个专门存放经常访问的页表项的Cache,就叫TLB
4 段页式内存管理
内存分段和内存分页不是对立的,可以组合起来在同一个系统中使用,组合起来后,通常称为段页式内存管理。
实现方式:先使用分段机制,把程序划分为许多有意义的段,然后把每个段分为多个页,这样子地址由段号、段内页号和页内位移三部分组成。用于段页式地址变换的数据结构是每一个程序一张段表,每个段又建立一张页表,段表中的地址是页表的起始地址,而页表中的地址则为某页的物理页号。
段页式地址变换中要得到物理地址必须经过三次内存访问:第一次访问段表,得到页表起始地址;第二次访问页表,得到物理页号;第三次将物理页号与页内位移组合,得到物理地址;
5Linux内存管理
6总结