现在的位置: 首页 > 综合 > 正文

操作系统总结之文件系统接口

2013年05月16日 ⁄ 综合 ⁄ 共 2409字 ⁄ 字号 评论关闭

文件在用户看来是再熟悉不过的名字了。因为能够创建文件,把一些数据放在文件中。
文件系统包含了文件和目录。
目录用以组织文件,包含了文件的简要信息。放在外存。
在计算机中有许多不同的介质,而计算机把这些抽象成一个统一的逻辑单元,再映射到物理设备。
文件有很多不同的类型,比如:
1.文本文件:由行组成的文件。
2.二进制文件。
3.源文件。由子程序和函数构成。

一个文件有自己的属性:
1.文件名,identifier,类型,位置,大小,保护,时间。即最近访问时间,最近修改时间,文件创建时间。
这些文件属性都放在目录中。

文件有许多操作,比如创建,删除,重定位,读,写。
创建文件需要找到一个空的空间,在目录中创建一个条目,指向文件。
读:系统调用,控制读指针。
写:系统调用,控制写指针。
重定位:首先声明一点,读和写的指针是共用的,因此只需要把这个指针移动即可。
删除:释放文件空间并在目录中删除条目。

每次执行一个操作都要遍历目录,找到文件,但是这样速度很慢,因为目录在外存。
我们要对一个文件进行操作必须要显式地打开文件。
在操作系统中维护了一个open-file table,记录了打开的文件,以后每次操作,只需要索引这个表即可。
但是对于多进程,可能同时打开一个文件,因此操作系统维护了两级的表:一个进程单独一个表,操作系统维护一个系统表。
单个进程的表条目指向系统表。
对于多进程访问一个文件时,需要在文件表中置一个计数器,等到计数器为0时再删除条目。
当然对于多进程同时访问,可以用锁来解决同步问题。
专用锁:类似写者锁。一个进程访问一个文件,其他进程就不能访问。
共享锁:类似于读者锁。多进程可同时访问。

文件类型:
操作系统预先必须要声明支持哪些文件类型。
Windows通过加扩展名来声明类型。
Unix通过幻数在文件头部加声明类型。
每个文件类型都有自己特有的结构,因此如果操作系统支持文件类型过多,就会出现操作系统过于庞大。
磁盘的最小单元是块,因此一个块中可以放多个逻辑记录。一个文件由多个块组成。但是一个块可能会没放满,所以会出现内部碎片。

访问文件信息的第一步必须将他所在的块读入内存。
接下来就是不同的访问方法。
1.顺序访问
一条一条访问。
2.直接访问
因为文件的一条记录是固定长度的,因此可以利用公式快速计算出所要找的那个记录的位置。
相对块号:相对于文件的块号。即文件的第一个块为0.

对于目录,我们也要利用数据结构,这样就可以快速索引。
一个磁盘可能有多个文件系统。一个卷有相关信息。记录大小,名称等。

对于目录,我们如果要找到文件,必须要通过目录,如果create一个文件,就必须在目录中添加一个条目。
为了更好更快地访问文件,我们对于目录进行一些构造。
1.单层目录。
只能一个用户,并且每个目录的名字必须唯一。
2.双层目录。
第一层是MFD。一个record是一个用户。
一个用户对应一个单层目录。UFD。
缺点:不能多用户共享或多目录共享文件。

对于系统文件,我们需要定义一个特殊的用户目录。他包括所有系统文件,这个目录在其他目录都找不到的情况下会自动遍历。
3.树状目录。
禁止共享文件或目录。
就是树状的目录结构,内部有子目录和文件。通过一位来表示是目录还是文件。
对于删除目录,有两种解决方法:
1.如果这个目录有子目录或文件,则不能删。
2.Unix。删除目录的子目录和文件。

 

4.无环图目录。
允许共享。
实现共享的方法:
1.链接。一个指针指向一个文件。
2.复制目录条目。像其他目录条目一样。但是要维护一致性。
对于删除,也会出现问题。解决方案:
1.删除链接时,则不变,删除文件条目,则链接无效。
2.删除全部引用才删除。为每个文件建立一个引用计数器或文件引用表,当引用为空,则删除文件。

MS-DOS采用树状目录结构。

 

5.通用图目录。
可以存在环,会无限遍历。

解决方法:通过记录目录被访问次数来强制终止。

删除文件时,由于存在环而等不到引用计数为0,因此通过垃圾收集解决引用技术问题。

总结:为了避免过大开销,避免链接。

文件系统在使用前必须要mount,安装时要指明安装位置即安装点。然后操作系统要验证文件系统安装的有效性。再是如果mount在一个目录下,原来在这个目录下的子目录的文件就不能使用了。必须要将unmount新的文件系统才行。在pintos中,我一开始把虚拟机和windows的共享数据空间在Desktop,发现原来的Desktop的东西打不开了。。。慌了我半天。。

文件共享的三种实现方式:

1.人工传输。

2.远程登录。

3.浏览器。

对于文件共享,每个文件系统都有不同的语义,现在不只是多用户本地共享,也会有远程文件系统的共享。
对于多用户的文件共享问题,我们需要明确每个用户的文件访问权限。
拥有者需要有最高的权限。
组需要有权限的子集。
拥有者ID和组ID 保存在文件属性中。每次对文件进行操作都要比对。
1.在unix中,对于一个用户进行写操作,其他用户都会看到。
2.AFS中,对于一个用户写操作,以打开的用户不能看到其变化,只有等到写操作的用户关闭后再打开的用户才能看到变化。
3.一个文件只要被共享,就不能被修改。

计算机可能会遇到两个不安全问题:

1.物理损坏问题。通过备份解决。

2.访问。 通过访问控制解决。

对于一个文件,只要允许访问,就必定存在保护的问题,我们需要通过控制访问即控制用户的操作权限。

基本的操作在前面也讲过,比如读,写,执行,删除,添加,列出列表。对于高层的操作,比如复制,就可以用读来写出。让我想到了数据库。关系代数表达式的基本操作~选择,投影,并,笛卡儿积,差,重命名。其他高层的一些操作比如交,除,都可以用基本操作替代。

对于访问控制的最容易想到的解决方法是给每个文件加上一张表,称为访问控制表ACL。列出能够访问的用户名。但是这个方法的直观缺点就是长度问题。

解决方案就是精简访问列表:

1.拥有者:最高等级。

2.组:需要某种类似访问组成的组。

3.其他。

 

抱歉!评论已关闭.