本文最后更新于:2020年6月27日 晚上

* 接着第一章继续,part.2。。。 *

第一章 温故而知新

1.5 内存不够怎么办

1.早期的计算机中,程序直接运行在物理内存上,即程序在运行时所访问的地址都是物理地址。计算机将有限的物理内存分配给多个程序使用。这种简单的内存分配策略有很多问题。

  • 地址空间不隔离
    所有程序直接访问物理地址,程序所使用的内存空间不是相互隔离的。恶意程序可以很容易改写其他程序的内存数据。

  • 内存使用效率低
    一个程序执行时,监控程序直接将整个程序装入内存中然后开始执行。如果要运行一个需要内存非常大的程序,此时剩余可用的内存已经不够了,此时可以将其他程序的数据暂时写入磁盘,等到要用时再读回来。整个过程中有大量的数据在换入换出,导致效率十分低下。

  • 程序运行的地址不确定
    程序每次装入运行时,需要给它从内存中分配一块足够大的空闲区域,此时空闲区域的位置是不确定的。这样影响了之后访问数据和指令跳转时的目标地址,涉及程序的重定位(PS:在后面的链接部分有讲,看了之后真是恍然大悟。。。)。

解决这些问题的法宝:增加中间层,即使用一种间接的地址访问方法。把程序给出的地址看作一种虚拟地址(Virtual Address),通过某些映射方法,将虚拟地址转换成实际的物理地址。只要能妥善地控制这个虚拟地址到物理地址的映射过程,就可以保证任意一个程序所能访问的物理内存跟另一个程序相互不重叠,达到地址空间隔离的效果。

1.5.1 关于隔离

1.所谓地址空间可以想象成一个很大的数组,每个数组的元素都是一个字节,这个数组的大小由地址空间的地址长度决定。地址空间分为两种:虚拟地址空间(Virtual Address Space)物理地址空间(Physical Address Space)。物理地址空间是实实在在存在的。虚拟地址空间是指虚拟的、人们想象出来的地址空间,其实它并不存在,每个进程都有自己独立的虚拟空间,而且每个进程只能访问自己的地址空间,有效地做到了进程的隔离。

1.5.2 分段(Segmentation)

1.最开始使用分段(Segmentation)的方法,基本思路是把一段与程序所需要的内存空间大小的虚拟空间映射到某个地址空间。把这两块相同大小的地址空间一一映射。即虚拟空间中的每个字节相对应于物理空间中的每个字节。映射过程由软件来设置。

段映射机制

分段的方法解决了第一个和第三个问题。做到了地址隔离程序不再需要重定位。但依旧没有解决内存使用效率的问题。分段对内存区域的映射以程序为单位,还是会将整个程序换入换出到磁盘。

1.5.3 分页(Paging)

1.根据程序的局部性原理当一个程序在运行时,在某个时间段内,它只是频繁地用到了一小部分数据。使用更小粒度的内存分割和映射的方法,使程序的局部性原理得到充分利用。

2.分页是将地址空间人为地等分为固定大小的页,每一页的大小由硬件决定,或硬件支持多种大小的页,操作系统决定页的大小。但在同一时刻只能选择一种大小。目前几乎所有的PC上的操作系统都使用4KB大小的页。

3.当进程的虚拟地址空间按页分割时,把常用的的数据和代码页装载到内存中,把不常用的代码和数据保存在磁盘里,当需要用的时候从磁盘中读取

进程虚拟空间、物理空间和磁盘之间的页映射关系

虚拟空间的页叫做虚拟页(VP,Virtual Page),物理内存中的页叫做物理页(PP,Physical Page),磁盘中的页叫做磁盘页(DP,Disk Page)。有些虚拟空间的页被映射到同一个物理页,实现了内存共享

4.当进程所需的页不在内存中时,硬件会捕获此消息,即页错误(Page Fault),操作系统接管进程,将需要的页从磁盘中读出并装入内存,之后建立映射关系。

5.保护也是页映射的目的之一,每个页可以设置权限属性。

6.虚拟存储的实现需要依靠硬件的支持。几乎所有的硬件都采用MMU(Memory Management Unit)部件进行页映射。

虚拟地址到物理地址的转换

在页映射模式下,CPU发出Virtual Address,即虚拟地址。经过MMU转换变成Physical Address。

* 下次继续线程相关吧。。。 *