计算机操作系统(2)

第三章 存储管理

1.存储管理技术分类

  • 第一种分类方式:分为内存管理技术(分区技术、简单分页技术、简单分段技术) 和 虚拟内存管理技术(虚拟内存分页技术、虚拟内存分段技术)。简单存储就是要执行之前,把他要用到数据一次性全部装入内存;而虚拟存储就是在进程执行之前只装一部分数据进去,后期用到的数据后期装。
  • 第二种分类方式:就是分为 分区技术、分页技术(简单分页技术、虚拟内存分页技术)、分段技术(简单分段技术、虚拟内存分段技术)
  • 按照连续和离散划分:连续的是分区技术,离散的是分页技术和分段技术
    在这里插入图片描述
  • 固定分区技术(先把区分好),动态分区技术(不是预先分好,而是来一块划一块),伙伴分区(固定和动态分区的组合)

2.固定分区技术

  1. 方式一:把内存分成固定大小的几个区。一个进程小于分区大小那就那就把这个分区给这个进程了(由于分区大于进程,所以这个分区利用率并不高,会有浪费,这种浪费称作内零头),如果进程大于分区那就把大进程剪成小进程。
  2. 方式二:把内存分成大小不等的分区。大进程进大分区,小进程进小分区。

优缺点:
实现简单,系统开销小。
分区利用率不高。

3.动态分区技术

动态分区一开始你要多少内存就给多少,但到了后期,有的分区的进程运行完了,有的还没有运行完,导致内存出现了一些不连续的分区。这个时候如果来了一个大的进程,离散的分区就不能装下这个大进程(你有20M,大进程是22M,这就出现了外零头)。我们可以用紧凑技术来把不连续的空闲分区拼接为一个较大的空闲分区来给大进程使用。(固定分区有内零头,动态分区有外零头)
在这里插入图片描述
动态分区的放置算法:
动态分区到了后期会出现一一些不连续的大小不一空闲空间,那么此时来了一个新进程该怎么防止它效果最好呢?

  • 最佳适应算法:来了一个2M的进程,我们放置在2.01M的空闲空间里。但这是所有放置算法里效果最差的,因为最后会剩下0.01M的小空间就真的没办法再用出去了。
  • 最差适应法:来了一个2M的进程,我们放置在100M的最大的空闲空间里。
  • 首次适应算法:每次从一个固定地方往下找,找到的第一个能装下该进程的空闲空间就用来装该进程。最快,效果最好。(因为你每次都是从一端开始找,这端利用率高,在另一端往往就会有很大的空间空闲出来给那些大进程用)。
  • 下次适应算法:上次停在了这里,当来了一个新进程时,就从这里开始往下找空闲空间。这样的好处是存储空间是均匀使用的。

动态分区的地址
我们记住首地址加上偏移量就可以找到每条指令的地址。

  • 基址寄存器:记住每个进程的首地址。(基址寄存器相当昂贵,当前执行进程的首地址寄存在基址寄存器里面,而其他还不在执行的进程的地址寄存在它们的pcb里面,当调度执行的时候才会从pcb里面读首地址到极致寄存器里面)
  • 界限寄存器:规定了每个进程的地址范围,每个进程只能在界限里面执行,超过了界限就得中断
  • 用基址寄存器里面的起始地址加上它的偏移量就产生了该进程的绝对地址,用绝对地址和界限寄存器里的地址进行比较,如果没有超过界限就可以执行该进程。

4.简单分页技术

内存被划分为大小固定、相等的块,且相对比较小(这些块就是页框);每个进程也被分为分为同样大小的小块(这些块就是页);那么进程中称为页的块可以分配到内存中。内存的页框和进程的页大小是相等的。
在这里插入图片描述

  • 如何找到进程的绝对物理地址:我们需要把进程的页号换算成内存的页框号,页框号就是内存这一页的物理起始地址,用该物理起始地址加上相对地址就是该进程的绝对物理地址了。
  • 页表寄存器:每个正在执行的进程的页表起始地址都会被存放在cpu的页表寄存里(凡是寄存器都相当昂贵,而且数量有限,所以只能存放正在执行的进程的信息),根据页表寄存找到进程的页表起始地址,找到该进程的页表,然后从页表里面找到你的某一个页在内存的页框号,再用页框号加上相对地址就是该进程的绝对物理地址了。

实例
16位地址的机器,页的大小是1kb,该进程的页表如下:
在这里插入图片描述
相对地址是1502,求该相对地址的物理地址。

分析:该机器是16位地址,页的大小是1kb(2的10次方),那么有16位地址中有10位表示页内偏移量,6位表示页号(也就是说有2的6次方个页,每一页是1kb,整个进程就是2^6*1kb大)
1502/1024=1…478 (相对地址除以页面大小等于1余478)
用1查询页表得页框号是000110,
478转为2进制111011110
那么相对物理地址就是(000110)+(111011110)

缓冲cache
(cpu速度>>内存速度>>硬盘速度)我们在有速度差的地方会有一个cache(cpu和内存之间有一个cache,内存和硬盘之间有一个cache)。
cpu执行一个进程,要两次访问内存,一次要到内存里面找页表,一次要到内存里面找页表对应的数据,虽然内存已经够快了但由高速运转的cpu切换到内存还是得大大降速,为了加快列表访问速度,就把近期执行过的指令和数据存放cache里,因为他们再次被用的概率比较大。(所有cache的远离都是这样)。
TLB(快表)就是这个cache的原理,启动一个进程先找一下TLB快表看有没有它的地址,如果没有那就去内存里面去找。

关于页面大小
进程分成若页以后,它不一定刚刚好被划分成整数页,也有可能指令的最后一点点被划分到一个新的页里面去了,如果你的页面大,那么浪费的也就大,如果你的页面小那么浪费的也就小。如果要是内零头尽量小,那就采用小尺寸的页。而外存的设计就是希望用较大的块,这样I/O效率更高

关于页表的结构
如果页面很小,一个大进程就会被分为很多个页,每一个页对应一个表项,你要组织一个大页表才能装下这么多个表项,大页表占用大内存,那么该怎么组织这个大页表呢?

  • 虚拟页表:(虚拟存储就是在进程执行之前只装一部分数据进去,后期用到的数据后期装)。虚拟页表也是,我们只把页表的一部分装进来,等查找到时候再把那些没有被装进来的页表再把它装进去。
  • 多级页表:程序实际的数据和代码首先分成若干页,然后给它们建页表,建的页表由于很大,所以我们给这些页表再建页表。最高层的页表满足在一页里面能够放得下。
    在这里插入图片描述
  • 反置页表:现在我们不按进程建页表,而是按照内存建页表。在内存里建一张页表来记载所有进程的页和叶框情况。

5.简单分段技术

1.分页与分段技术区别
系统将物理内存划分成许多尺寸不一定相等的分区。不同于分区技术,在简单分段技术中一个进程可以占用离散的几个分区。
分页技术已经提高内存管理了,引入分段就是为了方便用户编程。因为分页技术容易打乱程序内在的逻辑,而分段就是为了保护内在逻辑。

2.分段技术的基本概念

  • 分区表:记载物理内存的分区情况。一个进程进入内存的时候先查找分区表,看哪些是空的、可用的,它和动态分区有一样也会产生外零头(一个大进程没有一个段能够装得下,那就只能把小分区合并为大分区)
  • 段表:描述了一个进程有多少个段,每个段在内存的分区起始地址。
  • 段表寄存器:类似于页表寄存器,正在执行的进程的段表的起始地址也要存放到段表寄存器里面,让cpu快速找到你的段表。

3.越界问题
我们会给每一个段一个最大长度,最大长度就是防止越界。

分页技术没有必要要存储保护,因为一个页它本省没有物理含义,所以探测访问是否越界没有意义,但分段里面需要存储保护。

  • 分段技术里面需要存储保护:以逻辑地址中的段号获得其对应的段表项(段表项里面记录了分区的起始地址),如果逻辑地址中的段内偏移大于段表项中的段长度(一个1000的段你访问到1050了,那就越界了)就产生存储保护中断;如果没有越界,那就起始物理地址+段内偏移得到物理地址。

4.环保护
系统在每个段表项中还保存了各个段所在环的级别。
一个程序可以调用同级环或较高级环中的服务。(同级环里的程序可以相互调用,低级环也可以调用高级环里面的程序)
一个程序可以访问同级环或较低级环中的数据。(同级环里的程序可以相互访问,高级环也可以访问低级环里面的程序)

6.简单段页式技术

在这里插入图片描述

7.虚拟存储技术

1.局部性原理
局部性原理:就是最近访问过的会经常被访问。在很短的时间内,程序访问的代码和数据总是局限于一个比较小的区域。
在这里插入图片描述
2.虚拟存储器
在这里插入图片描述
在这里插入图片描述
虚拟存储因为是只把一部分数据程序调入内存,所以它给用户的感觉就是把磁盘的一部分虚拟为内存来用,但并不是硬盘空间有多大你的虚拟空间就有多大,它受制于计算机的地址位数的限制,32位的计算机不可能当作64位来用。

3.请求页式存储管理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本来页表只包含两部分:页号和内存块号,现在在虚拟存储需要增加如下:
中断位:用0和1来表示该页面在不在内存中。
访问位:记录该页被访问过几次或多长时间没有被访问了。
修改位:记录该页是否被修改过,被修改过的页面我们要把它淘汰掉时需要有一些其他操作。
外存地址:指出该页在外存上的地址,调入该页面时需要该地址。

在这里插入图片描述
4.抖动
计算机内存空间满了你换一些不怎么用的出去,结果换出去以后发现计算机还要用它你把它装进来后把其他不用的换出去,结果发现刚刚换出去的还要用,计算机就不停的换出去调进来,效率很低但计算机却很忙。
原因:

  • 你的页面置换算法不好

5.页面置换算法
在这里插入图片描述
在这里插入图片描述
6.页面置换算法的常见算法
在这里插入图片描述
在这里插入图片描述
(OPT算法相当于是一种先知算法,没有人会知道那个页面未来什么时候调用,只能凭借以往数据预测)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
最近最少使用算法要求 你的每个页面都需要记载它的时间戳,然后排序计算,这极度开销内存(它不像OPT压根不可能实现,但实现起来很困难)
在这里插入图片描述


第一种时钟页面置换算法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在时钟页面换算法中,假如队列中依次是5*、2、4*,现在指针指向4*。
如果此时要访问的页面是2,那么2会变成2*,但指针依旧是在4*身上,指针不会变,(不会说因为刚刚调用了2号页面就改变指针指向了)。所以当访问一个存在的页面时,不会改变指针的指向,而是直接后台调用该页面即可


第二种时钟页面置换算法:
在这里插入图片描述

在这里插入图片描述
(首先选择没有用过u=0没有修改过m=0,再选没有用过u=0修改过m=1)
在这里插入图片描述

在这里插入图片描述
7.回顾地址转换

  • 进程得到调度执行的时候,cpu需要进程地址转换(把当前知道的逻辑地址转换为物理地址),
  • 在地址转换的时候如果TLB快表里面有该页表项,那么就可以在TLB快表里面完成地址的转换,而且如果TLB里面有该页表项那就说明该进程就在内存里,就可以直接在内存找到该进程。
  • 如果TLB里面没有该页表项,那就去页表里面找该页表项(执行进程的页面可能一部分在内存一部分在外存,但内存和外存所有页面的页表项一定都在页表里面有记载,页表如下图所示),我们查看一下驻留位是0还是1就知道该页面在不在内存中。如果发现在页面在内存中那就把该页面的页表项添加到TLB里面去(TLB保存的是最近访问过的页页面的页表项)。如果该页面不在内存,那就发生缺页中断处理,该进程就被阻塞被中断执行,然后操作系统会通知cpu给磁盘控制器发出一个 “读对应的页从磁盘的某位置读到内存” 的命令,磁盘控制器就会读取相应的页。在读进来之前会先判断内存有没有空间装下该进程,如果没有空间那就要进行页面置换。
    在这里插入图片描述

8.页面什么时候换出去
一个被选定换出去的页面什么时候换出去(写道外面的磁盘上)?

  • 被修改过的页面置换出去是需要有一次写磁盘的操作的。页面换出去之前先判断该页面有没有修改过,被修改过的放到“修改队列”里去,没有被修改过的放到“未被修改过的队列”里去。有两点好处:
  • 这样换出去的页面也就做到了不是马上就换出去而是先在内存里面保留一段时间看看待会儿会不会被内存叫回去,防止频繁的内存外存切换(这叫页面缓存技术)。
  • 这么做也能使得那些被修改过的页面批量进行写磁盘而不是一个一个的写。

9.负载控制
负载控制就是动态调整驻留在内测的进程数量。
内存里面的进程太少,那就可能因为使每个进程都发送阻塞(一个进程依赖的另一个进程在外存里面就得阻塞);而内存里面的进程太多,那么发生缺页终端的概率就高,因为内存里面进程太多,每个进程装进内存的页面就少,运行一个进程那就得发生置换页面,换出去又要换进来,大量换进换出发生抖动现象。


负载控制的两个准则:

  1. L=S准则:如果处理页面失败的平均时间等于页面失败的平均时间,那么cpu利用率最高。(前一次缺页中断处理完成了又发生下一次缺页中断,这次缺页中断处理完了又发生下一次缺页中断,这种刚刚接上的中断处理是最好的)
  2. 50%准则:如果分页式系统利用率达到50%那么cpu效率最高。

系统负载过高就挂起一些进程,挂起优先级最低的进程、或挂起缺页的进程、或挂起最后被激活的进程、或挂起最大的进程。





第四章 设备管理

在这里插入图片描述

1.I/O设备

什么是I/O设备?

  • 人可读的:打印机(打印机打印出来的你看得懂吧?)、键盘、显示屏
  • 机器可读的:磁盘、硬盘
  • 以上那些都是I/O设备,很明显传输速率是高低不同的

在这里插入图片描述
I/O设备的特点
在这里插入图片描述
在这里插入图片描述

I/O设备的分类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
I/O设备管理的功能和任务
在这里插入图片描述
I/O的控制方式(重点!!!!)

为什么要进行I/O控制:尽量减少主机对外设的干预,把主机从繁杂的I/0控制中解脱出来

在这里插入图片描述
三种I/O控制方式:

  • 查询方式(你之前的busy-waiting就是这种,一种忙等)
  • 中断驱动(不再是一种忙等的方式等待了,而是采用中断的方式来等待)
  • DMA控制(中断的次数少了,读写传输的量更多)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    中断方式就是在询问方式的基础上少了繁琐的询问环节,但因为还是一个一个字节的传送所以效率并不高。

在这里插入图片描述
DMA方式就是在系统和cpu之间增加了一个DMA芯片,充当cpu助手,cpu只需要在开始的时候向设备发送命令,其余的由DMA完成,中间就是以块的形式传送,不再是一个一个字节的传送。
在这里插入图片描述
DMA方式是和cpu共享系统总线的方式,cpu用系统总线来取指令、解码、执行,DMA传输传输数据会占用和cpu共享的系统总线就会使得cpu暂时停一下给DMA使用,不过和中断不一样,它DMA会让cpu暂时停一个周期但不会让cpu中断,所以cpu不用保存上下文。所以DMA的方式减少了cpu的中断次数,此外数据还是以块来传输。

在这里插入图片描述
在这里插入图片描述

2.缓冲(I/O Buffering)技术

在这里插入图片描述

没有缓冲的话不仅会影响进程的速率还可能出现单进程死锁:
一个进程因为要进行I/O交互读数据被阻塞了,读入数据到内存是由磁带控制器控制的,这个进程读数据时假如没有缓冲,现在就是从磁带上读入一块数据并且直接放入用户工作区。
此时cpu如果调度另外一个进程,由于现在内存不足,把上一个阻塞的进程挂起了,那么就会释放上一个进程的空间,那么上一个进程被读入内存的数据就被释放了,现在磁带控制器读入的数据就会丢失一部分。上一个进程一直在等数据,而现在一部分数据被释放了,等也等不来,那就会导致单进程死锁。

在这里插入图片描述

  • 提前读:cpu在处理前一个数据的时候,缓冲区就已经提前读入下一个数据了,这是并行的,这样cpu直接从缓冲区读入下一个数据。
  • 延后写:不是进程发出写的命令操作系统就去做的,而是先把数据暂存在I/O缓冲区(万一内存还要用呢,这样就可以直接再暂存的缓冲区上调),等指定的输出设备空闲的时候才会从缓冲区写入用户进程指定的输出设备上。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
特殊的缓冲区——Disk Cache(磁盘缓冲)
在这里插入图片描述
在这里插入图片描述
如果我们要设计DiskCache那么需要考虑一下几个问题:

  • 当用户进程请求从磁盘上读入一个扇区时,如果系统能够在disk cache中找到该扇区的副本,那么系统如何把该副本提交给用户进程?是直接把这块move过去呢还是让他过来访问这块呢?(看权限,如果用户没办法访问你你就move过去)
  • 如果disk cache没有空闲空间,那么系统使用何种策略从diskcache中选择一个被置换扇区?跟页面置换算法有的一比

3.驱动调动技术

之前讲的是一个I/O的效率,那么批量I/O该怎么提高效率呢?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.磁盘访问时间

  • 寻道时间:指把磁臂(磁头)移动到指定磁道上所经历的时间
  • 旋转延迟时间:如果磁头已经定位到所要寻找的数据所在的磁道上方的时候,指定扇区移动到磁头下面所经历的时间。
  • 传输时间:数据从磁盘读出或写入所花的时间。
  • 因为寻道时间最长,所以我们要优化寻道时间-----磁盘驱动臂调度算法。

3.磁盘驱动臂调度算法。
在这里插入图片描述
在这里插入图片描述
1)先来先服务就是谁先来就先查谁。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.提高磁盘I/O速度的一些方法
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述





第五章 文件管理

把信息以文件的形式存储在磁盘或其他外部介质上。这样就可以能够存储大量的信息、长期保存信息、可以共享信息。
对文件系统的要求

  • 满足对用户的需求:保证响应时间的要求,如果数据丢失或损坏了要尽量减少这种损坏,支持多用户的I/O操作,不同用户的访问读写权限
  • 满足操作系统的需求:。。。

1.文件的三个等级
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、总说

在这里插入图片描述
1.驱动器Device Driver
Device Driver包括Disk Device Driver和Tape Device Driver
功能是和外部设备直接通讯,负责启动设备上的I/O,包括检测该I/O设备是否可用以及该设备已经传输了多少数据了。
2.Basic File System基本文件系统
与数据块进行交换数据,需要关心在磁盘上的这个块在外存的位置、在内存的位置,检测I/O buffer哪些是空的、是可用的。 (这一层就出现块了)
3.Basic I/O Supervisor
通过上一层,块的位置现在已经有了,但是哪个块在哪个文件我们并不知道。这一层就必须知道这些了。

这一层的功能是对文件输入输出的初始化和终止。也就是当你要输入一个文件那它就要查它的文件表有没有,没有那就建一个,结束的时候就要更新。而且分配那些空的、可用的I/O buffer。 (这一层就生成文件了)

4.逻辑I/O Logical I/O
对I/O记录做检索、删除等 (这一层就生成记录了)

2.对文件的组织

1.文件的两种组织

  • 逻辑结构组织:文件记录的逻辑结构决定了文件的访问方式。
  • 物理结构组织:文件存储是以块的方式进行的,它就是组织那些快来节约存储。

逻辑组织要求用户访问该文件时能够很快的做出反应,要求文件易于修改,要求存储成本低。
基于这些要求就形成了文件的逻辑组织方式(也就是文件的访问方式):堆文件、顺序文件、索引顺序文件、索引文件、哈希文件

2.文件的访问方式(文件的逻辑组织方式)

  • 堆文件:按照文件到来的先后顺序把文件堆上去,用来保存数据(比如接受卫星传感器发送来的数据),没有结构,查找困难。
  • 顺序文件:顺序文件已经使得接收来的数据记录的结构、长度都是提前定义好的,比起堆文件有结构了。顺序文件就相当于期末成绩表一样,每个人的结构都是一样的。它是唯一一种适合于磁带和磁盘存储的文件方式。但是 查询数据、插入数据什么的效率都很低。
  • 顺序文件当你要插入一条数据时还得批量移动,为了降低这种影响你可以①把要插入的数据先攒起来,等堆积到一定的量了再批量插入。②你可以用索引顺序文件
  • 索引文件:索引会加快检索速度,索引就像书的目录(一个索引是好几十页的浓缩),你要找某个内容通过目录找比一页页的找快了很多。
  • 索引顺序文件:既有索引,原文件还是按照顺序排序的。
  • 哈希文件:常用于访问速率要求高、一次存取一条记录且记录为定长的文件。如文件目录、价格表、名单等文件记录的存取。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.文件目录

在这里插入图片描述

  • 你不能把一个目录的磁盘位置什么的都记录在目录文件里面,这样目录文件会很臃肿。
    在这里插入图片描述
    文件目录结构
    在这里插入图片描述
    在这里插入图片描述
    你把PPT文件、游戏文件、word文件什么的都放在一个目录里面,这就是一级目录结构。

在这里插入图片描述
支持多用户的,给每个用户建一个目录
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.记录组块的方式

目录查询查找到相应的文件以后,把文件先读到disk cache里面(也就是内存的buffer里),在外存上和内存的buffer里面都是以block的方式来组织这个文件的,但到了内存工作区是以记录的方式来组织这个文件的。记录访问完以后要把它存到外存上去,但要把记录转为block才能写到外存上去,我们先把它从内存工作区放到在内存的buffer里转为block的方式然后才能写道外存上去。那么该如何给记录组块呢?

固定长度的组块方式

  • 首先,数据块大多都是定长的,这样不用记录每个数据块的长度方便组织管理以及Buffer的分配。
  • 其次,在外存里面,磁道要划分扇区,扇区的数据容量最好相同,这样方便管理(磁盘是一个同心圆,假如每个同心圆都被划分成5个扇区,我们知道外面的圆大里面圆小,所以外面的扇区磁密度低里面的扇区磁密度高)

在这里插入图片描述

  • 数据块该设置的大一些好呢还是小一些好呢?数据块大一次I/O传输的记录就多,加快速度。但大数据快不适合随机访问,你随机访问一个大数据块里面存了太多记录就很难查找;大数据块适合顺序访问,因为顺序访问可以访问到相邻的记录。几乎没有一条记录会超过一个块的大小,所以一般不会出现一个块都装不下一个记录的情况(也就是一般不会出现外零头)。
  • 固定长度的数据块就可能造成空间的浪费,一个记录不可能刚好分在同一个块里面,如果你不用这个块就会造成浪费(浪费的块相当于内零头),所以一个记录可能跨了两个块,你要记录下来。

可变长度的组块方式

  • 数据块由变长记录组成,一条记录可以跨越两个数据块,可用指针记载一条跨块存储记录所在的下一数据块
  • 好处是:块内无空间浪费;坏处是:降低I/O效率(一条记录还要读两个块)
    在这里插入图片描述
    可变长非跨块组块法
    块内可能存在被浪费空间,宁愿浪费也不允许一条记录跨越两个数据块,数据块是可变长的
    在这里插入图片描述

5.文件安全

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.外部存储管理

前面讲了文件在内存的组织结构、在内存的目录管理、在内存的组块方式、在内存的访问权限控制。
现在我们介绍文件在外存的管理

磁盘有一个文件进来,磁盘如何给文件分配空间?
内存有分区方式、分页方式、分段方式,可以离散的分配空间,那么外存呢?
外存的那些未分配空间又是如何管理呢?

外存分配空间
文件大小并不是固定大小的,所以我们并不能给它一个固定大小的空间

  • 预分配策略:用户设置一次性给这个文件可用的最大空间,以后这个文件不要超过这个空间。(缺点:用户很难准确估计大小)
  • 动态划分技术:要多少给多少,大了收回去,小了再给你一些。(但是一个文件就给它分配若干个扇区,为了不造成浪费 这些扇区可以不连续,这种离散存储会导致单个文件读取效率极低,虽然磁盘利用率很高)(所以分配时不仅要满足文件大小,而且要尽量让这些磁盘块连续)

文件分配的方法
当初内存分配时连续的是分区技术,离散的是分页技术和分段技术。
文件分配先从分配技术上将分为预分配和可变分配

1.连续分配

  • 因为是连续分配所以一个接一个的分区存文件,所以只需要记住它的起始地址就依次算出来后面的分区。文件分配表就很简单只要记住文件名以及该文件起始地址和长度即可
  • 在这里插入图片描述
  • 分配算法:
  • “First fit算法”:你可以每次固定一个点开始寻找,找到第一个没有使用的足够大的连续空间那就可以分配给它。
  • Best Fit算法:找到所有空闲的连续空间,排序,找一个刚刚好装得下这个文件的空闲空间分配给它
  • Nearest fit算法:从上次分配到的地方开始找,找到第一个没有使用的足够大的连续空间那就可以分配给它。
  • 因为一个文件经常比一个连续分区大所以有外零头

2.链接分配
因为有链所以每一个扇区都可以利用起来,完全消除了外零头。最适合顺序文件,适合顺序依次访问下去,不适用于局部性很强的那些文件(因为局部性很强的你要定位到那个文件的某一个常用的block,而那个文件上万块block你要定位到那一小块这样查找效率很低)
另外检索效率也很低,文件的块在磁盘上是离散存储,访问读写效率很低。

所以,你可以尽量让它们存储的紧凑一些,也可以周期性的整理合并一些。

3.索引分配
支持顺序访问、直接访问;链接分配只支持顺序访问。

基于固定大小的portion分区。

  • 其中有一个是索引节点(记载了文件分到的块的位置),另一个是索引分配表里记载了索引节点的信息。
  • 你通过索引分配表找到索引节点所在的位置,然后通过索引节点找到该文件被分配到的块。

在这里插入图片描述

  • (索引分配只是通过索引节点解决了链接分配的一个“链断了就找不到该文件了”的问题,但还是文件的块在磁盘上是离散存储,访问读写效率很低。

改进:现在是基于可变大小的portion(可变分区)就可以让那些离散的块有稍微的连续
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45014721/article/details/110334842