虚拟内存
内存是程序的以进行的基础,进程的进行内存资源是非常必要的,如何在有限的内存中运行足够大的程序,变成了一个非常有挑战的事情,而虚拟内存相对于物理内存可以提供更大的空间。
简单来说,虚拟内存可以让系统看上去去拥有比物理内存大得多的内存空间,为多道程序的执行提供了资源。
虚拟内存为每一个进程提供了非常大的,一致的,独占的虚拟地址空间
虚拟内存提供了三个关键能力
1.虚拟内存将主存看作是在磁盘地址空间上的高速缓存,主存中只保存活
动区域并根据需要在磁盘和主存之间来回传送数据
2.虚拟内存保护每个进程的地址空间不被其他进程破坏
3.虚拟内存为进程提供了一致的地址空间简化了内存管理
这种能力是怎么实现的呢,我们可以先来看一下一般的直接寻址是怎么进行的
CPU直接通过物理地址就找到地址空间,每个进程在直接寻址时可能会碰到其他内存已经占用了的地址空间,而且物理内存的大小也非常有限
而现代处理器使用的虚拟寻址方式是这样子的
中间通过某一种手段间接地访问物理内存,这个过程称为地址翻译,这个过程有什么好处呢,对于CPU来说,看到的虚拟寻址过程都是独立的,它们访问的地址与是否被访问过是没有关系的
采用虚拟内存的关键是,一个应用程序总是逐段被运行的,而且在一段时间内会稳定运行在某段程序中。因此,将需要运行的哪段程序从辅存复制到内存中运行,其它暂不运行的程序段让其仍旧保留在辅存中
因此我们使用虚拟内存不仅更加安全,而且为我们提供了更大的寻址空间,其代价仅仅是添加一层映射
Linux当中的虚拟内存技术
以存储单元为单位来管理显然不现实,因此Linux将虚拟空间分为若干个大小相等的存储分区,Linux将这样的分区称为页。为了换入换出方便,物理内存页按页的大小划分为若干块。由于物理内存中的块空间时用来容纳虚拟页的容器,所以物理内存中的块叫做页框,页与页框是Linux实现虚拟内存技术的基础。
物理内存和虚拟内存被分为页和页框后,其存储单元原来的地址都被自然地分为两段,这两段各自代表着不同的含义:高位段分别叫做页框码和页码用于识别页框和页的编码,低位段分别叫做页框偏移量和页内偏移量是存储单元在页框和页内的地址编码
就是我们刚才说到的虚拟寻址方式,其映射被称为页表,在页表中有一个特殊的单位,其作用是以01来表达是否在物理内存中有效,如果为0,则要发生缺页中断,也就是把不用的页置换出去,让这一页在运行时对应了有效可用的物理地址
可以认为虚拟空间都被映射到了磁盘空间中,事实上是通过mmap按需映射到磁盘空间上,并且由页表记录映射位置,当访问到某个地址的时候,通过页表中的有效位可以得知此数据是否在内存中,如果不是则通过缺页异常将磁盘对应的数据拷贝到内存中,如果没有空闲内存则选择牺牲页面替换其它页面

虚拟内存提供比物理内存更大的空间,确保每个进程拥有独立、一致的地址空间。通过地址翻译,CPU实现虚拟寻址,允许程序逐段运行,提高资源利用率。Linux通过页和页框管理虚拟内存,利用页表记录有效位,实现按需加载和页面替换,确保运行效率和安全性。

被折叠的 条评论
为什么被折叠?



