操作系统(哈工大****)第21讲到第25讲

第二十一讲 内存分区和分页

对程序进行分段处理,是由于程序本身的各段的特性决定的,在编译阶段完成;
将分割好的程序的各个段放入到内存,需要知道内存的分割方法,以来将程序放到内存的各个分区中
操作系统(哈工大****)第21讲到第25讲
固定分区过于固化,实际应用中使用的是可变分区
操作系统(哈工大****)第21讲到第25讲
分区的请求:在空闲分区中找到目标,随后更新空闲分区表和已分配分区表
操作系统(哈工大****)第21讲到第25讲
分区的释放:
操作系统(哈工大****)第21讲到第25讲
分区的再次申请:这里涉及到算法,算法本身没有对错,只有优缺点;首先适配是找到第一个可以分配所需内存的内存;最佳适配是找到所有适配的空闲内存块中最小的一个;最差适配是找到所有适配的空闲内存块中最大的一个;
操作系统(哈工大****)第21讲到第25讲
由于内存分区的方法存在所分的内存的大小很难和所需的各种内存的块的大小相匹配,效率低下,这就引入了实际中分割物理内存的方法:分页
分区导致的问题是内存碎片,而解决内存碎片的内存紧缩方法又很麻烦,造成死机的现象,实际系统中不太可行
操作系统(哈工大****)第21讲到第25讲
操作系统在初始化的时候将内存进行分页,形成mem_map,这样每个进程的各个段在请求内存时,一页一页的进行分配内存,不会产生段间的碎片,但依旧会存在页内碎片;这样内存中页的大小很关键
操作系统(哈工大****)第21讲到第25讲
这样为了避免内存碎片的产生,物理内存方面希望采用分页技术,而从用户的角度看,程序希望使用分段的特点
而页在载入到内存后,指令的调用,同样需要地 址的翻译:将程序分成段,将段打散成多个页,再将页存入到物理内存,这个过程中构建了页表,由于后面的地址翻译和索引
操作系统(哈工大****)第21讲到第25讲

第二十二讲 多级页表与快表

为了提高内存的空间利用率,页就应该小,但是页小了,对应的逻辑页号就多了,这样为了映射逻辑页号和物理页号,所使用页表就大了;页大了,就造成了内存浪费,产生页内碎片;
页表太大,那么页表的放置就成了问题
操作系统(哈工大****)第21讲到第25讲
为了放置页表,第一种尝试:只存放用到的页表;页表的目的是根据逻辑页找到物理页
操作系统(哈工大****)第21讲到第25讲
注意这里16K是怎么来的:一个表是2^10,既4K,这里有一个页目录的页表,3个页号的页表,共4个,故总16K
操作系统(哈工大****)第21讲到第25讲
多级页表在增加了空间上的高效同时,造成了访存数量的增加,既降低了时间上的效率;这样提出了类似于“高速缓存”的快表;这就是实际上的多级列表和快表结合的查找方式
操作系统(哈工大****)第21讲到第25讲
TLB能够起到预期总用的是前提是命中率足够高,这是基于程序运行的局部性
操作系统(哈工大****)第21讲到第25讲
操作系统(哈工大****)第21讲到第25讲

第二十三将 段页结合的实际内存管理

分段是从用户编写的程序的角度看,对用户的理解来说很好;分页是从更好的利用实际物理内存的角度看,对合理的高效的的利用内存来说,很好;故两项结合,形成了实际的内存管理;
操作系统(哈工大****)第21讲到第25讲
操作系统中的虚拟内存系统最终实现的效果是:对用户来说,是使用段的方式;对物理内存来说,是使用页的方式;
具体的工作方式是:对程序来说,在虚拟内存中分割出对应的段,然后在操作系统中将虚拟内存中的段打成一页一页,和物理内存中的页关联起来;这样就可以将程序放到内存中
操作系统(哈工大****)第21讲到第25讲
段、页同时存在时的重定位(地址翻译):
操作系统(哈工大****)第21讲到第25讲
操作系统(哈工大****)第21讲到第25讲
将程序放入到虚拟内存,将虚拟内存割取一段作为程序的分段的段,建立段表;将虚拟内存的段分割成页,将页放入物理内存,建立页表;能够根据程序的地址重定位于物理内存;这样最终完成了将程序放入物理内存,并能够从内存中取指执行
操作系统(哈工大****)第21讲到第25讲
操作系统(哈工大****)第21讲到第25讲
割虚拟内存,建立段表
操作系统(哈工大****)第21讲到第25讲
割物理内存,建立页表:这里是父进程和子进程共用相同的物理内存
操作系统(哈工大****)第21讲到第25讲
操作系统(哈工大****)第21讲到第25讲
操作系统(哈工大****)第21讲到第25讲
操作系统(哈工大****)第21讲到第25讲
操作系统(哈工大****)第21讲到第25讲
接下来是使用放进去程序后的内存:这里起初父进程和子进程具有相同的物理地址,但在父进程将地址p=0X300地址内的内容赋值为7后,该地址修改为只读,这样,在子进程进入该p地址,并想再次赋值8时,就需要从新在物理内存中找到一块空闲的页给p作为映射,然后更新子进程的页表;此既写时复制
操作系统(哈工大****)第21讲到第25讲

第二十四讲 内存换入——请求调页

操作系统(哈工大****)第21讲到第25讲
虚拟内存的换入换出对用户实现了“大内存”的感觉;需要那块逻辑内存的地址,就将对应的磁盘上的对应部分换入到内存中
操作系统(哈工大****)第21讲到第25讲
实现换入的核心是请求调页:当访存到虚拟地址中的页不存在时,中断,进行调页处理,然后更新页表,重新从断点开始执行
操作系统(哈工大****)第21讲到第25讲
初始化页错误的中断类型
操作系统(哈工大****)第21讲到第25讲
操作系统(哈工大****)第21讲到第25讲
操作系统(哈工大****)第21讲到第25讲
操作系统(哈工大****)第21讲到第25讲

第二十五将 内存的换出

有换入,那必将有换出,因为不停的换入,内存总会有爆满的时候,此时,就需要将内存中的部分内容换出,以腾出内存存储新的内容,否则就会溢出;换出就涉及到算法,来决定淘汰哪一个要换出的页;
操作系统(哈工大****)第21讲到第25讲
FIFO方法依旧是简单,易实现,但同时会造成效率的低下,比如这里D将A刚换出,但A就需要再次换入,这就造成了频繁的缺页错误
操作系统(哈工大****)第21讲到第25讲
MIN页面置换算法是理论上最优的算法,每次将随之以后最晚使用的对象换出;但如何能够实现未来呢?
操作系统(哈工大****)第21讲到第25讲
LRU(Least Recently Used)页面置换算法:也是利用了程序的局部性原理,使用过去的历史预测未来,既选最近最长一段时间没有使用的页淘汰(最近最少使用);
操作系统(哈工大****)第21讲到第25讲
时间戳的概念模拟可行,但实际应用到操作系统中不可行,每次运行,修改维护时间戳的成本太高,且时间戳在实际使用中还可能发生溢出的情况
操作系统(哈工大****)第21讲到第25讲
使用页码栈的方法,每次修改维护指针同样需要多次访存,消耗过大
操作系统(哈工大****)第21讲到第25讲
LRU的准确实现在实际中代价太大,这样就有了使用LRU近似实现的方法,既Clock算法
操作系统(哈工大****)第21讲到第25讲
由于实际运用中,同样由于程序的局部性,可能会造成缺页点的情况相对于命中的情况小的多,这就造成了整个时钟上的页的引用位全部置为了1,当下次再发生缺页的时候,就会在是时钟圈上走一遍,把全部的页的引用为置为0后,返回到开始的位置,把开始指向的第一个页给置换出去;这就引出了Clock算法的改进,既引入一个新的扫描指针,来定时的清理引用位,将引用位上的1 置为 0,这就保留了最近的特性
操作系统(哈工大****)第21讲到第25讲
在有了换入换出后,给进程分配多少的页框同样是个综合考虑的问题:分配的过多,体现不出来调页导致的内存高效的利用;但分配的过少,可能造成进程一直处于换入换出状态,这就造成了颠簸;当进程不断的增多时,如果没用限制进程的最大量,同样会造成这种颠簸的现象;
操作系统(哈工大****)第21讲到第25讲
操作系统(哈工大****)第21讲到第25讲