os CH9 虚拟内存
CH9 虚拟内存
这一章9.2和9.4最重要
9.1 background
虚拟内存的基本思路是,只将当前正在运行需要的代码装入内存(因为代码只有装入内存才可以执行);其将逻辑地址空间和虚拟地址空间分开,允许多个进程共享内存
根据如下的局部性原理:可以一次只加载一部分数据就执行。因此,可以让虚拟内存地址空间比物理地址空间大很多 虚拟地址空间的结构如下:
以及共享页的概念:一段内容被多个进程共享,而每个进程都会认为自己独占这部分内容
9.2 Demand Paging(按需调页、请求调页)
这个就是每次选择需要使用的页调入的算法
lazy swapper:除非需要用某个进程的某个页面,才会使用调页程序进行调页(注意,这里不是使用交换器,交换器交换的是整个进程)
在页表里面,使用valid/invalid来标志这个页是否在内存中;如果访问了一个invalid的页,会触发page fault。完整的页表项的内容如下:
9.2.2 缺页
那么,在发生page fault之后,如果当前物理内存中没有空闲的页,那么就需要把一个页换出;这个时候,就需要使用适当的页置换算法,将最近不适用的页换出。
page performance像这样衡量:可以看出当出现缺页错误的时候,会多花费不少时间
计算缺页时间必须的内容;
9.3 Process Creation(进程创建)
介绍CoW(写时拷贝)技术:比如说进程1和进程2共享一段物理memory,这个时候如果进程1需要修改pageC的memory,这个时候选择复制pageC然后再修改,如下所示:
9.4 页面置换
触发缺页,需要将新的页拿到memory中,但是memory已满的时候,就需要使用页面置换算法;置换的时候,swap in是肯定需要的;然后根据dirty bit标志的其是否修改,来决定是否要写出去(主要是数据之类的需要修改)基本的流程如下:
9.4.1 FIFO
就是将最早进入内存的那一页置换出去
9.4.2 OPT
选择未来不再使用,或者离当前位置最远的页置换出去(这是一个理论上的算法)
9.4.3 LRU
选择内存中最久没有被使用的页面置换出去;相当于,OPT是向后看未来的串决定,LRU是向前看过去的决定
有三种实现LRU的方法:
可以看出,LRU算法需要硬件的支持会比较大;(自己做题的时候,用一个栈实现会比较方便)
9.4.4 NRU算法(近似的LRU算法)
有一个引用位,每次引用就会置1;然后用一个8位的寄存器,记录最近8次的引用情况,就可以知道应该替换哪一个页面
理解如上;二次机会相当于,如果为1,那么置为0然后继续往下找;以及一种改进过的clock算法
这里有两种感觉“矛盾”的算法:替换最不经常使用的和最经常使用的(道理上都有道理)- 以及还有一个页面缓冲算法(感觉不重要,到时候看ppt)
9.5 Allocation of Frames(帧分配)
帧分配问题的核心是:在多个进程共享物理内存时,如何将有限的物理内存帧(Frame)公平、高效地分配给各个进程。
首先理解一下这个例子:在糟糕的情况下,这样一条指令可能导致6次缺页(指令、from、to的二进制数分别跨越了两个页,并且其全都不在物理内存中)
全局置换说的是可以从其他进程拿帧替换;以及两种分配策略(固定、可变),一共有四种分配-置换方法;但是没有一种,如下所示
现在os一般用第二种
9.6 Thrashing (颠簸、抖动)
抖动指的是,某一个进程一直在发生缺页,一直在忙于换入换出,导致其效率十分低下(因为一直忙于I/O,cpu利用率很低)具体的后果如下:
要想解决threading有若干的方法,这里重点聚焦下面的工作集算法 这部分最重要的就是工作集的概念:
理解一下:前者指的是出现页面的总数(计重数),WS是所有页面,如下所示
,这里的delta代表了一个访问的时间窗口
9.7 Memory-Mapped Files(内存映射文件)
这是一种系统提供的:
通过文件映射的形式,让操作系统来实现
buddy system:每次都把大的地址一分为二,然后进行分配