mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-06-17 07:27:12 +08:00
更新文件管理
This commit is contained in:
@@ -111,8 +111,46 @@ $D.$以上均可
|
||||
|
||||
![原码一位乘法][yuanmayiwei]
|
||||
|
||||
补码一位乘法
|
||||
|
||||
**例题** 设机器字长为$n+1=5$位(含$1$位符号位),其中$x$的原码为$-0.1101$,$y$的原码为$0.1011$,采用原码一位乘法求$x\cdot y$。
|
||||
|
||||
![补码一位乘法][bumayiwei]
|
||||
|
||||
所以$x\cdot y=-0.10001111$。
|
||||
|
||||
#### 定点数除法运算
|
||||
|
||||
原码恢复余数法
|
||||
|
||||
**例题** 设机器字长为5位(含一位符号位),x=0.1011,y=0.1101,采用原码恢复余数法求x/y。
|
||||
|
||||
其中x就是+0.1011,而y就是+0.1101。先抛去符号位,就得到01011和01101两个数据。然后求出y绝对值的补码:01101和-y绝对值的补码:10011。
|
||||
|
||||
将MQ、ACC、X都初始化为五位存储单元。将被除数01011放入ACC中,将除数01101放入X中,商初始化为00000。
|
||||
|
||||
手算时每位商取0/1是通过判断当前余数和除数的大小确定的。而机器实现时就要通过ALU判断是ACC中的数更大还是X中的数更大,如果ACC的更大就商1,若X的更大就商0。
|
||||
|
||||
第一位默认商1,ACC-=X,ACC的01011和X的10011(X实际值的负值的补码)输入ALU进行加操作01011+10011=11110,返回给ACC,此时发现代表符号的最高位为1,代表出现了负数,就表明之前的商出错了,所以重新确定商为0,ACC要恢复余数,从而再加上y的补码:11110+01101=01011。
|
||||
|
||||
第一位的商计算完后需要进行计算,错位相除,所以同乘法一样,ACC和MQ的值都要逻辑左移一位,低位补0,所以MQ由00000还是变为00000,MQ的最高位的0移到ACC最低为,ACC最高位丢弃,由01011变成10110。
|
||||
|
||||
然后第二位默认商1,同样ACC-=X,10110+10011=01001,将这个值赋给ACC,发现符号位为0,代表正,商就没有问题,MQ为00001。
|
||||
|
||||
再次逻辑左移一位,MQ由00001变为00010,ACC由01001变为10010。
|
||||
|
||||
第三位默认商1,同样ACC-=X,10010+10011=00101,商没有问题,MQ为00011。
|
||||
|
||||
再次逻辑左移一位,MQ由00011变为00110,ACC由00101变为01010。
|
||||
|
||||
第四位默认商1,同样ACC-=X,01010+10011=11101,高位为1,商应该为0,MQ变为00110,ACC恢复余数:11101+01101=01010。
|
||||
|
||||
再次逻辑左移一位,MQ由00110变为01100,ACC由01010变为10100。
|
||||
|
||||
第五位默认商1,同样ACC-=X,10100+10011=00111,高位为0,商没有问题,MQ为01101。
|
||||
|
||||
此时计算结束,商为01101,余数为00111。
|
||||
|
||||
![buhuifuyushu]
|
||||
|
||||
![jiajianjiaoti]
|
||||
|
||||
@@ -380,6 +380,15 @@ k|2|3|4|5|6|7
|
||||
+ 为了加快运算会有辅助电路实现$(-x)$的补码的运算。
|
||||
+ 最后一次不需要移位直接根据辅助位和$MQ$最后一位判断进行相加。从而让乘数的符号位也参数运算中来确定最后结果的符号。
|
||||
|
||||
$Booth$算法的移位法则:
|
||||
|
||||
$y_n$(高位)|$y_{n+1}$(低位)|操作
|
||||
:-----------:|:---------------:|:--:
|
||||
0|0|部分积右移一位
|
||||
|0|1|部分积加$[X]_{\text{补}}$,右移一位
|
||||
1|0|部分积加$[-X]_{\text{补}}$,右移一位
|
||||
1|1|部分积右移一位
|
||||
|
||||
|原码|补码
|
||||
:----:|:--:|:--:
|
||||
计算流程|n轮加法、移位|n轮加法、移位,最后进行一次加法
|
||||
@@ -391,15 +400,11 @@ k|2|3|4|5|6|7
|
||||
|
||||
#### 定点数除法运算
|
||||
|
||||
进行除法操作时,都是为了找到一位能让商乘除数能最大即余数最小但大于0的值。若除数被除数都是小数,可以同时乘一个数变成整数再运算。
|
||||
+ 进行除法操作时,都是为了找到一位能让商乘除数能最大即余数最小但大于$0$的值。若除数被除数都是小数,可以同时乘一个数变成整数再运算。
|
||||
+ 所以可以忽略小数点,每确定一位商进行一次减法,若机器字长为$n$位,则得到$n-1$位余数,在余数末尾补$0,再确定下一位商$0$或$1$,直到确定$n$位商即可停止。
|
||||
+ 在运算器的组成时出现一个表格,说明在进行除运算时,$ACC$保存被除数和余数,$MQ$保存商,$X$保存除数。
|
||||
|
||||
所以可以忽略小数点,每确定一位商进行一次减法,若机器字长为n位,则得到n-1位余数,在余数末尾补0,再确定下一位商0或1,直到确定n位商即可停止。
|
||||
|
||||
在运算器的组成时出现一个表格,说明在进行除运算时,ACC保存被除数和余数,MQ保存商,X保存除数。
|
||||
|
||||
##### 原码恢复余数法
|
||||
|
||||
原码使用恢复余数法进行除运算:
|
||||
原码恢复余数法:
|
||||
|
||||
1. 字长若为n+1位,则ACC、MQ、X全部初始化为n位,将被除数的绝对值放入ACC中,X放入除数的绝对值,MQ初始化为全0。
|
||||
2. 将MQ的最右边的一位当做当前除运算位,让其进行除运算,运算规则是,默认商1,ACC-=X,即x的补码要加上除数的绝对值的负值的补码(减法都由补码的加法实现),判断是否有误。若结果高位为0则无误,高位为1则有误,错误则商改为0,并恢复余数,ACC加上X中除数的补码。
|
||||
@@ -408,51 +413,18 @@ k|2|3|4|5|6|7
|
||||
5. 定点小数的小数位隐藏在符号位后面第一位,定点正数的小数位隐藏在最后一位后。
|
||||
6. 将两个符号位的异或结果赋值给商最高位。
|
||||
|
||||
**例题** 设机器字长为5位(含一位符号位),x=0.1011,y=0.1101,采用原码恢复余数法求x/y。
|
||||
原码加减交替法:
|
||||
|
||||
其中x就是+0.1011,而y就是+0.1101。先抛去符号位,就得到01011和01101两个数据。然后求出y绝对值的补码:01101和-y绝对值的补码:10011。
|
||||
|
||||
将MQ、ACC、X都初始化为五位存储单元。将被除数01011放入ACC中,将除数01101放入X中,商初始化为00000。
|
||||
|
||||
手算时每位商取0/1是通过判断当前余数和除数的大小确定的。而机器实现时就要通过ALU判断是ACC中的数更大还是X中的数更大,如果ACC的更大就商1,若X的更大就商0。
|
||||
|
||||
第一位默认商1,ACC-=X,ACC的01011和X的10011(X实际值的负值的补码)输入ALU进行加操作01011+10011=11110,返回给ACC,此时发现代表符号的最高位为1,代表出现了负数,就表明之前的商出错了,所以重新确定商为0,ACC要恢复余数,从而再加上y的补码:11110+01101=01011。
|
||||
|
||||
第一位的商计算完后需要进行计算,错位相除,所以同乘法一样,ACC和MQ的值都要逻辑左移一位,低位补0,所以MQ由00000还是变为00000,MQ的最高位的0移到ACC最低为,ACC最高位丢弃,由01011变成10110。
|
||||
|
||||
然后第二位默认商1,同样ACC-=X,10110+10011=01001,将这个值赋给ACC,发现符号位为0,代表正,商就没有问题,MQ为00001。
|
||||
|
||||
再次逻辑左移一位,MQ由00001变为00010,ACC由01001变为10010。
|
||||
|
||||
第三位默认商1,同样ACC-=X,10010+10011=00101,商没有问题,MQ为00011。
|
||||
|
||||
再次逻辑左移一位,MQ由00011变为00110,ACC由00101变为01010。
|
||||
|
||||
第四位默认商1,同样ACC-=X,01010+10011=11101,高位为1,商应该为0,MQ变为00110,ACC恢复余数:11101+01101=01010。
|
||||
|
||||
再次逻辑左移一位,MQ由00110变为01100,ACC由01010变为10100。
|
||||
|
||||
第五位默认商1,同样ACC-=X,10100+10011=00111,高位为0,商没有问题,MQ为01101。
|
||||
|
||||
此时计算结束,商为01101,余数为00111。
|
||||
|
||||
##### 原码加减交替法
|
||||
|
||||
因为恢复余数很麻烦,所以会考虑是否不用恢复余数,直接进行运算得到后面的结果。
|
||||
|
||||
假如令原始值为x,原始值加上-y绝对值的补码结果为a,y绝对值的补码为b,按恢复余数法,a这个余数是一个负值,所以要加上b即a+b变成原始值a+b=x,这时候商0,然后计算下一个商,余数a+b左移一位,即(a+b)×2=2a+2b,这时候商1看看结果是否正确,即2a+2b要减去y绝对值的补码(等价于加上-y绝对值的补码)2a+2b-b=2a+b。
|
||||
|
||||
所以如果得到了一个负的余数a,可以直接转换到2a+b这个结果,即直接左移一位余数再加上除数的补码就可以得到结果。
|
||||
|
||||
这就是加减交通法或不恢复余数法。
|
||||
|
||||
从而恢复余数法就是当余数为负时商0,并+|除数|,再左移,再-|除数|,而加减交替法是当余数为负时商0,并左移,再+[除数|,若余数为正时商1,并左移,再-|除数|。
|
||||
|
||||
值得注意的是,若在最后一步余数为负,需要商0,并加上除数的补码得到正确余数。
|
||||
+ 因为恢复余数很麻烦,所以会考虑是否不用恢复余数,直接进行运算得到后面的结果。
|
||||
+ 假如令原始值为x,原始值加上-y绝对值的补码结果为a,y绝对值的补码为b,按恢复余数法,a这个余数是一个负值,所以要加上b即a+b变成原始值a+b=x,这时候商0,然后计算下一个商,余数a+b左移一位,即(a+b)×2=2a+2b,这时候商1看看结果是否正确,即2a+2b要减去y绝对值的补码(等价于加上-y绝对值的补码)2a+2b-b=2a+b。
|
||||
+ 所以如果得到了一个负的余数a,可以直接转换到2a+b这个结果,即直接左移一位余数再加上除数的补码就可以得到结果。
|
||||
+ 这就是加减交通法或不恢复余数法。
|
||||
+ 从而恢复余数法就是当余数为负时商0,并+|除数|,再左移,再-|除数|,而加减交替法是当余数为负时商0,并左移,再+[除数|,若余数为正时商1,并左移,再-|除数|。
|
||||
+ 值得注意的是,若在最后一步余数为负,需要商0,并加上除数的补码得到正确余数。
|
||||
|
||||
<span style="color:orange">注意:</span>在定点小数运算时,商只能是小数而不能是整数,所以被除数一定要小于除数,机器判断标准是看第一步计算的商,若第一步计算的商是1则代表结果大于1,机器就会报错。
|
||||
|
||||
##### 补码加减交替法
|
||||
补码加减交替法:
|
||||
|
||||
+ 符号位参与运算。
|
||||
+ 被除数÷余数、除数采用双符号位。
|
||||
|
||||
@@ -137,7 +137,6 @@ $D.$循环首次适应算法
|
||||
|
||||
逻辑地址$3AC5H$转换为二进制是$011\,1010\,1100 0101B$,页号为$14$,而该用户程序只有$10$页,因此系统产生越界中断。
|
||||
|
||||
|
||||
#### 快表
|
||||
|
||||
**例题** 某系统使用基本分页存储管理,并采用了具有快表的地址变换机构。访问一次快表耗时$1\mu s$,访问一次内存耗时$100\mu s$。若快表的命中率为$90\%$,那么访问一个逻辑地址的平均耗时是多少?
|
||||
@@ -148,6 +147,24 @@ $D.$循环首次适应算法
|
||||
|
||||
若该系统支持快表慢表同时查找,则为$(1+100)\times0.9+(100+100)\times0.1=110.9\mu s$。
|
||||
|
||||
**例题** 下列措施中,能加快虚实地址转换的是()。
|
||||
|
||||
Ⅰ增大快表容量
|
||||
|
||||
Ⅱ.让页表常驻内存
|
||||
|
||||
Ⅲ.增大交换区
|
||||
|
||||
$A.$仅Ⅰ
|
||||
|
||||
$B.$仅Ⅱ
|
||||
|
||||
$C.$仅Ⅰ、Ⅱ
|
||||
|
||||
$D.$仅Ⅱ、Ⅲ
|
||||
|
||||
解:$C$。虚实地址转换是指逻辑地址和物理地址的转换。增大快表容量能把更多的表项装入快表,会加快虚实地址转换的平均速率;让页表常驻内存可以省去一些不在内存中的页表从磁盘上调入的过程,也能加快虚实地址转换;增大交换区对虚实地址转换速度无影响,因此Ⅰ、Ⅱ正确。
|
||||
|
||||
#### 多级页表
|
||||
|
||||
**例题** 某计算机采用二级页表的分页存储管理方式,按字节编址,页大小为$2^{10}B$,页表项大小为$2B$,逻辑地址结构为(页目录号,页号,页内偏移量),逻辑地址空间大小为$2^{16}$页,则表示整个逻辑地址空间的页目录表中包含表项的个数至少是()。
|
||||
@@ -264,6 +281,44 @@ $D.$Ⅰ、Ⅱ和Ⅲ
|
||||
|
||||
解:$B$。用户进程访问内存时缺页,会发生缺页中断。发生缺页中断时,系统执行的操作可能是置换页面或分配内存。越界错误是编程时访问内存越界,系统内没有越界错误,不会进行越界出错处理。
|
||||
|
||||
#### 资源利用情况
|
||||
|
||||
**例题** 测得某个采用按需调页策略的计算机系统的部分状态数据为:$CPU$利用率为$20\%$,用于交换空间的磁盘利用率为$97.7\%$,其他设备的利用率为$5\%$。由此判断系统出现异常,这种情况()能提高系统性能。
|
||||
|
||||
$A.$安装一个更快的硬盘
|
||||
|
||||
$B.$通过扩大硬盘容量增加交换空间
|
||||
|
||||
$C.$增加运行进程数
|
||||
|
||||
$D.$加内存条来增加物理空间容量
|
||||
|
||||
解:$D$。用于交换空间的磁盘利用率已达$97.7\%$,其他设备的利用率为$5\%$,$CPU$的利用率为$20\%$,说明在任务作业不多的情况下交换操作非常频繁,因此判断物理内存严重短缺。
|
||||
|
||||
**例题** 假定有一个请求分页存储管理系统,测得系统各相关设备的利用率为:$CPU$的利用率为$10\%$,磁盘交换区的利用率为$99.7\%$,其他$I/O$设备的利用率为$5\%$。下面()措施将可能改进$CPU$的利用率。
|
||||
|
||||
Ⅰ.增大内存的容量
|
||||
|
||||
Ⅱ.增大磁盘交换区的容量
|
||||
|
||||
Ⅲ.减少多道程序的度数
|
||||
|
||||
Ⅳ.增加多道程序的度数
|
||||
|
||||
Ⅴ.使用更快速的磁盘交换区
|
||||
|
||||
Ⅵ.使用更快速的$CPU$
|
||||
|
||||
$A.$Ⅰ、Ⅱ、Ⅲ、Ⅳ
|
||||
|
||||
$B.$Ⅰ、Ⅲ
|
||||
|
||||
$C.$Ⅱ、Ⅲ、Ⅴ
|
||||
|
||||
$D.$Ⅱ、Ⅵ
|
||||
|
||||
解:$B$。Ⅰ正确:增大内存的容量。增大内存可使每个程序得到更多的页面,能减少缺页率,进而减少换入/换出过程,可提高$CPU$的利用率。Ⅱ错误:增大磁盘交换区的容量。因为系统实际已处于频繁的换入/换出过程中,不是因为磁盘交换区容量不够,因此增大磁盘交换区的容量无用。Ⅲ正确:减少多道程序的度数。可以提高$CPU$的利用率,因为从给定的条件知道磁盘交换区的利用率为$99.7\%$,说明系统现在已经处于频繁的换入/换出过程中,可减少主存中的程序。Ⅳ错误:增加多道程序的度数。系统处于频繁的换入/换出过程中,再增加主存中的用户进程数,只能导致系统的换入/换出更频繁,使性能更差。Ⅴ错误:使用更快速的磁盘交换区。因为系统现在处于频繁的换入/换出过程中,即使采用更快的磁盘交换区,其换入/换出频率也不会改变,因此没用。Ⅵ错误:使用更快速的$CPU$。系统处于频繁的换入/换出过程中,$CPU$处于空闲状态,利用率不高,提高$CPU$的速度无济于事。综上分析:Ⅰ、Ⅲ可以改进$CPU$的利用率。
|
||||
|
||||
### 页面置换算法
|
||||
|
||||
**例题** 考虑页面置换算法,系统有$m$个物理块供调度,初始时全空,页面引用串长度为$p$,包含了$n$个不同的页号,无论用什么算法,缺页次数不会少于()。
|
||||
@@ -295,3 +350,40 @@ $C.$需要在页表中标明特殊的页类型
|
||||
$D.$需要对所有的页进行排序
|
||||
|
||||
解:$D$。最近最久未使用置换算法需要根据调入页面顺序进行排序找到最久未使用的,而$A$是$D$的结果。
|
||||
|
||||
### 抖动
|
||||
|
||||
**例题** 当系统发生抖动时,可以采取的有效措施是()。
|
||||
|
||||
I.撤销部分进程
|
||||
|
||||
I.增加磁盘交换区的容量
|
||||
|
||||
Ⅲ.提高用户进程的优先级
|
||||
|
||||
$A.$仅Ⅰ
|
||||
|
||||
$B.$仅Ⅱ
|
||||
|
||||
$C.$仅Ⅲ
|
||||
|
||||
$D.$仅Ⅰ、Ⅱ
|
||||
|
||||
解:$A$。在具有对换功能的操作系统中,通常把外存分为文件区和对换区。前者用于存放文件,后者用于存放从内存换出的进程。抖动现象是指刚刚被换出的页很快又要被访问,为此又要换出其他页,而该页又很快被访问,如此频繁地置换页面,以致大部分时间都花在页面置换上,导致系统性能下降。撤销部分进程可以减少所要用到的页面数,防止抖动。对换区大小和进程优先级都与抖动无关。
|
||||
|
||||
### 工作集
|
||||
|
||||
某进程访问页面的序列:
|
||||
$\cdots,1,3,4,5,6,0,3,2,3,2,t,0,4,0,3,2,9,2,1,\cdots$。
|
||||
|
||||
若工作集的窗口大小为$6$,则在$t$时刻的工作集为()。
|
||||
|
||||
$A.\{6,0,3,2\}$
|
||||
|
||||
$B.\{2,3,0,4\}$
|
||||
|
||||
$C.\{0,4,3,2,9\}$
|
||||
|
||||
$D.\{4,5,6,0,3,2\}$
|
||||
|
||||
解:$A$。在任一时刻$t$,都存在一个集合,它包含所有最近$k$次(该题窗口大小为$6$)内存访问所访问过的页面。这个集合$w(k,t)$就是工作集。题中最近$6$次访问的页面分别为$6,0,3,2,3,2$,去除重复的页面,形成的工作集为$\{6,0,3,2\}$。
|
||||
|
||||
@@ -526,6 +526,11 @@
|
||||
5. 第四轮(有访问有修改):若第三轮扫描失败,则重新扫描,查找第一个$(0,1)$的帧用于替换。需要第四轮扫描只有全部页面都被访问都被修改过这一种情况。
|
||||
6. 由于第二轮已将所有帧的访问位设为$0$,因此经过第三轮、第四轮扫描一定会有一个帧被选中,因此改进型$CLOCK$置换算法选择一个淘汰页面最多会进行四轮扫描。
|
||||
|
||||
+ $(0,0)$:最近没有使用使用也没有修改,最佳状态。
|
||||
+ $(0,1)$:修改过但最近没有使用,将会被写。
|
||||
+ $(1,0)$:使用过但没有被修改,下一轮将再次被用。
|
||||
+ $(1,1)$:使用过也修改过,下一轮页面置换最后的选择。
|
||||
|
||||
### 页面分配策略
|
||||
|
||||
#### 页面分配、置换策略
|
||||
@@ -571,7 +576,7 @@
|
||||
+ 系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不必写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需写回磁盘对换区,下次需要时再从对换区调入。
|
||||
+ $UNIX$方式:运行之前进程有关的数据全部放在文件区,故未使用过的页面,都可从文件区调入。若被使用过的页面需要换出,则写回对换区,下次需要时从对换区调入。
|
||||
|
||||
#### 抖动(颠簸现象)
|
||||
### 抖动(颠簸现象)
|
||||
|
||||
+ 刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。
|
||||
+ 产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)。所以需要合适的物理块数量。
|
||||
|
||||
@@ -2,35 +2,87 @@
|
||||
|
||||
## 文件系统
|
||||
|
||||
### 文件基本概念
|
||||
### 文件系统基础
|
||||
|
||||
#### 文件基本概念
|
||||
|
||||
用户输入输出以文件为基本单位。
|
||||
|
||||
+ 数据项:最低级数据组织形式。
|
||||
+ 基本数据项:用于描述一个对象的某种属性的一个值,是数据中可命名的最小逻辑数据单位,即原子数据。
|
||||
+ 组合数据项:多个基本数据项构成。
|
||||
+ 记录:一组相关数据项的集合,用于表述一个对象在某方面的属性。
|
||||
+ 文件:一组有意义的信息/数据的集合。
|
||||
+ 文件基本属性:
|
||||
+ 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件。
|
||||
+ 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。
|
||||
+ 类型:指明文件的类型。
|
||||
+ 位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)。
|
||||
+ 大小:指明文件大小。
|
||||
+ 创建时间。
|
||||
+ 上次修改时间。
|
||||
+ 文件所有者信息。
|
||||
+ 保护信息:对文件进行保护的访问控制信息。
|
||||
+ 文件逻辑结构:
|
||||
+ 无结构文件(如文本文件):由一些二进制或字符流组成,又称“流式文件”。
|
||||
+ 有结构文件(如数据库表):由一组相似的记录(每条记录又若干个数据项组成,数据项又包含多个属性,是文件系统中最基本的数据单位)组成,又称“记录式文件”。每条记录有一个数据项可作为关键字(如ID)。
|
||||
+ 操作系统向上提供基本功能:
|
||||
+ 创建create。
|
||||
+ 删除delete。
|
||||
+ 读文件read。
|
||||
+ 写文件write。
|
||||
+ 打开文件open。
|
||||
+ 关闭文件close。
|
||||
+ 操作系统以“块”为单位为文件分配存储空间,外村中的数据读入内存同样以块为单位。
|
||||
+ 操作系统以“块”为单位为文件分配存储空间,外存中的数据读入内存同样以块为单位。
|
||||
|
||||
#### 文件基本属性
|
||||
|
||||
+ 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件。
|
||||
+ 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。
|
||||
+ 类型:指明文件的类型。
|
||||
+ 位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)。
|
||||
+ 大小:指明文件大小。
|
||||
+ 创建时间。
|
||||
+ 上次修改时间。
|
||||
+ 文件所有者信息。
|
||||
+ 保护信息:对文件进行保护的访问控制信息。
|
||||
|
||||
#### 文件基本操作
|
||||
|
||||
+ 创建$create$。
|
||||
1. 文件系统为文件找到空间。
|
||||
2. 在目录中为新文件创建条目,记录文件名称、位置和其他信息。
|
||||
+ 删除$delete$:找到对应目录项,使其为空,并回收该文件所占存储空间。
|
||||
+ 截断:允许文件所有属性不变,删除文件内容,即设置长度归零并释放空间。
|
||||
+ 读文件$read$:执行一个系统调用,指明文件名和位置。系统维护一个读位置的指针,读时就更新读指针。
|
||||
+ 写文件$write$:执行一个系统调用,指明文件名和内容。系统通过文件名搜索位置。系统需要为文件维护一个写位置的指针,当写时就更新写指针。
|
||||
+ 文件重定位(文件寻址):按条件搜索目录,将当前文件位置设置为给定值,不读写。
|
||||
|
||||
#### 文件打开关闭
|
||||
|
||||
+ 操作系统会维护一个包含所有打开文件信息的表(打开文件表),首次使用时会将文件属性从外存赋值到内存的打开文件表中的一个表目并返回索引。所以用户进行文件操作就直接通过索引,省略了搜索。一般会根据这个指针进行文件操作。当不使用,进程会关闭文件并删除这个表目。
|
||||
+ 整个系统表包含进程相关信息,如文件在磁盘的位置、访问日期和大小。一个进程打开一个文件,系统打开文件表就会为打开的文件增加相应的条目。当另一个进程执行open时,只不过是在其进程打开表中增加一个条目,并指向整个系统表的相应条目。通常,系统打开文件表的每个文件时,还用一个文件打开计数器($Open\,Count$),以记录多少进程打开了该文件。每个关闭操作$close$使$count$递减,当打开计数器为$0$时,表示该文件不再被使用,系统将回收分配给该文件的内存空间等资源。若文件被修改过,则将文件写回外存,并将系统打开文件表中的相应条目删除,最后释放文件的文件控制块($File\,Control\,Block$,$FCB$)。
|
||||
+ 每个打开文件都有如下关联信息:
|
||||
+ 文件指针。系统跟踪上次的读写位置作为当前文件位置的指针,这种指针对打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存。
|
||||
+ 文件打开计数。文件关闭时,操作系统必须重用其打开文件表条目,否则表内空间会不够用。因为多个进程可能打开同一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件。计数器跟踪打开和关闭的数量,计数为$0$时,系统关闭文件,删除该条目。
|
||||
+ 文件磁盘位置。绝大多数文件操作都要求系统修改文件数据。该信息保存在内存中,以免为每个操作都从磁盘中读取。
|
||||
+ 访问权限。每个进程打开文件都需要有一个访问模式(创建、只读、读写、添加等)。该信息保存在进程的打开文件表中,以便操作系统能够允许或拒绝之后的$I/O$请求。
|
||||
|
||||
打开文件:
|
||||
|
||||
+ 在很多操作系统中,在对文件进行操作之前,要求用户先使用$open$系统调用“打开文件”,需要提供的几个主要参数:
|
||||
1. 文件存放路径。
|
||||
2. 文件名。
|
||||
3. 要对文件的操作类型(如:$r$只读;$rw$读写等)。
|
||||
+ 操作系统在处理$open$系统调用时,主要做了几件事:
|
||||
1. 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的的目录项,并检查该用户是否有指定的操作权限。
|
||||
2. 将目录项复制到内存中的“打开文件表”中。并将对应表目的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件。
|
||||
+ 打开文件表分为两种:
|
||||
1. 系统打开文件表,只有一张,包括编号、文件名、外存地址、打开计数器(多少个进程打开了次文件)等。
|
||||
2. 每一个进程的打开文件表,包括编号、文件名、读写指针、访问权限、系统表索引号等。
|
||||
+ 打开文件时并不会把文件数据直接读入内存,而是提供索引号。“索引号”也称“文件描述符”。
|
||||
|
||||
关闭文件:
|
||||
|
||||
+ 用户使用$close$系统调用“打开文件”,需要提供的几个主要参数:
|
||||
1. 文件存放路径。
|
||||
2. 文件名。
|
||||
+ 操作系统在处理$close$系统调用时,主要做了几件事:
|
||||
1. 将进程的打开文件表相应表项删除。
|
||||
2. 回收分配给该文件的内存空间等资源。
|
||||
3. 系统打开文件表的打开计数器$count$减$1$,若$count=0$,则删除对应表项。
|
||||
|
||||
### 文件逻辑结构
|
||||
|
||||
分为无结构文件与有结构文件。
|
||||
|
||||
+ 无结构文件(如文本文件):
|
||||
+ 由一些二进制或字符流组成,又称“流式文件”。
|
||||
+ 以$Byte$为单位。
|
||||
+ 只能通过穷举进行搜索。
|
||||
+ 管理简单,适用于字符流的无结构方式,如源程序文件、目标代码文件等。
|
||||
+ 有结构文件(如数据库表):由一组相似的记录(每条记录又若干个数据项组成,数据项又包含多个属性,是文件系统中最基本的数据单位)组成,又称“记录式文件”。每条记录有一个数据项可作为关键字(如$ID$)。
|
||||
|
||||
有结构文件可以根据各条记录的长度(占用的存储空间)是否相等,可分为定长记录和可变长记录两种。
|
||||
|
||||
有结构文件的逻辑结构:
|
||||
@@ -54,7 +106,7 @@
|
||||
+ 顺序存储:
|
||||
+ 可变长记录:无法实现随机存取。每次只能从第一个记录开始依次往后查找。因为需要显式地给出记录长度。
|
||||
+ 定长记录:
|
||||
+ 可实现随机存取。记录长度为L,则第i个记录存放的相对位置是i×L。
|
||||
+ 可实现随机存取。记录长度为$L$,则第$i$个记录存放的相对位置是$i\times L$。
|
||||
+ 若采用串结构,只能从头开始查找,无法快速找到某关键字对应的记录。
|
||||
+ 若采用顺序结构,可以快速找到某关键字对应的记录(如折半查找)。
|
||||
|
||||
@@ -79,23 +131,29 @@
|
||||
+ 索引表其实是索引串结构的。
|
||||
+ 为了进一步提高索引效率,可以建立多级索引表。
|
||||
|
||||
#### 散列文件
|
||||
|
||||
也称为直接文件。给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。这种映射结构不同于顺序文件或索引文件,没有顺序的特性。
|
||||
|
||||
散列文件有很高的存取速度,但是会引起冲突,即不同关键字的散列函数值相同。
|
||||
|
||||
### 文件目录
|
||||
|
||||
#### 文件控制块
|
||||
|
||||
+ 目录本身就是一种有结构文件,由一条条记录组成。每条记录对应一个在该放在该目录下的文件。
|
||||
+ 目录文件中的一条记录就是一个**文件控制块**(PCB)。FCB的有序集合就是文件目录,一个FCB就是一个文件目录项。
|
||||
+ FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)。最重要最基本的就是文件名和文件存放物理地址。
|
||||
+ FCB实现了文件名与文件之间的映射,使得用户(用户程序)可以实现按名存取。
|
||||
+ 目录文件中的一条记录就是一个**文件控制块**($PCB$)。$FCB$的有序集合就是文件目录,一个$FCB$就是一个文件目录项。
|
||||
+ $FCB$中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)。最重要最基本的就是文件名和文件存放物理地址。
|
||||
+ $FCB$实现了文件名与文件之间的映射,使得用户(用户程序)可以实现按名存取。
|
||||
|
||||
#### 索引结点
|
||||
|
||||
+ 其实在查找各级目录的过程中只需要用到“文件名”这个信息,只有文件名匹配时,才需要读出文件的其他信息。因此可以考虑让目录表“瘦身”来提升效率。
|
||||
+ 所以目录只包含文件名与索引结点指针,除了文件名之外的文件描述信息都存放在索引结点之中。索引结点是对FCB的改进。
|
||||
+ 所以目录只包含文件名与索引结点指针,除了文件名之外的文件描述信息都存放在索引结点之中。索引结点是对$FCB$的改进。
|
||||
+ 当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据“存放位置”即可找到文件。
|
||||
+ 存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等。
|
||||
+ 假设一个FCB是64B,磁盘块的大小为1KB,则每个盘块中只能存放16个FCB。若一个文件目录中共有640个目录项,则共需要占用640/16=40个盘块。因此按照某文件名检索该目录,使用折半查找平均需要查询320个目录项,平均需要启动磁盘20次(每次磁盘I/O读入一块)。
|
||||
+ 若使用索引结点机制,文件名占14B,索引结点指针站2B,则每个盘块可存放64个目录项,那么按文件名检索目录平均只需要读入320/64=5个磁盘块。显然,这将大大提升文件检索速度。
|
||||
+ 假设一个$FCB$是$64B$,磁盘块的大小为$1KB$,则每个盘块中只能存放$16$个$FCB$。若一个文件目录中共有$640$个目录项,则共需要占用$640\div16=40$个盘块。因此按照某文件名检索该目录,使用折半查找平均需要查询$320$个目录项,平均需要启动磁盘$20$次(每次磁盘$I/O$读入一块)。
|
||||
+ 若使用索引结点机制,文件名占$14B$,索引结点指针站$2B$,则每个盘块可存放$64$个目录项,那么按文件名检索目录平均只需要读入$320\div64=5$个磁盘块。显然,这将大大提升文件检索速度。
|
||||
+ 存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等。
|
||||
|
||||
#### 目录结构
|
||||
|
||||
@@ -103,23 +161,81 @@
|
||||
+ 实现了“按名存取”,但是不允许文件重名。
|
||||
+ 在创建一个文件时,需要先检查目录表中有没有重名文件,确定不重名后才能允许建立文件,并将新文件对应的目录项插入目录表中。
|
||||
+ 不适用于多用户操作系统。
|
||||
+ 两级目录结构:分为主文件目录(MFD,Master File Directory)和用户文件目录(UFD,User Flie Directory) 。
|
||||
+ 两级目录结构:分为主文件目录($MFD$,$Master\,File\,Directory$)和用户文件目录($UFD$,$User\,Flie\,Directory$) 。
|
||||
+ 主文件目录记录用户名及相应用户文件目录的存放位置。
|
||||
+ 用户文件目录由该用户的文件FCB组成。
|
||||
+ 用户文件目录由该用户的文件$FCB$组成。
|
||||
+ 允许不同用户的文件重名。文件名虽然相司,但是对应的其实是不同的文件。
|
||||
+ 两级目录结构允许不同用户的文件重名,也可以在目录上实现实现访问限制(检查此时登录的用户名是否匹配)。
|
||||
+ 两级目录结构依然缺乏灵活性,用户不能对自己的文件进行分类。
|
||||
+ 两级目录结构依然缺乏灵活性,用户不能对自己的文件进行分类。
|
||||
+ 多级目录结构(树形目录结构):
|
||||
+ 不同目录下的文件可以重名。
|
||||
+ 用户(或用户进程)要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。各级目录之间用“/”隔开。从根目录出发的路径称为绝对路径。
|
||||
+ 用户(或用户进程)要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。各级目录之间用“/”隔开。
|
||||
+ 从根目录出发的路径称为绝对路径。
|
||||
+ 很多时候,用户会连续访问同一目录内的多个文件,显然,每次都从根目录开始查找,是很低效的。因此可以设置一个“当前目录”出发的相对路径。
|
||||
+ 树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,树形结构不便于实现文件的按享。为此,提出了“无环图目录结构”。
|
||||
+ 树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,树形结构不便于实现文件的共享,且查找文件需要逐级访问影响速度。为此,提出了“无环图目录结构”。
|
||||
+ 无环图目录结构:
|
||||
+ 在树形目录结构的基础上,增加一些指向同一节点的有向边,使整个目录成为一个有向无环图。可以更方便地实现多个用户间的文件共享。
|
||||
+ 可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)。
|
||||
+ 需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。
|
||||
+ 需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的$FCB$、并使共享计数器减$1$,并不会直接删除共享结点。
|
||||
+ 共享文件不同于复制文件。在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化。
|
||||
+ 实现了文件共享,但是使得文件管理更复杂。
|
||||
|
||||
### 文件共享
|
||||
|
||||
多个用户共享同一个文件,意味着系统中只有“一份”文件数据。并且只要某个用户修改了该文件的数据,其他用户也可以看到文件数据的变化。
|
||||
|
||||
文件共享方式分为:
|
||||
|
||||
+ 基于索引结点的共享方式:硬链接。
|
||||
+ 基于符号链的共享方式:软链接。
|
||||
|
||||
#### 硬链接
|
||||
|
||||
+ 在文件目录中提到,索引结点,是一种文件目录瘦身策略。由于检索文件时只需用到文件名,因此可以将除了文件名之外的其他信息放到索引结点中。这样目录项就只需要包含文件名、索引结点指针。
|
||||
+ 索引结点中设置一个链接计数变量count,用于表示链接到本索引结点上的用户目录项数。
|
||||
+ 不同目录下对于同一个文件的索引结点的命名可以是不同的。
|
||||
+ 若某个用户决定“删除”该文件,则只是要把用户目录中与该文件对应的目录项删除,且索引结点的count值减1。
|
||||
+ 若count>0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。
|
||||
+ 若count=0,则系统需要删除文件。
|
||||
|
||||
#### 软链接
|
||||
|
||||
+ 软链接就是共享时建立一个Link类型的文件,记录了要共享的文件的存放路径或任意一条硬链接路径,类似Windows系统的快捷方式。
|
||||
+ 当访问共享文件时,回首先判断这个文件属于Link类型文件,然后根据其中记录的路径层层查找路径找到索引结点。
|
||||
+ 若共享文件被删除了,则软链接失效。
|
||||
+ 因为软链接访问共享文件时需要查询多层目录,所以有多层$I/O$操作,从而软链接访问速度慢于硬链接。
|
||||
|
||||
### 文件保护
|
||||
|
||||
#### 口令保护
|
||||
|
||||
+ 为文件设置一个“口令”,用户请求访问该文件时必须提供“口令”。
|
||||
+ 口令一般存放在文件对应的$FCB$或索引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与$FCB$中存储的口令进行对比,如果正确,则允许该用户访问文件。
|
||||
+ 优点:保存口令的空间开销不多,验证口令的时间开销也很小。
|
||||
+ 缺点:正确的“口令”存放在系统内部,不够安全。
|
||||
|
||||
#### 加密保护
|
||||
|
||||
+ 使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。
|
||||
+ 系统并不保存原始数据,而是加密过的数据。
|
||||
+ 加密方式有异或加密等。
|
||||
+ 优点:保密性强,不需要在系统中存储“密码”。
|
||||
+ 缺点:编码/译码,或者说加密/解密要花费一定时间。
|
||||
|
||||
#### 访问控制
|
||||
|
||||
+ 在每个文件的$FCB$(或索引结点)中增加一个访问控制列表(AccessControl List,ACL),该表中记录了各个用户可以对该文件执行哪些操作。
|
||||
+ 访问类型包括:
|
||||
+ 读:从文件中读数据。
|
||||
+ 写:向文件中写数据。
|
||||
+ 执行:将文件装入内存并执行。
|
||||
+ 添加:将新信息添加到文件结尾部。
|
||||
+ 删除:删除文件,释放空间。
|
||||
+ 列表清单:列出文件名和文件属性。
|
||||
+ 有的计算机可能会有很多个用户,因此访问控制列表可能会很大,可以用精简的访问列表解决这个问题。
|
||||
+ 精简的访问列表:以“组”为单位,标记各“组”用户可以对文件执行哪些操作。当某用户想要访问文件时,系统会检查该用户所属的分组是否有相应的访问权限。所以系统也需要管理分组的信息。
|
||||
+ 若想要让某个用户能够获取某种权限,需要把该用户放入有该权限的分组即可。
|
||||
+ 如果对某个目录进行了访问权限的控制,那也要对目录下的所有文件进行相同的访问权限控制。
|
||||
|
||||
### 文件物理结构
|
||||
|
||||
@@ -128,7 +244,7 @@
|
||||
#### 文件块与磁盘块
|
||||
|
||||
+ 类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同。
|
||||
+ 内存与磁盘之间的数据交换(即读/写操作、磁盘I/O))都是以“块”为单位进行的。即每次读入一块,或每次写出一块。
|
||||
+ 内存与磁盘之间的数据交换(即读/写操作、磁盘$I/O$))都是以“块”为单位进行的。即每次读入一块,或每次写出一块。
|
||||
+ 在内存管理中,进程的逻辑地址空间被分为一个一个页面。同样的,在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为了一个一个的文件“块”。于是文件的逻辑地址也可以表示为(逻辑块号,块内地址)的形式。
|
||||
+ 用户通过逻辑地址来操作自己的文件,
|
||||
操作系统要负责实现从逻辑地址到物理地址的映射,即文件的物理结构或文件分配方式。
|
||||
@@ -138,7 +254,7 @@
|
||||
+ 每个文件在磁盘上占有一组连续的块。
|
||||
+ (逻辑块号,块内地址)→(物理块号,块内地址)。只需转换块号就行,块内地址保持不变。
|
||||
+ 文件目录中记录存放的起始块号和长度(总共占用几个块)。
|
||||
+ 用户给出要访问的逻辑块号,操作系统找到该文件对应的目录项(FCB),物理块号=起始块号+逻辑块号。
|
||||
+ 用户给出要访问的逻辑块号,操作系统找到该文件对应的目录项($FCB$),物理块号=起始块号+逻辑块号。
|
||||
+ 优点:
|
||||
+ 可以直接算出逻辑块号对应的物理块号,因此连续分配支持顺序访问和直接访问(即随机访问)。
|
||||
+ 连续分配的文件在顺序读写时速度最快。
|
||||
@@ -151,7 +267,7 @@
|
||||
+ 采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接两种。
|
||||
+ 隐式链接:
|
||||
+ 类似链表。
|
||||
+ FCB目录中记录了文件存放的起始块号和结束块号,当然也可以增加一个字段来表示文件的长度。
|
||||
+ $FCB$目录中记录了文件存放的起始块号和结束块号,当然也可以增加一个字段来表示文件的长度。
|
||||
+ 除了文件的最后个磁盘块之外,每个磁盘块中都会保存指向下一个盘块的指针,这些指针对用户是透明的。
|
||||
+ 优点:
|
||||
+ 方便文件拓展。
|
||||
@@ -162,7 +278,7 @@
|
||||
+ 显式链接:
|
||||
+ 类似静态链表。
|
||||
+ 把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表(FAT,File Allocation Table)。FAT包含物理块号和下一块指针两项。
|
||||
+ FCB目录中只需记录文件的起始块号。
|
||||
+ $FCB$目录中只需记录文件的起始块号。
|
||||
+ 一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。所以地址转换不需要读取内存,从而效率更高。
|
||||
+ FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。
|
||||
+ 地址转换:目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT,往后找到i号逻辑块对应的物理块号。逻辑块号转换成物理块号的过程不需要读磁盘操作。
|
||||
@@ -185,11 +301,11 @@
|
||||
+ 文件大小过大的解决方案:
|
||||
+ 链接方案:
|
||||
+ 分配多个索引块并链接起来。
|
||||
+ 文件FCB中只需要记录第一个索引块的块号。
|
||||
+ 文件$FCB$中只需要记录第一个索引块的块号。
|
||||
+ 缺点:查找效率低。
|
||||
+ 多层索引:
|
||||
+ 建立类似多级页表的多层索引,使上层索引块指向下一层的索引块。
|
||||
+ FCB中只需要记录顶层索引块就可以了。
|
||||
+ $FCB$中只需要记录顶层索引块就可以了。
|
||||
+ 若采用多层索引,则各层索引表大小不能超过一个磁盘块。理由同多级页表。
|
||||
+ 采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要K+1次读磁盘操作。
|
||||
+ 缺点:即使是小文件页需要K+1次读磁盘操作。
|
||||
@@ -211,7 +327,7 @@
|
||||
|
||||
+ 将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)。
|
||||
+ 将各个文件卷初始化为:
|
||||
+ 目录区:主要存放文件目录信息FCB、用于磁盘存储空间管理的信息。
|
||||
+ 目录区:主要存放文件目录信息$FCB$、用于磁盘存储空间管理的信息。
|
||||
+ 文件区:用于存放普通文件数据。
|
||||
+ 有的系统支持超大型文件,支持由多格物理磁盘组成一个文件卷。
|
||||
|
||||
@@ -271,126 +387,6 @@
|
||||
1. 如果块内回收后余留,则修改数据。
|
||||
2. 若回收数量大于等于余下,需要将超级块中的数据复制到新回收的块中,并修改超级块的内容,让新回收的块成为第一个分组。
|
||||
|
||||
### 文件基本操作
|
||||
|
||||
#### 创建文件
|
||||
|
||||
+ 进行Create系统调用时,需要提供的几个主要参数:
|
||||
1. 所需的外存空间大小。
|
||||
2. 文件存放路径。
|
||||
3. 文件名。
|
||||
+ 操作系统在处理Create系统调用时,主要做了两件事:
|
||||
1. 在外存中找到文件所需的空间(空闲链表法、位示图、成组链接法等管理策略,找到空闲空间)。
|
||||
2. 根据文件存放路径的信息找到该目录对应的目录文件,在目录中创建该文件对应的目录项。目录项中包含了文件名、文件在外存中的存放位置等信息。
|
||||
|
||||
#### 删除文件
|
||||
|
||||
+ 进行Delete系统调用时,需要提供的几个主要参数:
|
||||
1. 文件存放路径。
|
||||
2. 文件名。
|
||||
+ 操作系统在处理Delete系统调用时,主要做了几件事:
|
||||
1. 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项。
|
||||
2. 根据该目录项记录的文件在外存的存放位置、文件大小等信息,回收文件占用的磁盘块。(回收磁盘块时,根据空闲表法、空闲链表法、位图法等管理策略的不同,需要做不同的处理)。
|
||||
3. 从目录表中删除文件对应的目录项。
|
||||
|
||||
#### 打开文件
|
||||
|
||||
+ 在很多操作系统中,在对文件进行操作之前,要求用户先使用Open系统调用“打开文件”,需要提供的几个主要参数:
|
||||
1. 文件存放路径。
|
||||
2. 文件名。
|
||||
3. 要对文件的操作类型(如:r只读;
|
||||
rw读写等)。
|
||||
+ 操作系统在处理open系统调用时,主要做了几件事:
|
||||
1. 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的的目录项,并检查该用户是否有指定的操作权限。
|
||||
2. 将目录项复制到内存中的“打开文件表”中。并将对应表目的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件。
|
||||
+ 打开文件表分为两种:
|
||||
1. 系统打开文件表,只有一张,包括编号、文件名、外存地址、打开计数器(多少个进程打开了次文件)等。
|
||||
2. 每一个进程的打开文件表,包括编号、文件名、读写指针、访问权限、系统表索引号等。
|
||||
+ 打开文件时并不会把文件数据直接读入内存,而是提供索引号。“索引号”也称“文件描述符”。
|
||||
|
||||
#### 关闭文件
|
||||
|
||||
+ 用户使用Close系统调用“打开文件”,需要提供的几个主要参数:
|
||||
1. 文件存放路径。
|
||||
2. 文件名。
|
||||
+ 操作系统在处理Close系统调用时,主要做了几件事:
|
||||
1. 将进程的打开文件表相应表项删除。
|
||||
2. 回收分配给该文件的内存空间等资源。
|
||||
3. 系统打开文件表的打开计数器count减1,若count=0,则删除对应表项。
|
||||
|
||||
#### 读文件
|
||||
|
||||
+ 打开文件后可以“读文件”,将文件数据读入内存,才能让CPU处理。
|
||||
+ 进程使用Read系统调用完成写操作,需要提供几个主要参数:
|
||||
1. 在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号(文件描述符)即可。
|
||||
2. 文件存放路径。
|
||||
3. 读入数据的数量(如:读入1KB)。
|
||||
+ 操作系统在处理read系统调用时,会从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中。
|
||||
|
||||
#### 写文件
|
||||
|
||||
+ 进程使用Read系统调用完成写操作,需要提供几个主要参数:
|
||||
1. 在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号(文件描述符)即可。
|
||||
2. 文件存放路径。
|
||||
3. 写回数据的数量。
|
||||
|
||||
### 文件共享
|
||||
|
||||
多个用户共享同一个文件,意味着系统中只有“一份”文件数据。并且只要某个用户修改了该文件的数据,其他用户也可以看到文件数据的变化。
|
||||
|
||||
文件共享方式分为:
|
||||
|
||||
+ 基于索引结点的共享方式:硬链接。
|
||||
+ 基于符号链的共享方式:软链接。
|
||||
|
||||
#### 硬链接
|
||||
|
||||
+ 在文件目录中提到,索引结点,是一种文件目录瘦身策略。由于检索文件时只需用到文件名,因此可以将除了文件名之外的其他信息放到索引结点中。这样目录项就只需要包含文件名、索引结点指针。
|
||||
+ 索引结点中设置一个链接计数变量count,用于表示链接到本索引结点上的用户目录项数。
|
||||
+ 不同目录下对于同一个文件的索引结点的命名可以是不同的。
|
||||
+ 若某个用户决定“删除”该文件,则只是要把用户目录中与该文件对应的目录项删除,且索引结点的count值减1。
|
||||
+ 若count>0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。
|
||||
+ 若count=0,则系统需要删除文件。
|
||||
|
||||
#### 软链接
|
||||
|
||||
+ 软链接就是共享时建立一个Link类型的文件,记录了要共享的文件的存放路径或任意一条硬链接路径,类似Windows系统的快捷方式。
|
||||
+ 当访问共享文件时,回首先判断这个文件属于Link类型文件,然后根据其中记录的路径层层查找路径找到索引结点。
|
||||
+ 若共享文件被删除了,则软链接失效。
|
||||
+ 因为软链接访问共享文件时需要查询多层目录,所以有多层I/O操作,从而软链接访问速度慢于硬链接。
|
||||
|
||||
### 文件保护
|
||||
|
||||
#### 口令保护
|
||||
|
||||
+ 为文件设置一个“口令”,用户请求访问该文件时必须提供“口令”。
|
||||
+ 口令一般存放在文件对应的FCB或索引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB中存储的口令进行对比,如果正确,则允许该用户访问文件。
|
||||
+ 优点:保存口令的空间开销不多,验证口令的时间开销也很小。
|
||||
+ 缺点:正确的“口令”存放在系统内部,不够安全。
|
||||
|
||||
#### 加密保护
|
||||
|
||||
+ 使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。
|
||||
+ 系统并不保存原始数据,而是加密过的数据。
|
||||
+ 加密方式有异或加密等。
|
||||
+ 优点:保密性强,不需要在系统中存储“密码”。
|
||||
+ 缺点:编码/译码,或者说加密/解密要花费一定时间。
|
||||
|
||||
#### 访问控制
|
||||
|
||||
+ 在每个文件的FCB(或索引结点)中增加一个访问控制列表(AccessControl List,ACL),该表中记录了各个用户可以对该文件执行哪些操作。
|
||||
+ 访问类型包括:
|
||||
+ 读:从文件中读数据。
|
||||
+ 写:向文件中写数据。
|
||||
+ 执行:将文件装入内存并执行。
|
||||
+ 添加:将新信息添加到文件结尾部。
|
||||
+ 删除:删除文件,释放空间。
|
||||
+ 列表清单:列出文件名和文件属性。
|
||||
+ 有的计算机可能会有很多个用户,因此访问控制列表可能会很大,可以用精简的访问列表解决这个问题。
|
||||
+ 精简的访问列表:以“组”为单位,标记各“组”用户可以对文件执行哪些操作。当某用户想要访问文件时,系统会检查该用户所属的分组是否有相应的访问权限。所以系统也需要管理分组的信息。
|
||||
+ 若想要让某个用户能够获取某种权限,需要把该用户放入有该权限的分组即可。
|
||||
+ 如果对某个目录进行了访问权限的控制,那也要对目录下的所有文件进行相同的访问权限控制。
|
||||
|
||||
### 文件系统层次结构
|
||||
|
||||
1. 设备。
|
||||
@@ -400,7 +396,7 @@ rw读写等)。
|
||||
3. 物理文件系统:这一层需要把上一层提供的文件逻辑地址转换为实际的物理地址。
|
||||
4. 逻辑文件系统与文件信息缓冲区:用户指明想要访问文件记录号,这一层需要将记录号转换为对应的逻辑地址。文件信息缓冲区用来在调入索引表到内存时暂存索引表的内容。
|
||||
5. 存取控制模块:为了保证文件数据的安全,还需要验证用户是否有访问权限。这一层主要完成了文件保护相关功能。
|
||||
6. 文件目录系统:用户是通过文件路径来访问文件的,因此这一层需要根据用户给出的文件路径找到相应的FCB或索引结点。所有和目录、目录项相关的管理工作都在本层完成,如管理活跃的文件目录
|
||||
6. 文件目录系统:用户是通过文件路径来访问文件的,因此这一层需要根据用户给出的文件路径找到相应的$FCB$或索引结点。所有和目录、目录项相关的管理工作都在本层完成,如管理活跃的文件目录
|
||||
表、管理打开文件表等。
|
||||
7. 用户接口:文件系统需要向上层的用户提供一些简单易用的功能接口。这层就是用于处理用户发出的系统调用请求(Read、Write、Open、Close等系统调用)。
|
||||
8. 用户/应用程序。
|
||||
@@ -520,14 +516,14 @@ rw读写等)。
|
||||
|
||||
#### N步扫描算法
|
||||
|
||||
+ 即NStepSCAN算法,在SSTF,SCAN及CSCAN几种调度算法中,都可能会出现磁臂停留在某处不动的情况,例如,有一个或几个进程对某一磁道有较高的访问频率,即这个(些)进程反复请求对某一磁道的I/O操作,从而垄断了整个磁盘设备。我们把这一现象称为“磁臂粘着”(Armstickiness)。
|
||||
+ 在高密度磁盘上容易出现此情况。N步SCAN算法是将磁盘请求队列分成若干个长度为N的子队列,磁盘调度将按FCFS算法依次处理这些子序列。而每处理一个队列时又是按SCAN算法,对一个队列处理完毕后,再处理其他队列。当正在处理某子序列时,如果又出现新的磁盘I/O请求,便将新请求进程放入其他队列,这样就可避免出现粘着现象。
|
||||
+ 即NStepSCAN算法,在SSTF,SCAN及CSCAN几种调度算法中,都可能会出现磁臂停留在某处不动的情况,例如,有一个或几个进程对某一磁道有较高的访问频率,即这个(些)进程反复请求对某一磁道的$I/O$操作,从而垄断了整个磁盘设备。我们把这一现象称为“磁臂粘着”(Armstickiness)。
|
||||
+ 在高密度磁盘上容易出现此情况。N步SCAN算法是将磁盘请求队列分成若干个长度为N的子队列,磁盘调度将按FCFS算法依次处理这些子序列。而每处理一个队列时又是按SCAN算法,对一个队列处理完毕后,再处理其他队列。当正在处理某子序列时,如果又出现新的磁盘$I/O$请求,便将新请求进程放入其他队列,这样就可避免出现粘着现象。
|
||||
+ 当N值取得很大时,会使N步扫描法的性能接近于SCAN算法的性能;当N=1时,N步SCAN算法便蜕化为FCFS算法。
|
||||
|
||||
#### 分步扫描算法
|
||||
|
||||
+ 即FSCAN算法,实质上是N步SCAN算法的简化,即FSCAN只将磁盘请求队列分成两个子队列。
|
||||
+ 一个是当前所有请求磁盘I/O的进程形成的队列,由磁盘调度按SCAN算法进行处理。在扫描期间,将新出现的所有请求磁盘I/O的进程,放入另一个等待处理的请求队列。这样,所有的新请求都将被推迟到下一次扫描时处理。
|
||||
+ 一个是当前所有请求磁盘$I/O$的进程形成的队列,由磁盘调度按SCAN算法进行处理。在扫描期间,将新出现的所有请求磁盘$I/O$的进程,放入另一个等待处理的请求队列。这样,所有的新请求都将被推迟到下一次扫描时处理。
|
||||
|
||||
### 延迟时间处理
|
||||
|
||||
|
||||
Reference in New Issue
Block a user