程序员不得不会的计算机科班知识——操作系统篇(下)

939 阅读52分钟

计算机科班知识整理专栏系列文章:

【1】程序员不得不会的计算机科班知识——操作系统篇(上)
【2】程序员不得不会的计算机科班知识——操作系统篇(下)
【3】程序员不得不会的计算机科班知识——数据库原理篇(上)
【4】程序员不得不会的计算机科班知识——数据库原理篇(下)
【5】程序员不得不会的计算机科班知识——数据结构与算法篇(上)
【6】程序员不得不会的计算机科班知识——数据结构与算法篇(下)
【7】程序员不得不会的计算机科班知识——软件工程篇(上)
【8】程序员不得不会的计算机科班知识——软件工程篇(中)
【9】程序员不得不会的计算机科班知识——软件工程篇(下)
【10】程序员不得不会的计算机科班知识——编译原理篇(上)
【11】程序员不得不会的计算机科班知识——编译原理篇(中)
【12】程序员不得不会的计算机科班知识——编译原理篇(下)
【13】程序员不得不会的计算机科班知识——计算机网络篇(上)
【14】程序员不得不会的计算机科班知识——计算机网络篇(中)
【15】程序员不得不会的计算机科班知识——计算机网络篇(下)

三、存储管理

例题整理:

1. 地址有哪几种?它们之间的转换是由什么来完成,装入的方式有几种?链接的方式有几种?

  • 地址分为三种:

    1. 符号地址:在源程序中,是通过符号名来访问子程序和数据的,这些符号名实际代表了地址,称为符号地址。例如,变量,子程序名,函数名,标号等。
    2. 逻辑地址(相对地址):程序中使用的从0开始进行编址的地址。地址空间。
    3. 物理地址(绝对地址):内存单元的地址。存储空间。
  • 不同种类地址之间的转换:

  • 装入的方式有三种:

    1. 绝对装入:程序使用绝对地址编写,装入内存时装入到程序规定的地方,不需要进行地址变换。
    2. 静态重定位装入:程序使用逻辑地址编写,装入内存后在执行之前进行地址变换。
    3. 动态重定位装入:程序使用逻辑地址编写,程序执行过程中,即每次访问内存单元前才进行地址转换。
  • 链接的方式有三种:

    1. 静态链接方式:经编译/汇编之后,将目标模块在运行之前组合在一起形成一个独立运行模块(可执行文件)。
    2. 装入时动态链接:经编译后的模块在装入内存准备运行前进行链接。
    3. 运行时动态链接:在执行过程中若发现需要的某目标模块没有装入内存链接,则将它装入内存并链接。

2. 要掌握动态分区的移动合并。

主存空间的分配和回收

系统初启时,整个用户区可看作一个大的空闲区。当作业要求装入时,根据作业对内存需求量,从空闲区中划出一个与作业大小一致的分区来装入该作业,剩余部分仍为空闲区。当空闲区能满足需求时(即空闲区长度>=作业长度),作业可装入;否则,作业暂时不能装入。图3.9是可变分区存储空间分配示意。

装入内存的作业执行结束后,所占分区被收回成为一个空闲区,这个空闲区又可用于装入其他作业。随着作业不断装入和撤离,内存空间被分成许多分区,有的被作业占用,有的空闲。如图3.10所示。可见内存中空闲区数目和大小是在不断变化的。

系统设置一张“ 空闲区表 ”,用来记录空闲区的起始地址和长度。当有作业要装入内存时,在空闲区表中找一找“ 未分配 ”的栏目,从中找出一个能容纳作业的空闲区。若空闲区大于作业的长度时则被分成两部分,一部分分配给作业;另一部分仍作为空闲区登记在表中。若找到的空闲区等于作业长度时,分配后该栏目状态改为“空”状。当有作业撤离收回所占分区后,应把收回区域的起始地址和长度登记在状态为“空”的栏目中,且将状态改为“未分配”。如果收回的区域正好和某一空闲区相邻,则应将其合并成一个分区后登记。如图3.11所示。

可变分区方式常用的内存分配算法有:“最先适应”分配算法、“最优适应”分配算法、“最坏适应”分配算法。
1. 最先适应分配算法(FF):
每次分配总是顺序查找空闲区表,找到能满足长度要求的空闲区就分配。优点是实现简单,缺点是可能将大的空闲区分割成许多小的空闲区,形成许多不连续的“碎片”。碎片长度可能不能满足作业要求,降低了内存利用率。
改进方法,可把空闲区按地址顺序从小到大登记在空闲区表中,有利于大作业。问题是归还空区时须按地址插入表中适当位置。(即"循环首次适用"分配算法NF)
2. 最优适应分配算法(BF):
按作业要求从所有空闲区中挑选一个能满足要求的最小空闲区,这样保证不去分割一个更大的区域,使装入大作业时比较容易得到满足。实现办法:将空闲区按长度以递增次序登记在表中,分配时按空闲区表顺序查找即可。缺点是可能碎片更小而无法使用。回收时也要按长度插入。
3. 最坏适应分配算法(WF):
这种算法总是挑选一个最大的空闲区分割一部分给作业使用,使剩下部分不致太小,仍可供分配使用。实现办法:空闲区表中的登记项按空闲区长度递减顺序排列,按序查找分配。

图3.12是上述分配算法的示例。


地址转换和存储保护

采用可变分区方式时,一般采用动态重定位方式装入作业。因此要有硬件的地址转换机构支持。硬件设置两个专用的控制寄存器:基址寄存器和限长寄存器,以及一些加法和比较线路等如图3.13所示。

1685697542895.jpg

当某作业可以占用处理器时,进程调度便把该作业所占分区首地址(如a)送入基址寄存器,将作业所占分区最大地址(如a+k)送入限长寄存器。CPU 每执行一条指令时都要由硬件的地址转换机构把逻辑地址转换成绝对地址。其绝对地址应满足下式:基址寄存器内容<=绝对地址<=限长寄存器内容。 否则,产生一个地址越界中断,停止程序执行。  

在多道程序设计系统中 ,也只需一对基址寄存器和限长寄存器及PSW,改变当前运行进程时 ,要注意保护和恢复这些现场信息,一般保存在各进程的PCB中。

移动技术

由于可变分区方式有硬件的地址转换装置支持,且多采用动态重定位装入作业,因而需要时可对内存中作业改变存放区域。这种工作称为“移动”,由操作系统来完成。如图3.14所示。

移动技术主要用于实现下述两个目的:
1. 集中分散的空闲区
使用移动技术可将分散的空闲区连成一片形成一个大的空闲区,便于容纳新作业。
2. 便于作业动态扩充内存
一道作业在执行过程中要求扩充内存,只要移动邻近的作业就可增加所占连续区内存。
完成上述工作要做两件事:一是在内存中移动程序,其次要适当修改相应作业的基址寄存器和限长寄存器的内容。

当然,移动会增加系统的开销;而且,也不能任意移动作业,比如若一道作业正在等待外围设备I/O数据时,就不能移动该作业。这是由于外围设备和内存间信息交换是按绝对地址进行的,若这时改变了存放区域,作业和外围设备之间交换就不是正确的信息。又如动态扩充内存可能导致死锁发生。例如,内存由A,B两进程占用,若A申请动态扩充内存,不满足,则等待;而B也申请动态扩充内存,不满足,则也等待。于是,死锁发生!

3. 对换

  • 所谓“对换” ,是指将暂时不用的某个进程及数据(首先是处于阻塞状态优先级最低的)部分(或全部)从内存移到到外存(备份区或对换区)中去,让出内存空间,同时将某个需要的进程调入到内存中,让其运行。

  • 对换的类型

    1. 整体对换:进程对换,解决内存紧张问题。 (中级调度)
    2. 部分对换:页面对换/分段对换,提供虚存支持。
  • 对换空间的管理

    1. 具有对换功能的 OS 中,通常把外存分为文件区和对换区。前者用于存放文件,后者存放从内存换出的进程。对换区比文件区侧重于对换速度。因此对换区一般采用连续分配。
  • 进程的换出与换入

    1. 选择换出进程:优先级,进程状态。

    2. 选择换入进程:优先级,进程状态,换出时间等。

4. 掌握常见页面置换算法

  • 地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。

先进先出(FIFO)

  • 原理:把内存中驻留时间最久的页面置换算法予以淘汰。
  • 特点:实现简单,但是性能较差,且存在Belady异常现象:分配块增加,缺页次数增加。
  • 例子:

例题:在分页中,采用FIFO页面置换算法,序列 4,3,2,1,4,3,5,4,3,2,1,5,当物理块为3时,计 算缺页次数和缺页率?
解:算法执行如下步骤:

  1. 程序运行时,先将4,3,2三个页面装入内存;
  2. 之后,当进程要访问页面1的时候,将会产生缺页中断此时根据先进先出置换算法,因为页面4是最先进入内存的,所以将页面4换出;同理4 3 5分别替换3,2,1;
  3. 当进程4要访问时,因为它已存在在内存所以不必产生缺页中断; 当页面2要访问时,又引起缺页中断淘汰4;
  4. 依次类推直到最后一个页面访问完。图为采用先进先出置换算法的置换图。由图可得,采用先进先出置换算法发生了9次缺页中断。先进先出的页面置换比最佳置换算法的页面置换正好多了一倍。
    可以知道:
  5. 当数字不在框中,横着找最长的连续数字(划掉),将新的数字填入
  6. 当数字在框中,则不做改变,即空白列

因此:
缺页次数=总列数-空白列数=9
缺页率=缺页数/总列数=75%

最近最久未使用(LRU)

  • 原理:选择最近且最久未被使用的页面进行淘汰。
  • 特点:性能好,应用广,但是会增加硬件消耗。
    例子:

例题:在分页中,采用LRU页面置换算法,序列 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1当物理块为3时,计算缺页次数和缺页率?
解:算法执行以下步骤:

  1. 程序运行时,先将7,0,1三个页面装入内存。
  2. 之后,当进程要访问页面2的时候,将会产生缺页中断。此时根据最近最久未使用置换算法,因为页面7是最近最久未被使用的的,所以将页面7淘汰;
  3. 当进程0要访问时,因为它已存在在内存所以不必产生缺页中断;
  4. 在进程要访问页面3的时候,因为页面1是最近最久未被使用的,所以将页面1淘汰;
  5. 依次类推直到最后一个页面访问完。下图为采用最近最久未使用的置换算法的置换图。由图可得,采用最近最久未使用置换算法发生了9次缺页中断。

可以知道:

  1. 当数字不在框中,从头找第一个未被划掉的数字进行替换
  2. 当数字在框中,划掉从前往后数和数字一样的第一个数字

最佳替换算法(OPT)

  • 原理:每次选择未来长时间不被访问的或者以后永不使用的页面进行淘汰。
  • 特点:性能好,可以保证获得最低的缺页率,是一种理想化算法,但是实际无法实现,因为无法预知一个进程中的若干页面哪一个最长时间不被访问。
  • 例子

例题:在分页中,采用OPT页面置换算法,序列 7,0,1,2,3,0,4,2,3,0,3,2,1,2,0, 1,7,0,1,当物理块为3时,计算缺页次数和缺页率?
解:算法执行以下步骤:

  1. 程序运行时,先将7,0,1三个页面装入内存。
  2. 之后,当进程要访问页面2的时候,将会产生缺页中断。此时根据最佳置换算法,因为页面7要在第18次才能访问,页面0在第5次访问,页面1在第14次访问,页面7最久不被使用,所以将页面7淘汰;
  3. 当进程0要访问时,因为它已存在在内存所以不必产生缺页中断; 当页面3要访问时,又引起缺页中断淘汰1;
  4. 依次类推直到最后一个页面访问完。下图为采用最佳置换算法的置换图。由图可得,采用最佳置换算法发生了6次缺页中断。

可以知道:

  1. 当数字不在框中,从当前向后找最后一个将要访问的数字进行替换
  2. 当数字在框中,则不做改变,继续向后

5. 地址重定位的概念?有几种定位方式,结合内存管理方法,说明采用哪种地址重定位方式。

  • 地址重定位:要把它装入内存执行,就要确定装入内存的实际物理地址,并修改程序中与地址有关的代码,把逻辑地址变换为物理地址,这个过程称为地址重定位。
  • 按照重定位的时机,可分为静态重定位和动态重定位。
  • 分页、分段、段页式、可重定位动态分区等采用动态地址重定位,固定分区、动态分区一般采用静态地址重定位。
  • 地址重定位的特点:特点是:(1)由硬件实现;(2)在程序运行过程中进行地址变换。

6. 会计算逻辑地址到物理地址,特别是分页、分段。逻辑地址到物理地址的转变,页表大小跟逻辑地址有关,跟物理地址无关。

由逻辑地址求物理地址例题

例题:

某虚拟存储器的用户编程空间共64个页面,每页为1KB,内存为16KB。假定某时刻一用户页表中已调入内存的页面的页号和物理块号的对照表如下:
页号       物理块号
0                   3
1                   7
2                   9
3                   5
则逻辑地址0A5C(H)所对应的物理地址是什么?要求:写出主要计算过程。
解:

  1. 用户编程空间共64个页面,2ˆ6=64 得知页号部分占6位,。由“每页为1KB”,1K=210,可知内页地址占10位。由“内存为16KB”,24=16,得知块号占4位。
  2. 逻辑地址0A5C(H)所对应的二进制表示形式是:0000101001011100,后十位1001011100是页内地址,0 000010为为页号,页号化为十进制是2,在对照表中找到2对应的物理块号是9,9转换二进制是1 0 01,即可求出物理地址为10 011001011100,化成十六进制为265C。
  3. 即则逻辑地址0A5C(H)所对应的物理地址是265C。

分页存储管理方式

  • 一些概念:

    1、(物理)块:内存划分成多个小单元,每个单元K大小。
    页面:作业也按K单位大小划分成片
    物理划分块的大小 = 逻辑划分的页的大小
    2、页表:记录每个作业各页映射到哪个物理块,形成的页面映射表
    作用:页号到物理块号的地址映射
    页表存在内存(或寄存器)中,但页表地址存在PCB 中
    3、作业相对地址(逻辑地址)= 页号+页内地址(即页内偏移)
    因此由逻辑地址求物理地址的关键计算是:  根据系统页面大小找到不同意义二进制位的分界线。从地址中分析出页号后,地址映射只需要把页号改为对应物理块号,偏移不变,即可找到内存中实际位置。
    4、分页存储管理方法较好地解决了“外零头”问题。

  • 计算口诀:

    1. 页面大小决定偏移量(页内地址)的位数 n

    2. 作业大小——>页面数量

      ——>页表长度 a
      ——>页号的位数 m(或总位数-页内位数)

    3. 内存容量决定块数,块数决定编址位数,即页表项位数 b。

  • 分页系统的地址变换机构:

(2次内存访问)

  • 具有快表的分页系统的地址变换机构:

  • 两级页表:将页表分页,并离散地将页表的各个页面分别存放在不同的物理块中

逻辑地址结构:外层页号   +  页在外页中的偏移  +  业内地址(偏移)
具有两级页表的地址变换机构:
(3次访问内存)

分段存储管理方式

  • 每段占据一块连续的内存
  • 地址结构:段号 + 段内地址
  • 段表与地址变换机构:

(2次访问内存)

  • 优点:易于实现共享、易于实现保护

分页存储的一些公式。

  • 求地址:

逻辑地址=页号P+偏移量W
物理地址=某程序指定页的块号+偏移量W

  • 其他计算:

    • 页表项 =(题目给出的)内存 / 页面大小
    • 页表占用内存 = 页表项 *页表大小
    • 页数=(页表占用的)内存 / 页面大小 = (页表项* 页表项大小)/ 页面大小
    • 每页页表项数=页表项 / 页数 = 页面大小 / 页表项大小
    • 最大内存 = 页面大小 * 2^(页表项大小 /B)

例题

页式存储(清华大学)
已知系统为32位实地址,采用48位虚拟地址,页面大小4KB,页表项大小为8B;每段最大为4GB。
(1)假设系统使用纯页式存储,则要采用多少级页表,页内偏移多少位?
(2)假设系统采用一级页表,TLB命中率为98%,TLB访问时间为10ns,内存访问时间为100ns,并假设当TLB访问失败后才访问内存,问平均页面访问时间是多少?
(3)如果是二级页表,页面平均访问时间是多少?
(4)上题中,如果要满足访问时间<=120ns,那么命中率需要至少多少?
(5)若系统采用段页式存储,则每用户最多可以有多少段?段内采用几级页表?
参考答案:
(1)首先,页面大小为4KB,故页内偏移需要12位来表示。其次,系统虚拟地址一共48位,所以剩下的48-12=36位可以用来表示虚页号。每一个页面可以容纳的页表项为:4KB/8B=29(也就是可以最多表示到9位长的页号),而虚页号的长度为36位,所以需要的页表级数为:36/9=4级。
(2)当进行页面访问时,首先应该先读取页面对应的页表项,98%的情况可以在TLB中直接得到得到页表项,直接将逻辑地址转化为物理地址,访问内存中的页面。如果TLB未命中,则要通过一次内存访问来读取页表项,所以页面平均访问时间是:98%×(10+100)ns+2%×(10+100+100)ns=112ns
(3)二级页表的情况下:
如果TLB命中,和(2)的情况一样,如果TLB没有命中,采用二级页表需要访问3次内存,所以页面平均访问时间是:98%×(10+100)ns+2%×(10+100+100+100)ns=114ns
(4)假设快表的命中率为p,应该满足以下式子:
p×(10+100)ns+(1-p)×(10+100+100+100)ns<=120ns
可以解得:p>=95%,所以如果要满足访问时间<=120ns,那么命中率至少为95%。
总结知识点:在多级页表的情况下,如果TLB没有命中,则需要从虚拟地址的高位起,每N位(其中N就是类似于(1)中的9)逐级访问各级页表,以第(1)问为例,如果快表未命中,则需要访问5次内存才能得到所需页面。

7. 页和段的区别

1、页是信息的物理单位; 段是信息的逻辑单位,它含有一组其意义相对完整的信息。
2、页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面;段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。

8. 普通存储管理的特征是什么?虚拟存储的特征是什么?

  • 普通存储管理的特征:一次性转入、一直驻留内存。
  • 虚拟存储的特征:离散性,多次性、对换性、虚拟性。

9. 抖动现象

  • 抖动现象是指请求分页(分页虚拟)或请求分段(分段虚拟)、或请求段页式(段页式虚拟)中页面或段频繁调进调出的现象。

10. 段的逻辑地址是2维地址,物理地址是1维的。

11. 段表、页表中增加了哪些项以便实现虚拟存储?

  • 例如,状态位,访问位,修改位,外存地址。

12. 动态分区的分配算法:首次适应算法,循环首席适应算法,最佳适应算法,最坏适应算法。要会分区的移动合并操作。

  • 详细见问题2。

13. 会计算平均访存时间(快表TLB、页表、缺页中断)

  • λ为访问快表的时间/更新快表的时间
  • t为访问内存的时间
  • ε为缺页中断处理时间

请求分页管理方式下,存在三种方式的内存访问:

  1. 页在内存,且快表检索命中:

EAT= λ + t

  1. 页在内存,但快表检索没有命中:

EAT= 快表检索时间+访问页表时间+修改更新快表时间+访问页面物理内存时间 = λ +t+ λ +t=2 *( λ + t)
**3.页面不在内存:
**EAT=快表检索时间+访问页表时间+缺页中断处理时间+修改更新快表时间+访问页面物理内存时间
**= λ + t + ε + λ + t
**4.加入概率的综合公式(a是快表命中率,f是缺页率):
EAT= λ + at +(1-a){ } = λ +at +(1-a){t + f(ε+λ+t) +(1-f)(λ+ t) }

14. 分页和分段的区别,见课件

15. 请求分页的页表与普通页表有何不同,每一位的含义或作用是什么?

  • 请求分页实施的关键:请求调页功能和页面置换功能。
  • 请求分页中的硬件支持:页表机制、缺页中断机构、地址变换机构
  • 请求分页机制与普通分页机制不同之处:

    1. 普通分页存储管理方式不具备页面对换功能,不支持虚拟存储器功能 。在调度作业运行时,必须将它的所有页面一次调入内存 。若内存没有足够的块,则作业等待。

    2. 请求分页管理方式 是支持虚拟存储的,具备了页面的对换功能。调度作业时是将它的一部分(而不是全部)放入内存。当发现页面缺少时,会发出一个缺页请求,从外存调用页面文件进入内存。

    3. 请求分页的页表项有:|页号|物理块号|状态位P|访问字段A|修改位M|外存地址|,与普通分页想比,增加了四个页表项:

      a. 状态位P:用于指示该页是否已调入内存,供程序访问时参考。

      b. 访问字段A:用于记录本页在一段时间内被访问的次数,或记录本页最近己有多长时间未被访问,供置换算法换出页面时参考。

      c. 修改位M:标识该页在调入内存后是否被修改过。

      d. 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。

16. 虚拟存储管理中的管理算法实际上是牺牲时间性能换取内存空间性能。

  • 虚拟存储管理必须建立在离散内存管理的基础上。

17. 内存管理方法中哪些是主要为了提高内存利用率而提出的?哪些主要是为了编程和共享提出来的?

  • 为了提高内存利用率:

    1. 连续分配方式,包括单一连续分配、固定分区分配、动态分区分配和动态重定位分区分配。
    2. 基本分页存储管理方式。(属于离散分配方式)
  • 为了编程和共享:

    1. 基本分段存储管理方式。(属于离散分配方式)

18. 会推算多级页表中逻辑地址的划分。

  1. 首先,不论一级页表还是多级页表:页面大小 = 2^(页内地址位数),页号有多少,页就有多少个。
  1. 用于存放页的地址空间就可以写为页号 页内地址(或叫位移量)
  1. 接下来,分别来看一级页表和多级页表:

a. 一级页表:

页表是系统为每个进程建立的页面映射表。
进程中的每一页在页表中都有一项,这个项就是页表项,大小可以理解为页表中一行的大小。
每个页表项的结构为:页号 物理块号
此时,存储页号和物理块号的空间大小是页表项的大小。
整个页表的内容就是:
页号 物理块号
页号 物理块号
页号 物理块号
页号 物理块号
…… ……
易知,页表大小 = 页表项的大小 x 页表项的个数
结论1(一级页表):在一级页表,可以认为页表项大小与页面大小没有关系

b. 二级页表

当页面数量很多时,需要标很多页号,导致页号占的位数很多。
如果将所有的页号及对应的物理块号写入一个页表,页表会非常长,页表需要占据太多连续地址空间,而内存空间不够,因此需要将一页拆分。
将原先页号的部分,按照原始页面大小,拆分为“页号” 和 “页面”。注意,还是行使页表的功能,实现页号与物理块号的映射,只是改变了结构:页号 页面
现在拥有存放页的地址空间就变成了:页号 页面1 页面2
将现在的页号命名为【外层页号】,将从页号拆分出来的页面1命名为【外层页】,原始的页面视为【内层页】:
外层页号 外层页 内层页
接下来看位数: 1. 内层页还是原始页面的大小 2. 上文提到,外层页面大小 = 内层页面大小 3. 但外层页是要履行页表功能,存放内层页的索引,页表项还是“一行”的大小 4. 因此外层页的位数 = log2(内层页面大小 / 页表项的大小),即外层页还是表示存放页表项的个 5. 这就是页面大小与页表项大小的关系

在课本中,二级页表结构为:外层页号 外层页内地址 页内地址
结论2(二级、多级页表):
1)外层页号对外层页的计数,存放外层页号,位数 = log2(外层页个数)
2) 外层页存放的页表项是内层页的索引,外层页大小 = 内层页大小,外层页内地址位数 = log2(页面大小 / 页表项的大小)
3)页内地址位数 = log2(页面大小),存放物理地址

c. 多级页表

在二级页表的基础上,如果页表还是大,没有足够连续内存空间,就再将页号的空间划分,可理解为:
外层页号 外层页n …… 外层页3 外层页2 外层页1 内层页
称为n+1级页表。例如外层页共分3页,称为四级页表。
多级页表的最高页表项,即外层页n的大小不能超出一页大小了
同样,每个外层页的大小 = 内层页面大小
每个外层页的位数 = log2( 页面大小 / 页表项大小 )
按理来说,外层页号占的空间需不超过一个页面大小,外层页以及内层页的大小都为一个页面大小。

d. 例题

例题:已知系统为48位地址,页面大小4KB,页表项大小为8B,使用页式存储,则要采用多少级页表,页内偏移多少位 ?

解:

页面大小 = 2 ^12 B,故页内偏移12位
页号位数 = 48-12 = 36
4KB / 8B = 2 ^9 ,一个页面能装下2 ^9个页表项
按理来说,外层页以及内层页的大小都应为一个页面大小,外层页号需不超过一个页面大小,不然需要对外层页号再次分页
因此,36/9 = 4 ,需要四级页表。

四、设备管理

1. I/O控制方式有哪些?它们各自有何特点?

  • 有四种I/O控制方式:程序轮询、中断、DMA、通道。
  • 特点:

    • 程序轮询方式:特点是控制简单,不需要多硬件支持。CPU与设备串行工作,传送与主程序串行工作。适用场景适用于结构简单,只需少量硬件的电路。

    • 中断方式:特点是CPU的利用率高,外设具有申请CPU中断的主动权,CPU和外设之间处于并行工作状态。CPU与设备并行工作,传送与主程序串行工作。适用于CPU的任务较忙、传送速度要求不高的场合,尤其适合实时控制中的紧急事件处理。

    • 存储器直接存取方式(DMA):特点是接口电路复杂,硬件开销大,大批量数据传送速度极快。CPU与设备并行工作,传送与主程序并行工作。适用于存储器与存储器之间、存储器与外设之间的大批量数据传送的场合。

    • 通道方式:特点是一个通道可以控制多台外设、大大提高了CPU的效率,但它是以花费更多的硬件为代价。与CPU并行工作时间最长。适用于以字节为单位的干预,同时实现CPU、通道和I/O设备三者并行操作的场合。

2. 常见的字符设备有哪些?块设备有哪些?

  • 常见的字符设备:鼠标、键盘、串口、控制台等
  • 常见的块设备:硬盘、磁盘、U盘和SD卡等

3. 缓冲技术的作用是什么?

  • 提高CPU与I/O并行性。
  • 缓解CPU 与I/O速度不匹配的问题。
  • 减少对 CPU 的中断频率。
  • 解决数据粒度不匹配的问题。

4. Spooling(假脱机)系统的组成、原理,

  • 脱机输入输出:不需要 CPU 全程参与的输入输出。
  • 为什么说 Spooling 是假脱机:Spooling 是在进程 SP0,SP1 控制下的“脱机”输入输出。
  • 组成:输入进程、输出进程;输入井、输出井;输入缓冲区、输出缓冲区。


打印机就是一个用该技术实现虚拟设备的典型例子:

  • 原理:使用SPOOLING技术后,当多个用户进程请求打印输出时,SPOOLing系统同意为他们打印输出,但并不真正立即把打印机分配给该用户进程,而只为它做两件事:

    1. 由输出进程在输出井中为之申请一个空闲磁盘块区,并将要打印的数据送入其中。
    2. 输出进程再为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入 其中,再将该表挂到请求打印队列上。

    当打印机空闲时,输出进程会从打印队列取出一张打印请求表,并把要答应的数据输出到输出缓冲区中,在输出给输出设备(打印机)进行打印。

5. 通道的类型:字节多路通道、数组多路通道、数组选择通道,各有何特点,哪些可以共享,哪些只能独占。

  • 特点:

    1. 字节多路通道:适用于连接大量的字符类低速设备, 传送一个字符 (字节) 的时间很短,但字符 (字节) 间的等待时间很长。
    2. 数组多路通道:适用于连接多台高速设备, 设备的传送速率很高,但传送开始前的寻址辅助操作时间很长。
    3. 数组选择通道:适用于连接优先级高的高速设备,在数据传送期内独占通道,只能执行一道通道程序。
  • 共享:字节多路通道、数组多路通道

  • 独占:数组选择通道

6. 在主机系统中,分配设备的同时,还要分配与之相连的控制器和通道。

7. 磁盘的访问时间构成,掌握驱动调度?重点掌握电梯算法(SCAN)、最短寻道时间优先算法(SSTF)、先来先服务(FIFO)、循环扫描法(CSCAN)。注意:最短寻道时间优先算法存在饥饿现象。

  • 简述磁盘调度算法的目标:使平均寻道时间最短。
  • 磁盘的访问时间构成:寻道时间+旋转延迟时间+读写时间/传输时间
  • 驱动调度:系统采用一定的调度策略来决定各个请求访问磁盘者的执行次序

驱动调度先进行“移臂调度”,减少寻找时间,再进行“旋转调度”,减少延迟时间 。
移臂调度:根据访问者指定的柱面位置来决定执行次序的调度称为“移臂调度”,目标是尽可能地减少输入
输出操作中的寻找时间。常用的移臂调度算法有:电梯算法、最短寻道时间优先(SSTF)、先来先服务(FIFO)及循环扫描等算法:

电梯算法(又称扫描算法,SCAN)

  • 详解:

    1. 电梯调度”算法不仅考虑到请求访问者的磁头与当前磁头之间的距离,更优先考虑的是磁头当前的移动方向。
    2. 总是从移动臂当前位置开始,沿着移动臂的移动方向选择距离当前移动臂最近的那个访问者进行调度,若沿移动臂的移动方向再无访问请求时,则改变移动臂的方向再选择。
  • 例题说明:

例题:现在读写磁头正在53号柱面上执行输入/输出操作,而访问者请求访问的柱面顺序为:98,183,37,122,14,124,65,67。
解:

若当前移动臂由里向外移动时,读写磁头共移动了208个柱面的距离;
若当前移动臂由外向里移动时,则读写磁头共移动了299个柱面的距离。

最短寻道时间优先(SSTF)

  • 详解:

    1. 总是从若干请求访问者中挑选与当前磁头所在的磁道距离最近,使每次寻道时间最短的那个请求进行调度,而不管访问者到达的先后次序
    2. 与先来先服务算法相比,大幅度地减少了寻找时间,缩短了为各请求访问者服务的平均时间,提高了系统效率
    3. 并未考虑访问者到来的先后次序,存在”饥饿“现象。
  • 例题说明:

例题:现在读写磁头正在53号柱面上执行输入/输出操作,而访问者请求访问的柱面顺序为:98,183,37,122,14,124,65,67。
解:

读写磁头总共的移动距离为236个柱面。

先来先服务(FIFO)

  • 详解:

    1. 算法简单且公平;
    2. 只是根据访问者提出访问请求的先后次序进行调度,并不考虑访问者所要求访问的物理位置;
    3. 未对寻道进行优化,磁臂来回地移动,使寻道时间比较长,仅适合于磁盘I/O请求数目较少的场合。
  • 例题说明:

例题:现在读写磁头正在53号柱面上执行输入/输出操作,而访问者请求访问的柱面顺序为:98,183,37,122,14,124,65,67。
解:

读写磁头总共移动了640个柱面的距离。

循环扫描(CSCAN)

  • 详解:

    1. 从0号柱面开始向里扫描,依次选择所遇到的请求访问者;移动臂到达最后一个柱面时,调转方向从最后一个柱面向外扫描,依次选择所遇到的请求访问者
    2. 解决了单向扫描算法中的一趟空扫描问题,减少了寻找时间,提高了系统的访问效率
    3. 可能存在空扫描
  • 例题说明:

例题:现在读写磁头正在53号柱面上执行输入/输出操作,而访问者请求访问的柱面顺序为:98,183,37,122,14,124,65,67。
解:

读写磁头总共的移动距离为382个柱面。

例题

例题:假定一磁盘有200个柱面,编号为0—199,在完成了磁道125处的请求后,当前正在磁道143处为一个请求服务。若请求队列的先后顺序为86,147,91,177,94,150,102,175,130试分别采用FCFS(先来先服务)、SSTF(最短寻道时间优先)、SCAN(扫描)算法和CSCAN(循环扫描)完成上述请求,写出磁头移动的顺序,并计算存取臂移动总量(单位为磁道数)。
解:
采用FCFS算法调度时,磁头移动顺序为:143→86→147→91→177→94→150→102→175→130
磁头移动总量是565(柱面);
采用SSTF算法调度时,磁头移动顺序为:143→147→150→130→102→94→91→86→175→177
磁头移动总量是162(柱面);
采用SCAN算法调度时,磁头移动顺序为:143→147→150→130→102→94→91→86→175→177
磁头移动总量是172(柱面);
采用CSCAN算法调度时,磁头移动顺序为:143→147→150→175→177→130→102→94→91→86
磁头移动总量是125(柱面)。

8. 设备独立性的含义

  • 为了提高操作系统的可适应性和可扩展性,在现代操作中都毫无例外地实现了设备独立性,也称为设备无关性。 其基本含义是: 应用程序独立于具体使用的物理设备。
  • 为了实现设备独立性而引入了逻辑设备和物理设备这两个概念。在应用程序中,使用逻辑设备名称来申请使用某个设备;而操作系统在实际执行时,还必须使用物理设备名称。因此,系统须具有将逻辑设备名称转换为某物理设备名称的功能,这非常类似于存储器管理中所介绍的逻辑地址和物理地址的概念。
  • 实现设备独立性后,操作系统将把所有外部设备统一当作成文件来看待,只要安装它们的驱动程序,任何用户都可以像使用文件一样,操纵、使用这些设备,而不必知道它们的具体存在形式。

9. 设备分配过程, 设备分配考虑的因素。磁带、磁盘需要分配吗?在通道系统中,分配设备的时候需要分配相关的控制器和通道

  • 设备分配应考虑的因素:设备的固有属性、设备分配算法、设备分配中的安全性。
  • 需要分配磁带和磁盘,因为磁带和磁盘属于共享设备,而共享设备属于设备的固有属性之一。

10. 设备管理中,缓冲区管理实际上就是牺牲内存空间来换取时间效率。

11. I/O软件的分层结构:从高到低的次序分别是:用户层软件、设备独立性软件,设备驱动程序、中断处理程序。

例题:(B)

五、文件管理

  • 日志文件系统中的日志(journaling)的主要作用是:用于系统崩溃后的文件系统恢复

1. 磁带上的文件只能是连续结构的文件,也只能顺序存取,不支持直接存取(随机存取)

2. 外存空间的管理方法有哪些?空闲表、空闲链表、位示图、成组链接法,会使用这些方法处理具体的分配问题。

空闲表法

  • 思想:把一个未分配区域看成一个文件,称为“空白文件”,为空白文件建立一张目录,记录空白文件的起始盘块号和空闲块数。分配与回收:采用内存的动态分区管理方法,可以采用首次适应算法和循环首次适应算法分配,分配时也是将空白文件一分为二,一部分正好等于需要的大小,剩下部分构成新的空白文件,回收时,同样要考虑相邻空白文件要合并。
  • 特点:适合连续分配,索引分配和链式分配。

空闲链表法

  • 思想:将文件存储空间中的所有空闲块用指针链接在一起形成链表。在某个固定地方存放链表的头指针。有两种形式:

    1. 空闲块链。以空闲盘块为基本单位形成链表。每个空闲盘块有一个指向下一个空闲盘块的指针。

      分配与回收:分配时从表头开始分配,回收后的盘块加入链表尾。
      特点:适合链式分配,索引分配

    2. 空闲盘区链。以连续若干个空闲盘块组成一个空闲盘区,以空闲盘区为基本单位形成链表。每个空闲盘区应有表明本盘区大小的数据项和指向下一个空闲盘区的指针。

      分配与回收:采用内存的动态分区管理方法,可以采用首次适应算法,分配时从表头开始分配,分配时可
      以分配多个空闲盘区,最后一个一分为二,回收时可以合并相邻空闲盘区。为加快检索盘区速度可以在内
      存中建立一个显式链表。
      特点:适合连续分配、链式分配、索引分配。

位示图法

  • 思想:用一位二进制位来表示一盘块的使用情况,例如:0表示空闲,1表示已分配。磁盘上每个盘块都有一个二进制位对应,二进制位的序号就是对应盘块的编号。所有二进制位构成的集合就是位示图。
  • 分配:若文件需要K个块,①顺序扫描位示图,找到K个相邻或不相邻的“0”;②根据字号、位号算出对应的盘块号,将相应盘块分配给文件;③将相应位设置为“1”。
  • 回收:①根据回收的盘块号计算出对应的字号、位号;②将相应二进制位设为“0”。
  • 特点:适合连续分配、链式分配、索引分配。占用空间少。

位示图用(m × n)个位数来构成位示图,并使(m × n)等于磁盘的总块数:

  • 例题:

磁盘块分配有如下几步:

  1. 首先扫描位示图,找到文件所需要的一个或一组值为0的空闲块;
  1. 将所找的空闲块转换为盘块号。如果找到的空闲块为第i行,第j列,则盘块号q为:q = n (i − 1) + j。其中,n表示位示图每行的位数;
  1. 将位示图中相应位置的状态改为已经分配,即将“0”变为“1”。

例如,如果需要从磁盘中分配一个盘块,查位示图,得到第1行,第2列为0,即为空闲,位示图中有16列。则对应位示图的磁盘块号q为:q = n(i −1)+ j = 16(1 − 1) + 2 = 2 ,即分配的磁盘块号为2。当2号磁盘块分配后,立即修改位示图中第1行第2列的值为1。
磁盘块回收有如下几步:

  1. 将回收的盘块号转换为位示图中的行和列号:i = (q − 1)div n + 1,j = (q − 1)mod n + 1 ;

(div表示求模后得到商,mod表示求模后的的余数。)

  1. 修改位示图中相应的字位,从“1”改为“0”,表示已经回收为空闲。

例如,如果回收的盘块号为18,则:i = (q − 1)div n + 1 = (18 − 1) div 16 + 1 = 2   j = ( q − 1) mod n + 1 = (18 − 1) mod 16 + 1 = 2。得到位示图中的第2行第2列,将其值由1改为0,表示该盘块已经回收,为空闲。
其它情况:

  1. 情况1 ) 行列号从0开始,盘块号从0开始:

分配:q=n*i+j
回收:i=q div n,j=q mod n

  1. 情况2) 行列号从0开始,盘块号从1开始:

分配:q=n*i+j+1
回收:i=(q-1) div n,j=(q-1) mod n

  1. 情况3) 行列号从1开始,盘块号从0开始:

分配:q=n*(i-1)+(j-1)
回收:i=(q div n) +1,j=(q mod n)+1

  1. 情况4) 行列号从1开始,盘块号从1开始:

分配:q=n*i+j
回收:i = (q − 1)div n + 1,j = (q − 1)mod n + 1

成组链接法

  • 空白文件目录法和空闲链表法不适合大型文件系统,因为使用它们,相应的空白文件目录太大和太长。将以上两种办法结合形成的成组链接法是一个较好的方法。
  • 思想:

    1. 设置空闲盘块号栈,用来记录当前可用的一组空闲盘块的编号,以及当前栈中高度N。该栈可以用一个盘块来存放,因此栈的高度有限制M,例如只能记录100个空闲盘块号。

    2. 将用于存放文件的所有空闲盘块从编号小的开始按升序分成若干大小等于M的组。并给每组编号,编号也是从小到达的升序编写。

    3. 将第1组的盘块号和盘块总数写入空闲盘块号栈中。将第I(I>1)组的盘块号和盘块总数写到第I-1组的处于栈底位置的盘块中。最后一组的空闲盘块数一般小于M,且必须小于M,在写到上组的处于栈底位置的盘块中时,在栈底用0标记,作为链表的结尾。

  • 分配:从栈顶开始分配,每分配一个,N就减1,若N=0, 若栈底是0,则说明没有可供分配的空闲盘块;若不是0,则需要把该盘块的内容读入空闲盘块号栈中,然后才能把它分配出去。
  • 回收:回收一个盘块X,若空闲盘块号栈的N=M ,则把空闲盘块号栈中的内容写到盘块X中,把X的编号作为栈底写到空闲盘块号栈中,N=1;若N<M,就把X写到空闲盘块号栈的顶部,N加1。

3. 物理结构(连续、链接、索引)、逻辑结构(字符流式文件(无结构式),记录文件(有结构式)),它们对存取方式有何影响?

  • 连续文件可采用顺序存取,也可以随机存取,物理结构为顺序结构的文件,若存放在顺序存储介质(如磁带),则只能顺序存取;若存放于随机存储介质(如磁盘、磁鼓)上,则文件可顺序存取,也可以随机存取。
  • 存放于随机存储介质(如磁盘、磁鼓)上时:

    1. 隐式链接文件结构只能按队列中的链接指针顺序搜索,因此搜索效率低,链接结构的存取的方法只能顺序存取,不能随机存取。
    2. 显式链接文件结构存取的方法能顺序存取,也能随机存取。
  • 索引文件结构,可顺序存取,也可随机存取。

5. 外存空间大小=物理块(簇)大小 * 物理块的数量。

  • 在文件系统中,簇(cluster)的含义是:最小分配单位,包括多个磁盘扇区。

6. 目录项(文件控制块)实现按名存取主要是通过目录这个数据结构来实现

在文件控制块中,通常含有以下 3 类信息:基本信息、存取控制信息及使用信息。

9. 文件共享方式有哪几种?如何实现?为什么基于索引节点的文件共享不能跨越文件系统?

  • 文件共享有基于索引节点的共享方式、利用符号链接两种:

    • 基于索引节点的共享方式: 在这种情况下,文件的属性和文件的地址不再放在文件的目录中,而是存在索引中。文件目录中存放着文件名和指向索引的指针,linux操作系统中把这种索引的结点称为Inode结点。在索引的结点中还有一个计数器,用来统计文件被多少用户访问。此时,由任何用户对文件进行追加操作或修改,所引起的相应索引结点内容的改变,例如,增加了新的盘块号和文件长度等,都是其他用户可见的,从而也就能提供给其他用户来共享。

    • 利用符号链接:当用户需要访问共享文件的时候,由系统生成一个链接的文件,用来指向共享文件的目录。其他用户根据这个链接文件来访问共享文件。这时候如果文件所有者删除了文件或者修改了文件,就需要其他用户重新生成链接文件,原来的链接就会失效。

  • 基于索引节点的文件共享不能跨越文件系统的原因:该方式存在所谓“悬空指针”的问题和缺点。具体而言,文件拥有者不能删除自己的文件,否则将留下指向该结点的悬空指针,造成该结点再分配时,系统出错;为此,拥有者只能清除自己的目录项,且要为其它共享者无端付费,直至其它共有者清除该文件。

10. 建立索引节点的好处是什么?

  • 加快文件或目录检索的速度,其次是方便文件共享

11.多级目录、工作目录、相对路径的好处?

  • 加快文件或目录检索的速度。多级目录还有另外的好处:允许文件重名。

12.文件的分类,文件系统的功能,常见的文件系统有哪些?文件操作有哪些?打开文件和关闭文件应该要做哪些工作?

文件的分类

文件系统的功能

  1. 管理和调度文件的存储空间,提供文件的逻辑结构、物理结构和存储方法;
  1. 实现文件从标识到实际地址的映射,实现文件的控制操作和存取操作;
  1. 实现文件信息的共享并提供可靠的文件保密和保护措施,提供文件的安全措施。

常见的文件系统

【Windows常见文件系统】
NTFS、FAT、vFAT、FAT32、exFAT、ReFS。
【macOS常见文件系统】
HFS+、APFS。
【Linux常见文件系统】
Ext2、Ext3、Ext4、XFS、F2FS、Btrfs、ZFS。

文件操作

  • 操作系统提供了文件操作功能,要求用户在使用文件前先调用打开操作,然后才能进行读写。
  1. 最基本的操作:

    1). 创建文件
    2). 删除文件
    3). 读文件
    4). 写文件
    5). 截断文件
    6). 设置读/写位置

  1. 打开与关闭
  1. 其它文件操作:创建目录、删除目录、改变当前目录,对文件属性的操作等。

打开和关闭文件应该做的工作

  • 操作系统在处理open系统调用时要做了几件事:

    1. 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的的目录项,并检查该用户是否有指定的操作权限;
    2. 将目录项复制到内存中的“打开文件表”中。并将对应表目的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件;
    3. 进程使用完文件后,要“关闭文件”
  • 操作系统在处理 close系统调用时,主要做了几件事:

    1. 将进程的打开文件表相应表项删除;

    2. 回收分配给该文件的内存空间等资源;

    3. 系统打开文件表的打开计数器count减1,若count=0,则删除对应表项。

13.文件逻辑结构、文件物理结构和文件存储设备对文件存取方法的影响(直接存取还是顺序存取)。

  • 详细见问题3。

14.根据文件的物理结构、物理块的大小信息确定文件分配外存空间,会计算文件实际占用外存大小,反过来,通过设定最大文件,计算索引结构的索引层次等。

15. RAID。

  • RAID即独立磁盘冗余阵列,实际上是用多个独立的磁盘组成在一起形成一个大的磁盘系统。
  • 目的是实现比单块磁盘更好的存储性能和更高的可靠性。
  • RAID 0 级别不能提供数据冗余保护。

16. 物理结构(连续、链接、索引)各有何优缺点?适合哪种设备?支持哪些存取方式(顺序存取,直接存取)?

优缺点及其适用设备

一、顺序结构
优点:1、简单:存储与管理都简单,且容易实现。2、支持顺序存取和随机存取。 3、顺序存取速度快。 4、所需的磁盘寻道次数和寻道时间最少。

缺点:1、需要为每个文件预留若干物理块以满足文件增长的部分需要。 2、不利于文件插入和删除。\

连续结构适合于存储较小的文件,如操作系统内部的文件。
二、链式结构
优点:1、提高了磁盘空间利用率,不需要为每个文件预留物理块。 2、有利于文件插入和删除。 3、有利于文件动态扩充。\

缺点:1、存取速度慢,不适于随机存取。 2、当物理块间的连接指针出错时,数据丢失。 3、更多的寻道次数和寻道时间。 4、链接指针占用一定的空间,降低了空间利用率。\

链接结构适合于存储动态变化的文件,如数据库系统中的表格数据。
三、索引结构
优点:1、不需要为每个文件预留物理块。 2、既能顺序存取,又能随机存取。 3、满足了文件动态增长、插入删除的要求。\

缺点:1、较多的寻道次数和寻道时间。 2、索引表本身带来了系统开销。如:内外存空间,存取时间等\

索引结构适合于存储较大的文件,并且具有快速查找的需求,如搜索引擎中的索引文件。

支持的存取方式

详细见问题3。

17. 分析linux011版本中inode节点使用直接块,间接块所能表示的一个文件的大小

inode节点的映射图如下:

计算过程:
计算一个节点使用直接,一次间接块,二次间接块能表示的文件的大小:(前提:每块大小1024字节,每个块号使用32位(4字节))
1)直接块:
使用直接块时,一个块号表示一个块,也就是1K字节。
2)一个一次间接块:
一个间接块大小为1024,其能记录的块的数量为1024/4(32位)=256,也就是说一个间接块可以记录256个块的地址,也就是说一个间接块能表示的大小位:256*1024=256K。
3)一个二次间接块:
也就是一个块记录了256个一次间接块,大小也就是256(一次间接块大小)
=256
256k
=65536K
=64M

4)一个三次间接块大小:
也就是一个块记录了256个二次间接块,大小也就是256(二次间接块大小)
=256
64M
=16G
例题:

1.bmp 解:

  1. 一个直接块大小为4K,所以直接块的总大小为:4K*12=48K;(注意,这里和上述不同的是,上述题目一个直接块的大小为1024字节,也就是1K,而这里是4K)
  1. 一个间接块指向一个存块信息的块,一个间接块大小为4K,每个块号4字节,所以一个块能存41024/4=1024个块号信息,也就是说一个间接块可以记录1024个块的地址,也就是说一个间接块是10244K=4M
  1. 二级间接块同理102410244=4G
  1. 所以,最终大小为4G+4M+48K。