如题:2020年8月
分析:总结来说,操作系统并不是新知识了,所从事的就是嵌入式操作系统,所以知识点应该再细化些!答案:详见《什么是紧缩技术》
如题:2020年8月
答:说是虚拟页式存储,实则是页式存储的内容详见《借助页表计算物理地址步骤:》
(1):实现一次页面访问需要两次访问内存,所以是300ns
(2):书上P186页有相关例子计算。
(150+30)* 0.9 + (150+150)*0.1=192ns(命中只访问了一次内存,但只占90%,剩下10%是需要访问两次内存,两者相加算出平均存取时间,这其实是粗略估算平均时间的方法,有误差)
(3): 1-192/300=0.36 也就是下降了36%
如题:2020年10月
分析:书上P190页有相应的例子。
主要是理解,时间长,时间中,时间短代表什么意思就可以了,这是解题的关键。其实是就是指的“内存中的数据”。
什么是紧缩技术呢?
先要明白,可变分区概念,指不事先划定分区,装入程序时再划定分区。并且动态合并碎片空间。紧缩技术主要是针对碎片,适当时刻合并碎片,合成一个较大连续的空闲空间。从这里就很容易得出答案了,就是A,集中空闲区。
扩展:
什么是存储体系呢?
各种速度和容量的存储器,在操作系统协调之下形成了一种存储层次结构。
什么是内存地址转换?或叫地址重定位?
逻辑地址(用户程序所使用的地址,可以认为是一组“0”地址开始的连续空间)转成绝对地址(物理地址)。
静态重定位:装入程序时,程序中的指令地址和数据地址全部转换成绝对地址。单片机祼机程序编译的过程其实就是这个过程。
动态重定位:在程序的执行过程中,每执行一条指令由硬件地址转换机构完成地址转换。具体步骤:1、系统为程序分内存区域 2、该区域起始地址存入该进程的控制块中 3、该进程被调度时,起始地址存到“基址寄存器” 4、程序执行时,每处理一条指令都会把指令中的逻辑地址与基址寄存器中的值相加,得到绝对地址,然后访问内存。
为什么会有分区管理?
思想其实很简单,就是每个分区装入一个程序。
固定分区:系统事先把内存划分成若干个大小不同的分区,再装入程序。
可变分区:不事先划分固定分区,在装入程序时再划分内存。可变分区为什么会产生碎片呢?可以脑补一种情况,就是回收一块较小的区域,但接下来的程序都大于这块区域,那么这块区域就被空闲了,产生了碎片。当这样的进程很多时,就会不断产生这样的区域。
可变分区实现原理:也是要有硬件地址转换机构。步骤:1、程序被装入分区,分区的起始地址和长度存入进程控制块 2、程序运行时,起始地址装入基址寄存器,长度被装入限长寄存器(也就是分区长度)。3、每处理一条指令,比较指令中的逻辑地址是否小于限长寄存器的限长值,小于就分配,大于就越界,不分配。4、分配策略(算法)设置某种数据结构(一般为两个表,一个是已经分配表,另一个是空闲表)来实现分配与回收。
分区管理与重定位有关系吗?
虽然从可变分区的实现步骤与动态重定位实现步骤很相似,但两个是不同的概念,没有直接的关系。重定位要解决的是寻址问题,而分区要解决的是内存分配与回收问题。
内存扩容的技术原理?
可以将进程地址空间中的信息(指令和数据)的一部分放到外存上,而当前执行的程序段和数据段放到内存上。内外存如何实现信息交换?早期的覆盖技术,还有现在的交换技术。覆盖技术利用逻辑上相互独立的程序段进入内存的先后顺序来实现内存的复用。早期的DOS系统就是这样用。交换技术完全符合扩容的思想。保留一份副本在外存,交换时只交换内存修改的部分。
为什么会产生虚拟存储呢?
思想就是利用大容量外存来扩充内存,实质是扩大内存采取的设计技巧。实现步骤:1、程序开始运行时,将一部分装入内存,另一部分暂留在外存 2、当执行的指令不在内存时,还是需要系统自动从外存调入 3、不同的是,当内存容量不足时,系统会自动选择一部分内存空间,将其内容交换到外存上,并释放这些空间供其他进程使用。这段外存和内存被当作一页来处理。而页是虚拟内存的单位。如下图:
1. 它将主存看成是一个存储在磁盘空间上的地址空间的高速缓存,主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据。
2. 它为进程提供了一致的地址空间,简化了内存管理。
3. 它保护了每个进程的地址空间不被其他进程破坏。
这个虚-实地址的转化是由硬件来实现映射的,结果就是将逻辑上地址连续的程序能实际被分散到几个不连续的内存区域,并正确运行。有了虚拟内存,那么程序里的指针,就很容易实现了。
技术特征:
不连续性:物理内存分配的不连续,虚拟地址空间使用的不连续(数据段和栈段之间的空闲空间,共享段和动态链接库占用的空间)
部分交换:与交换技术相比较,虚拟存储的调入和调出是对部分虚拟地址空间进行的;
大空间:通过物理内存和快速外存相结合,提供大范围的虚拟地址空间
页式存储的基本原理?
书上只讲了虚拟页式存储,实际上还有实分页式存储,思想的基础都是页式存储。也就是看书不一定会得到思路上的连贯性。也正印正了“尽信书则不如无书”那句话,所以看教材不一定会有所得,要想有所得,一定得要提出质疑,然后查资料解决才行。了解页式存储处理思想还是比较重要的。分页式存储把内存分为一个个相等的小分区,再按照分区大小把进程拆分成一个个小部分。基本步骤如下:
1、将整个系统的内存空间划分成一系列大小相等的块,每一块称为一个物理块、物理页或实页,页框或页帧(frame),可简称为块(block)。所有的块按物理地址递增顺序连续编号为0、1、2、……。
2、每个作业的地址空间也划分成一系列与内存块一样大小的块,每一块称为一个逻辑页或虚页,也有人叫页面,可简称为页(page)。所有的页按照逻辑地址递增顺序连续编号为0、1、2、……。
3、一个作业,只要它的总页数不大于内存中的可用块数,系统就可以对它实施分配。系统装入作业时,以页为单位分配内存,一页分配一个块,作业所有的页所占的块可以不连续。系统同时为这个作业建立一个页号与块号的对照表,称为页表。这个过程的实质是由地址空间向存储空间映射的过程。
页表:
页面划分实质就是书上所说的由硬件(Memory Management Unit MMU)来实现页面结构:
页面大小为:4KB
在分页系统中,允许将作业(进程)的任一页装入到内存中的任一可用的物理块中,但进程的地址空间本来是连续的,若把他分页后装入到不相邻的物理块中,要保证系统仍能正确运行,就要实现从进程的逻辑地址变换为内存的物理地址。于是页表就产生了:
借助页表计算物理地址步骤:
页号=逻辑地址 / 页面长度(除法整数部分)
页内偏移地址=逻辑地址 % 页面长度 (取除法的余数部分)
物理地址= 块号(由页表找到页号对应的块号(不一定是连续的) * 页面大小 + 页内偏移地址
什么是快表?如题:2020年8月
分析:由上图可以看到,页表存放于内存中需要两次访问内存,这样的表称为慢表。相应的把页表放到高速缓存中的,高速缓冲寄存器又叫联想存贮器(TLB),对应的就是快表。所以答案选D。快表的地址转换步骤如下图:当进程访问一页时,系统将页号与快表中的所有项进行并行比较。若访问的页在快表中,即可立即进行地址转换。当被访问的页不在快表中时,去内存中查询页表,同时将页表找到的内存块号与虚页号填入快表中。
当逻辑地址空间非常大的解决方案?多级页表,以两级为例:
步骤:1、按照地址结构将逻辑地址分成三个部分
2、从PCB中读页目录表始址,根据页目录表,找到下一级页表在内存中的存放地址
3、根据二级页表找到,找到最终要访问的内存块号
4、结合页内偏移量得到物理地址
有没有更进一步的解决方案呢?Inverted page tables(反置页表)
每个物理页框对应一个表项,按照物理地址排序。每个表项包含与该页框对应的虚拟页面地址,及拥有该页面的进程信息。
反置页表很大,使用Hash表加快检索,所有在内存中的并发进程只有一张页表,除了Hash表,联想寄存器也被用来存放最近使用过的页表项
内存块(页)的如何实现分配与回收?:位示图
分配过程:
1、计算一个作业所需要的总块数N
2、查位示图,看看是否还有N个空闲块
3、如果有足够的空闲块,则页表长度设为N,可填入PCB中;申请页表区,把页表始址填入PCB
4、依次分配N个空闲块,将块号和页号填入页表,这里的块号是需要计算的,计算过程是从位示图中找到相字号(如上图1~7) * 字长 + 位号
5、修改位示图
回收过程:
1、根据要归还的物理地址(块号),计算出位示图中的字号 = 块号 / 字长 ,位号= 块号 % 字长。
2、修改位示图,将字号及位号的占用标志修改为0。
3、把回收的物理页面数加到空闲物理页数中。
虚拟页式存储(virtual paging)基本原理??
系统自动地将作业的地址空间分页,将系统的主存空间分块,页与块等大小,在作业运行前,只把初始需要的一部分页面装入内存块里,运行中需要访问自己地址空间中的但当前不在内存的页面时产生缺页中断,由缺页中断服务程序将所需的页面调入内存,若此时内存中没有空闲物理块安置请求调入的新页面,则系统按预定的置换策略自动选择一个或一些在内存的页面,把它们换出到外存。虚拟页式存储管理实际是实分页技术与虚拟存储技术相结合的产物(也就是说,实分页式与虚拟页式存区别就是虚拟页式存储加入了虚拟页思想,将主存与外存从逻辑上看作是一页),其分页思想与实分页是一样的。
页表:
页表目需要增加外存块号、状态位、访问位或访问字段、修改位、存取控制字段等。
外存块号指出该页在外存的地址,供调入该页时用;
状态位指示该页是否在内存;
访问位或访问字段则是该页被访问过的标志或被访问过的次数;
修改位表示该页是否被修改过;
存取控制字段则是用来限制页面被安全共享的。
内存页面分配策略:场景:在作业运行前,只把初始需要的一部分页面装入内存块里,如何分配内存
a、平均分配。
b、按进程长度比例分配。
c、按进程优先级分配。
d、按进程长度和优先级别分配。
内存置换策略:场景:内存中没有空闲物理块安置请求调入的新页面,如何分配内存
a、固定分配局部置换,常用方法,分配一个固定的页面;若产生缺页的话,只替换你自己空间的东西。
b、可变分配全局置换。
c、可变分配局部置换
页面调度算法:
由缺页中断服务程序将所需的页面调入内存,若此时内存中没有空闲物理块安置请求调入的新页面,则系统按预定的策略自动选择一个(请求调入策略)或一些(预调入策略)在内存的页面,把它们换出到外存。
注:
请求调入策略:当发生页面故障时进行调度,即当进程访问不在内存的页面引发缺页中断时,由系统根据这种访问请求把所缺页面装入内存。
预调入策略:也称先行调度,即一页面被访问前就已经预先置入内存,以减少今后的缺页率。主要适于进程的许多页存放在外存的连续区域中的情况。有的系统结合请求调入使用,即每次缺页时装入多个页面。
淘汰策略:用来选择淘汰哪一页的规则就叫做置换策略,或称淘汰算法。如何决定淘汰哪一页?根据页面在系统中的表现(如:使用的频繁程度、进入系统时间的长短)
颠簸(thrashing):又称为“抖动”。简单地说,导致系统效率急剧下降的主存和辅存之间的频繁页面置换现像称为“抖动”。淘汰的页面恰好是不久又要访问的页面。
最佳淘汰算法——OPT(Optimal)
这是Belady贝莱迪于1966年提出的一种理论上的算法。该算法每次都淘汰以后永不使用的,或者过最长的时间后才会被访问的页面。显然,采用这种算法会保证最低的缺页率,但它是无法实现的,因为它必须知道页面“将来”的访问情况。不过,该算法仍有一定意义,可作为衡量其他算法优劣的一个标准。
先进先出淘汰算法——FIFO
这是最早出现的淘汰算法。
总是淘汰最先进入内存的页面。它实现简单,只需把进程中已调入内存的页面,按先后次序链成一个队列,并设置一个所谓的替换指针,使它总是指向内存中最老的页面。缺点:效率不高,因为它与进程实际的运行规律不相适应,比如常用的全局变量所在的页面或者循环体所在页面都可能被它选为淘汰对象。出现bleady现象。
注:bleady现象
Belady现象:采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多,缺页率(缺页次数F / 页面总访问次数A)反而提高的异常现象。
Belady现象的描述:一个进程P要访问M个页,OS分配N(N
Belady现象的原因:FIFO算法的置换特征与进程访问内存的动态特征是非常不一致的,即被置换的页面通常并不是进程不会访问的
如题:2020年8月
分析:此题符合belady现象,注意区分一下。所以答案选B. D很具有迷惑性,指的就是beladyg现象,但不一定会出现。
最近最久未使用算法(LRU, Least Recently Used)
根据页面调入内存后的使用情况,选择内存中最久未使用的页面被置换。这是局部性原理的合理近似,性能接近最佳算法。OPT算法使用页面将要被访问的时间,LRU算法使用页面最后一次被访问的时间。二者唯一的差别是:OPT是向前看的,而LRU是向后看的。
a、计时法:对于每一页面增设一个访问时间计时器,每当一个页面被访问时,当时的绝对时钟内容被拷贝到对应的访问时间计时器中,这样系统记录了内存中所有页面最后一次被访问的时间。淘汰时,选取访问时间计时器的值最小的页面。常用的计算方法。
b、堆栈法:每当进程访问某页面时,便将该页面的页号从栈中移出,将它压入栈顶。栈顶始终是最新被访问的页面的编号。栈底则是最近最久未被使用的页面的页面号。
c、多位寄存器法:为每页设置一个R位的寄存器,每次访问一页时,将该页所对应的寄存器最左位置1,每隔时间间隔T,所有寄存器右移一位。选择R值最小的页淘汰。
考试基本就考上面三种算法。以下的算法了解下就可以。
二次机会淘汰算法——SC(Second Chance)淘汰算法
这是一种LRU的近似算法,是通过对FIFO算法进行简单改造,结合页表中的访问位而得来一种淘汰算法。
该算法首先检查位于FIFO链链首的页,如果它的访问位为0,则选择该页淘汰;如果它的访问位为1,则清除其访问位,将它移至FIFO链的链尾,重复此算法的查找过程,直至遇到新链首页是一个访问位为0的较早进入内存的页为止,把它选为被淘汰的页。
为每一个存储块(存储分块表)或页面(页表)设立一个引用位。
当访问某页时,就将该页引用位置1
页面管理软件周期性地(设周期为T)将所有引用位重新置0
在T内,被访问过的页面引用位为1,否则为0
选择引用位为0的页面淘汰。
时钟(Clock)淘汰算法
二次机会淘汰算法缺点:就是需要把访问位为1的处于链首的页移至链尾,这需要一定的开销。
改进的方法:就是把进程所访问的页面链成一个环形链表,再设一个指针指向最老的页面,于是形成了一种简单实用的LRU近似算法——时钟淘汰算法。
该算法首先检测指针所指的页面,如果它的访问位为0,则淘汰该页,新装入的页插入到此位置,然后指针前进一个位置;如果它的访问位为1,则清除为0,并将指针前进一个位置,继续检查访问位。重复此过程,直到找到访问位为0的页面为止。
访问页号727
引发缺页
最近未用淘汰算法——NRU(Not Used Recently)淘汰算法
它把FIFO算法的思想与页面的访问位和修改位结合起来确定一个接近LRU算法的淘汰对象。
该算法每次都尽量选择最近最久未被写过的页面淘汰,这种干净的页面可以不被写回到磁盘。在实现时,为每一个页面设置初始值0的访问位和修改位。当对某页面执行写操作时,其修改位和访问位均由硬件置成1;当对某页面执行读操作时,只有其访问位被硬件置成1。系统每隔固定时间将所有访问位都清0。
按照下列次序选择被淘汰的页面:
①访问位=0,修改位=0;直接淘汰;
②访问位=0,修改位=1;写回外存后淘汰;
③访问位=1,修改位=0;直接淘汰;
④访问位=1,修改位=1;写回外存后淘汰;
页面请求序列为:2,3,2,1,5,2,4,5,3,2,5,2
内存分配3块
用OPT、LRU、FIFO、Clock算法写出页面置换过程
时钟clock算法中的箭头是当前指针的位置!
(1)页面调度算法不合理
抖动又叫颠簸,是指一段时间里,页面在内存与外存之间频繁地调度或换入换出,以至于系统用于调度页面所需要的时间比进程实际运行所占用的时间还要多。
显然,抖动是由于缺页中断率很高而引起的一种坏现象,它将严重影响系统的效率,甚至可能使系统全面崩溃。
(2)分配给作业的内存块数太少
作业的缺页中断率与作业所占内存块数成反比。分配给作业的内存块数太少是导致抖动现象发生的最主要的原因,实验分析表明:对所有的程序来说,要使其有效地工作,它在内存中的页面数不应少于它的总页面数的一半。
(3)页面大小的选择不合理
虽然缺页中断率与页面尺寸成反比,但页面尺寸却不能一味地求大,它一般在0.5KB~4KB之间,是个实验统计值。因为页面大时,页表较小,占空间少,查表速度快,缺页中断次数少,但页面调度时间长,页内碎片较大。页面小时,恰恰相反。
(4)用户程序编制的方法不合适
作业的缺页中断率与程序的局部化(包括时间局部化和空间局部化)程度成反比。用户程序编制的方法不合适可能导致程序运行的时空复杂度高,缺页次数多。