连续分配方式
指为一个用户程序分配一个连续的内存空间。
1.单一连续分配
概念:将内存空间分为系统区和用户区。系统区放在内存低地址部分,且仅供OS使用。用户区是除系统区外的其他地内存空间,用户区给用户使用。
缺陷:只适用于单用户、单任务环境。
2.固定分区分配
概念:将内存空间分为若干个固定大小的分区,每个分区中只装入一道作业,允许有几道作业并发运行。
缺陷:由于每个分区的大小固定,所以会造成内存空间的浪费。
3.动态分区分配
概念:按照进程的实际需要,动态的为该进程分配一段连续的内存空间。与固定分区的本质区别是该分区的大小不是固定不变的,但是需要注意的是,在进程的生命周期中,属于该进程的分区大小是不变的。
4.可重定位分区分配
概念:在动态分区分配中有很多分散的不能被利用的小分区(零头、碎片)。通过移动内存中作业的位置可以将这些分散的小分区拼接成一个大分区,这种技术成为拼接(紧凑)。但是每次拼接(紧凑)后都需要对程序和程序需要的数据进行重定位。
非连续分配方式
虚拟内存将主存看成是一个磁盘的高速缓存,主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据。目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。
虚拟内存(VM)系统将虚拟内存分割成称为大小固定的虚拟页(Virtual Page,VP),每个虚拟页的大小为固定字节。同样的,物理内存被分割为物理页(Physical Page,PP),大小也为固定字节(物理页也称作页帧,page frame)。
在任意时刻,虚拟页面都分为三个不相交的部分:
- 未分配的(Unallocated):VM 系统还未分配(或者创建)的页,未分配的页没有任何数据和它们关联,因此不占用任何内存/磁盘空间。
- 缓存的(Cached):当前已缓存在物理内存中的已分配页。
- 未缓存的(UnCached):该页已经映射到磁盘上了,但是还没缓存在物理内存中
页表将虚拟页和到物理页的对应关系。CPU中的内存管理单元(Memory Management Unit,MMU)将一个虚拟地址转换成物理地址时都会读取页表。
页表就是一个页表条目(Page Table Entry,PTE)的数组。虚拟地址的每个页在页表中都有一个对应的PTE。 PTE 是由一个有效位(Valid bit)和一个 n 位地址字段组成的和额外的控制位来控制权限。有效位表明了该虚拟页当前是否被缓存在 主存 中。
- 有效位为 1,则主存缓存了该虚拟页。地址字段就表示主存中相应的物理页的起始位置。
- 有效位为 0,则地址字段的null表示这个虚拟页还未被分配,否则该地址就指向该虚拟页在磁盘上的起始位置。
页命中与缺页
当CPU想要读取包含在某个虚拟页的内容时,如果该页已经缓存在主存中,也就是页命中。但是如果该页没有缓存在主存中,则我们称之为缺页(page fault)。
如上图所示,CPU 引用了 VP3 中的内容, VP3 并未缓存在主存中。系统从内存中读取 PTE3,得知 VP3 未被缓存,这会触发了一个缺页异常。缺页异常会调用kernel的缺页异常处理程序,该程序会选择一个牺牲页。
此时如果 VP4 的内容被修改了,kernel会将它复制回磁盘。接下来,kernel从磁盘赋值 VP3 到内存中的 PP3并更新 PTE3。随后返回用户进程。当异常处理程序返回时,它会重启执行导致缺页的指令,当重新执行这条指令时,因为 VP3 已经在主存中了,此时就是页命中了。
虚拟内存作为内存管理和内存保护的工具,简化了共享机制
内存保护:
1.有了虚拟内存,所以我们的指针操作也不会访问到其他进程的区域,但是哪怕是对于自己的地址空间,很多内存区域也应该是禁止访问的,这不仅包括kernel的区域,也包括自己的只读代码段。那么虚拟内存就提供了这样的一种内存保护工具。
2.PTE 上添加一些额外的控制位来提供内存的访问控制。每个 PTE 额外添加了三个控制位, SUP 位表示进程是否必须运行内核模式,READ和WRITE位分别控制页面的读写权限。如果有指令违反了这些控制权限,那么 CPU 会触发一个故障,并将控制传递给内核中的异常处理程序。该种异常一般称为段错误
共享机制:
如上图所示: 第一个进程的的页表将 VP2 映射到 某个物理页面。而第二个进程同样将它的 VP2 映射到 该物理页面。所以该物理页面都被两个进程共享了。
页面置换算法
1. 最佳
所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。
是一种理论上的算法,因为无法知道一个页面多长时间不再被访问。
2. 最近最久未使用
虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU 将最近最久未使用的页面换出
3. 最近未使用
每个页面都有两个状态位:R 与 M,当页面被访问时设置页面的 R=1,当页面被修改时设置 M=1。其中 R 位会定时被清零。
NRU 优先换出已经被修改的页面(R=0,M=1),而不是最近使用的页面(R=1,M=0)。
4. 先进先出
选择换出的页面是最先进入的页面。
该算法会将那些经常被访问的页面也被换出,从而使缺页率升高。
分页与分段的比较
-
对程序员的透明性:分页透明,但是分段需要程序员显示划分每个段。
-
地址空间的维度:分页是一维地址空间,分段是二维的。
-
大小是否可以改变:页的大小不可变,段的大小可以动态改变。
-
出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间。
参考:https://www.cnblogs.com/yaoxiaowen/p/7805964.html