【操作系统】王道视频笔记2

3.1.10 基本分段存储管理

  • 进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址。
  • 内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。
  • 与分页不同,页框在内存中的长度都是相同的,对应一个内存块;而段则可以是不同的。

分段

分段系统的逻辑地址结构由段号(段名)和段内地址(段内偏移量)所组成。段号的位数决定了每个进程最多可以分几个段;段内地址位数决定了每个段的最大长度是多少。

在下面例子中,若系统是按字节寻址的,则段号占16位,因此在该系统中,每个进程最多有2^16=64K个段段内地址占16位,因此每个段的最大长度是2^16=64KB。

段表及寻址过程

与分页管理一样,程序分多个段,各段离散地装入内存,为了保证程序能正常运行,就必须能通过逻辑地址从物理内存中找到各个逻辑段的存放位置。为此,需为每个进程建立一张段映射表,简称“段表”。

假设物理内存为4GB,逻辑地址的结构为:段号16位和段内地址16位。段表的段号可以是隐含的,段表项(段长16位+段在内存中的基址32位)的长度是已知的,为48位,各个段表项的长度是相同的。通过段号可以找到该段在段表中对应的段表项,公式为:段的物理地址 =段表基地址 + K(段号) * 段表项长度。

分段管理的寻址过程与分页类似,在通过段号查出段在内存够中的基址之后,再通过段内地址(段内偏移量)获取数据的准确物理地址。见图2.

分页、分段的管理的对比

3.1.11 段页式管理方式

就是分页+分段,能够缓和各自的缺点。详情见视频。

3.2.1 虚拟内存

传统存储管理方式的特征、缺点

传统存储管理方式分为:连续分配管理方式和非连续分配管理方式,见前面章节。即传统存储管理方式一开始就把进程的所有数据都加载到内存中了,所以不用考虑缺页和置换的问题。

当我们电脑计算机ARM是8G,但是一个生化危机7是20G,按传统存储管理,我们至少要20G的ARM才能玩这个游戏,而绝大多数情况我们不可能一次性把所有的文件装入内存,所以要采用虚拟存储管理方式。

  • 一次性:作业必须一次性全部装入内存后才能开始运行。这会造成两个问题:①作业很大时,不能全部装入内存,导致大作业无法运行;②当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降。
  • 驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。事实上,在一个时间段内,只需要访问作业的一小部分数据即可正常运行,这就导致了内存中会驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源。

虚拟内存的定义和特征

定义

基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存就可以让程序开始执行。

在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。

若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。

特征

  • 多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。对应传统内存管理的一次性。
  • 对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。对应传统内存管理的驻留性。
  • 虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。

如何实现虚拟内存技术

虚拟内存技术,允许一个作业分多次调入内存。如果采用连续分配方式,会不方便实现。因此,虚拟内存的实现需要建立在离散分配的内存管理方式基础上。注意下面虚拟内存实现与传统实现的主要区别。

3.2.2 请求分页管理方式

传统存储管理方式一开始就把进程的所有数据都加载到内存中了,所有不用考虑缺页和置换的问题。

页表机制

  • 请求调页前提:与基本分页管理相比,请求分页管理中,为了实现“请求调页”,操作系统需要知道每个页面是否已经调入内存;如果还没调入,那么也需要知道该页面在外存中存放的位置。
  • 页面置换前提:当内存空间不够时,要实现“页面置换”,操作系统需要通过某些指标来决定到底换出哪个页面;有的页面没有被修改过,就不用再浪费时间写回外存。有的页面修改过,就需要将外存中的旧数据覆盖,因此,操作系统也需要记录各个页面是否被修改的信息。

基于上面的前提,页表中要新增以下记录标志位。

缺页中断机构

当访问的逻辑地址(如(0,1024),基于上图)所在的页没有被加载到内存中时,就会产生一个缺页中断(属于内中断【故障】),此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。

如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。

如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。下图中是内存没有空闲块时,将c号空闲块从内存掉入外存(要同时修改内存和外存),挪出内存空间供0号页使用。

地址变换机构

下图是请求分页的地址变换过程,看完然后理解,并不难。注意第4点,换入/换出页面需要启动慢速的IO操作,因此换入/换出太频繁,会拖慢整个系统的运行速度。

3.2.3 页面置换算法

最佳置换算法(OPT)

最佳置换算法(OPT, Optima):每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。在现实中是无法实现的。

先进先出置换算法(FIFO)

先进先出置换算法(FFO):每次选择淘汰的页面是最早进入内存的页面。

实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面即可。队列的最大长度取决于系统为进程分配了多少个内存块。

最近最久未使用置换算法(LRU)

最近最久未使用置换算法(LRU,| east recently used):每次淘汰的页面是最近最久未使用的页面。

实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t

时钟置换算法(CLOCK)

改进型的时钟置换算法

总结

3.2.4 页面分配和置换策略(重点)

这里的置换策略与上面的页面置换算法是两个不同的维度,这里是局部置换还是全局置换,讨论置换页选择的范围;上面是确定范围后,怎么从范围中选择要置换的具体页。

驻留集,固定分配和可变分配(分配的是驻留集),局部置换和全局置换。

驻留集太大,会导致能装入内存的进程数量减少,从而导致多到程序并发度下降;驻留集太小,会导致缺页频繁,产生大量的置换IO操作。

其中固定分配必定是局部置换,不能置换到进程空间外的内存空间,因此分配置换策略的组合有三种:固定分配局部置换、可变分配全局置换、可变分配局部置换。

何时调入页面

  • 预调页策略:根据局部性原理,一次调入若干个相邻的页面可能比一次调入一个页面更高效。但如果提前调入的页面中大多数都没被访问过,则又是低效的。因此可以预测不久之后可能访问到的页面,将它们预先调入内存,但目前预测成功率只有50%左右。故这种策略主要用于进程的首次调入,由程序员指出应该先调入哪些部分。
  • 请求调页策略:进程在运行期间发现缺页时才将所缺页面调入内存。由这种策略调入的页面一定会被访问到,但由于每次只能调入一页,而每次调页都要磁盘/o操作,因此/o开销较大。

从何处调入页面(重点,swap)

  • 系统拥有足够的对换区空间:页面的调入、调出都是在内存与对换区之间进行,这样可以保证页面的调入、调出速度很快。在进程运行前,需将进程相关的数据从文件区复制到对换区
  • 系统缺少足够的对换区空间凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不必写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需写回磁盘对换区,下次需要时再从对换区调入。
  • UNX方式:运行之前进程有关的数据全部放在文件区,故未使用过的页面,都可从文件区调入。若被使用过的页面需要换出,则写回对换区,下次需要时从对换区调入

抖动(颠簸)现象

刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)。

工作集

对于系统的抖动现象,使用工作集来解决。

4.1.1 初识文件管理

4.1.2 文件的逻辑结构

无结构文件和有结构文件

  • 无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如Windows操作系统中的txt文件。
  • 有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。如:数据库表文件。一般来说,每条记录有一个数据项可作为关键字。根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录两种.

顺序文件

顺序文件:文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的各个记录在物理上可以顺序存储或链式存储

索引文件

根据原文件数据项的某个属性建立索引表,每一条记录对应一个索引项,将这个属性作为索引号,然后进行排序,这样就能够对索引表进行随机访问和折半查找了。类似数据库中的索引表。

索引顺序文件

类似数据结构中的索引存储。不为每一条记录建立一条索引项,而是多条记录对应一条索引项。

  • 查询过程:先将文件的所有记录分组,分组间有序,组内无序,然后将每个分组中的记录的最小或最大的查询关键字和这条记录的地址有序存入一张索引表中(按关键字排序),这样查询时就现在索引表中二分查找找到该记录所在的分组,然后在分组中顺序查找。

多级索引顺序文件

4.1.3 文件目录

文件控制块(FCB)

FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项。
FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)。最重要,最基本的还是文件名、文件存放的物理地址

需要对目录进行哪些操作?

  • 搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项。
  • 创建文件:创建一个新文件时,需要在其所属的目录中增加一个目录项。
  • 删除文件:当删除一个文件时,需要在目录中删除相应的目录项显示目录:用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性。
  • 修改目录:某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项(如:文件重命名)。

目录结构——单级目录结构

早期操作系统并不支持多级目录,整个系统中只建立一张目录表,每个文件占一个目录项。

单级目录实现了“按名存取”,但是不允许文件重名。在创建一个文件时,需要先检查目录表中有没有重名文件,确定不重名后才能允许建立文件,并将新文件对应的目录项插入目录表中。显然,单级目录结构不适用于多用户操作系统。

目录结构——两级目录结构

目录结构——多级目录结构

当打开一个目录时(如c:\user),操作系统会从外存中加载C盘的目录表,找到user文件夹所在的位置,然后再从外存中加载user文件夹的目录表,找到它下面的所有文件和目录,然后显示在屏幕上。从外存加载都属于IO操作。

目录结构——无环图目录结构

方便不同用户共享文件。

索引节点(FCB的改进)

不懂,后面用到了再看吧。

4.1.4 文件的物理结构(上)

文件块、磁盘块

类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同,这样方便读写磁盘块。因为内存与磁盘之间的数据交换(即读/写操作、磁盘1O)都是以“块”为单位进行的。即每次读入一块,或每次写出一块。

在内存管理中,进程的逻辑地址空间被分为一个一个页面同样的,在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为了一个一个的文件“块”
于是文件的逻辑地址也可以表示为(逻辑块号,块内地址)的形式。如要访问文件为aaa.txt的2号逻辑块,各处的逻辑地址就是(2,0001).

文件分配方式——连续分配

连续分配方式要求每个文件在磁盘上占有一组连续的块。

  • 地址转换过程:给出某个文件的逻辑块号,OS找到该文件对应的FCB,在FCB中查找该文件的起始块号,得出物理块号 = 起始块号 + 逻辑块号。连续分配支持顺序访问和直接访问。
  • 优点:1、支持顺序访问和直接访问(即随机访问)。2、连续分配的文件在顺序访问时速度最快。
  • 缺点:1、当文件容量增大需要扩展时,若该文件后面没有足够空间的空闲磁盘块可供分配,那就需要移动整个文件到满足空间要求的区域。2、会产生较多的磁盘碎片。

文件分配方式——链接分配

隐式链接

隐式链接一一除文件的最后一个盘块之外,每个盘块中都存有指向下一个盘块的指针,就跟单链表一样。文件目录包括文件第一块的指针和最后一块的指针。

  • 地址转换过程:首先根据文件的逻辑块号在FCB中找到第一个块的起始地址,然后得到第一个块的物理地址,根据第一个块就能获取后面所有块的链接。
  • 优点:很方便文件拓展,不会有碎片问题,外存利用率高。
  • 缺点:只支持顺序访问,不支持随机访问,査找效率低,指向下一个盘块的指针也需要耗费少量的存储空间。只有当我把外存上文件的一个块读入到内存中后我才能知道下一个块的物理地址。

显式链接 

显式链接一一把用于链接文件各物理块的指针显式地存放在一张表中,即文件分配表(FAT,File Allocation Table)。一个磁盘只会建立一张文件分配表。开机时文件分配表放入内存,并常驻内存。

  • 地址转换过程:从目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT,往后找到ⅰ号逻辑块对应的物理块号。逻辑块号转换成物理块号的过程不需要读磁盘操作。即想要访问i号逻辑块时,不需要一次访问之前的0~i-1号逻辑块。
  • 优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问。相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。
  • 缺点:文件分配表的需要占用一定的存储空间。

4.1.4 文件的物理结构(下)

文件分配方式——索引分配

一个文件对应一张索引表。

  • 地址转换过程:在FCB中找到这个文件的索引表的物理地址,再读取索引表的内容,根据给出的逻辑块号找到对应的物理块号。

问题:当一个表有很多个文件块,那么索引表又要有很多个索引项,这时候可能一个磁盘块装不下文件的索引表,这时候怎么办呢?

  • 链接方案:将索引表拆分成索引块装入到不同的磁盘块中,将多个索引块通过指针链接起来。若想要访问文件的最后一个逻辑块,就必须找到最后一个索引块,而各个索引块之间是用指针链接起来的,因此必须先顺序地读入前面所有的索引块。缺点:若文件很大,索引表很长,就需要将很多个索引块链接起来。想要找到ⅰ号索引块,必须先依次读入0~i-1号索引块,这就导致磁盘O次数过多,查找效率低下。
  • 多层索引(图1):建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。一级索引表存储每个二级索引表的起始地址。采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要K+1次读磁盘操作。缺点:即使是小文件,访问一个数据块依然需要K+1次读磁盘。
  • 混合索引(图2):多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)。优点:对于小文件来说,访问一个数据块所需的读磁盘次数更少。

总结

4.1.5 文件存储空间管理

存储空间的划分与初始化

将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘),管理是以文件卷为单位的,具体来说是文件卷中的磁盘块。

存储空间管理——空闲表法 

适用于连续分配方式。如何分配磁盘块,如何回收磁盘块。

存储空间管理——空闲链表法

空闲盘块链

操作系统保存着链头、链尾指针。

  • 如何分配:若某文件申请K个盘块,则从链头开始依次摘下K个盘块分配,并修改空闲链的链头指针。
  • 如何回收:回收的盘块依次挂到链尾,并修改空闲链的链尾指针。

空闲盘区链

操作系统保存着链头、链尾指针。

  • 如何分配:若某文件申请K个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。
  • 如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾

存储空间管理——位示图法

存储空间管理——成组链接法

空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。UNX系统中采用了成组链接法对磁盘空闲块进行管理。

文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。

每个分组的盘块数有上限,如下图中是100。

如何分配

  • 图1:第一个分组的盘块没有分配完
  • 图2:第一个分组的盘块全部分配完了

如何回收

  • 图1:回收一个201号盘块,201~300那个分组没满,直接插入到第一个分组中,然后修改超级块。
  • 图2:回收一个300号盘块(超级块指向301~400那一组),直接创建一个新的分组(只有一个盘块),将超级块中的数据复制到这个盘块中,然后超级块指向这个盘块。

总结

4.1.6 文件操作

4.1.7 文件共享

4.1.8 文件保护

4.1.9 文件系统的层次结构

4.2.1 磁盘的结构

磁盘、磁道、扇区、柱面、盘面

5.1.2 IO控制器

IO设备由机械部件和电子部件(IO控制器[又称设备控制器)组成。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值