您的位置:首页 > 其它

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

2014-05-17 10:11 190 查看
文件在用户看来是再熟悉不过的名字了。因为能够创建文件,把一些数据放在文件中。

文件系统包含了文件和目录。

目录用以组织文件,包含了文件的简要信息。放在外存。

在计算机中有许多不同的介质,而计算机把这些抽象成一个统一的逻辑单元,再映射到物理设备。

文件有很多不同的类型,比如:

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.其他。

注:本人正在学操作系统,发现此篇博客是原创者对《操作系统概念》书中的一些总结,结合书本看效率更高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息