第十二章 文件管理及Linux实现问与答

第十二章 文件管理及Linux实现问与答

12.1 什么是文件?它包含哪些内容?有什么特点?

答:文件是信息的一种组织形式,是存储在外存上的具有标识名的一组相关信息集合。文件包含的内容有:源程序、二进制代码、文本文档、数据、表格、声音和图象等。

文件具有的特点如下:

① 文件具有保存性,它被存储在某种存储介质上,长期保存和多次使用。

② 文件是按名存取的,每个文件具有唯一的标识名,通过标识名来存取文件中的信息,而不需要了解文件在存储介质上的具体物理位置。

③ 文件的内容是一组信息的集合,信息可以是源代码程序、二进制代码、文件文档、数据表格、声音和图象等。

 

12.2文件系统要解决哪些问题?虚拟文件系统要解决哪些问题?

答:文件系统的主要目标是提高存储空间的利用率,它要解决的主要问题有:完成文件存储空间的管理,实现文件名到物理地址的转换,实现文件和目录的操作,提供文件共享能力和安全措施,提供友好的用户接口。文件系统向用户提供了有关文件和目录操作的各种功能接口和系统调用,如命令接口、程序接口和交互接口等。

虚拟文件系统的主要功能是可以使多种本地的或者远程的文件系统共存于同一台机器上。它的主要设计目标是内核里提供一个对文件进行访问和操纵的框架,以及在内核与实现专门文件系统的模块之间提供一个严格定义的接口。虚拟文件系统有几个重要的设计目标:

① 该系统应该同时支持几种文件系统类型。其中包括UNIX文件系统和非UNIX文件系统。

② 不同的磁盘分区可以包含不同类型的文件系统。然而,一旦安装在其他文件系统上,它们应该和传统的单一文件系统没有区别。用户对整个文件系统的视图应该一致,而意识不到子树在磁盘结构上的差别。

③ 应该对通过网络共享文件提供完全的支持。访问远程节点上文件系统应该和访问本地节点的文件系统完全一样。

④ 厂家应该可以开发他们自己需要的文件系统并且以模块方式加入到内核中去。 

 

12.3为什么每个进程都有一个缺省的文件创建掩码?这个掩码存放在什么地方?

答:内核为每个进程设置的一个缺省的文件创建掩码,是一个权限位掩码,用于为进程新创建的文件设置初始文件许可权。

这个掩码存放在struct fs_struct结构类型中,该结构的地址包含在进程控制块PCB的fs成员中。该结构定义如下:

struct fs_struct{

         atomic_t count;

         int umask;

         struct dentry *root,*pwd;

}

其中,umask域由umask()系统调用使用,用于新创建的文件设置初始文件许可权。

 

12.4劝告性加锁和强制性加锁的区别是什么?Linux内核是否支持文件加锁?它有几种类型的文件锁?

答:文件加锁既可以是劝告性的也可以是强制性的。如果选择了劝告性加锁,内核只有在协作进程显式地检查文件锁时此文件锁才能保护文件。而强制加锁,内核会为文件强制加锁,任何跟锁冲突的操作都会被拒绝掉。

    Linux内核支持文件加锁。它有两种类型的文件锁:劝告性加锁和强制性加锁,fcntl()、flock()和lockf()系统调用。不过lockf()系统调用只是一个库的封装函数。

 

12.8 EXT2文件系统是如何减少磁盘碎片的?

答:EXT2文件系统有几个主要特点:其中两个特点与减少磁盘碎片有直接联系。一是当创建EXT2文件系统时,系统管理员可以根据预期文件的平均长度来选择最佳块的大小,一般是1024到4096字节。例如当文件的平均长度小于几千个字节时,块的大小为1024字节是最佳的,因此这会产生较少的内部碎片,也就是文件长度与存放它的磁盘空间有较少的不匹配。

    另一方面,在磁盘数据块被实际使用之前,EXT2文件系统就把这些预分配给正规文件。因此,当文件的大小增加时,因为物理上相邻的几个块已被保留,这就减少了文件的碎片。

    还有就是磁盘分片法。

 

12.9如果一个Linux文件的保护模式是754(八进制),请问:文件的拥有者、同组以及其他人分别对这个文件有什么权限呢?

答:(754)8=rwxr-xr--,由此可以看出,文件的拥有者可以对该文件进行读、写及执行操作,同组用户可以对该文件执行读和执行操作。其他用户只允许读该文件。其中:

r: 对应数值4
w: 对应数值2
x:对应数值1
-:对应数值0

12.10 Linux内核是否每次进行磁盘读写时,都要为之分配磁盘缓冲区?当需要分配一个磁盘

缓冲区时,它采取的分配策略是什么?

答:当每次进行磁盘读/写时,核心都要读/写操作对应的磁盘块是否在缓冲池中。如果在缓冲池中,则直接引用缓冲池中的数据;如果不在,则分配一个空闲缓冲区。当需要空闲缓冲区时,应从空闲队列首部摘下缓冲区。

详细过程是这样的:每当进行磁盘读/写操作时,核心调用getblk过程分配缓冲区。当要读磁盘数据时,核心首先检查要读入的磁盘块内容是否已在某个缓冲区中,若发现已在某个缓冲区中,便不必再从磁盘上读入。仅当数据未在任何缓冲区中时,核心才需从磁盘上将数据读入,这时才需为其分配一空闲缓冲区。类似地,当要把数据写入一特定磁盘块时,核心应先检查该块内容是否已在某缓冲区中,仅当该块内容尚不在缓冲区中时,才需要分配一空闲缓冲区。获取空闲缓冲区时应提供的输入参数是文件系统号和磁盘块号。Getblk过程分配缓冲区时,可分为两情况:

① 缓冲区在散列队列上,进入getblk过程后,首先根据文件系统号和磁盘块号去查找散列队列,若找到与文件系统号和块号相匹配的缓冲区,便可进一步检查该缓冲区是否空闲。若空闲,则应先上锁,以防止其他进程对它进行访问,然后把它从空闲队列上摘下;若忙,则表明缓冲区已被其他进程上锁,因此暂时不能对它进行访问而进入睡眠,直至该缓冲区变为空闲时再将它唤醒。

② 缓冲区不在散列队列上。若在散列队列中找不到与文件系统号及块号相匹配的缓冲区,便只有从空闲链表中找一个缓冲区。若空闲链表已空,则无法进行分配,进程睡眠,直到空闲链表中出现缓冲区为止;若空闲链表不空,这时可从链首摘下一缓冲区,若此缓冲区标记有:“延迟写”,此时应将该缓冲区内容异步地写到磁盘上,再从空闲链表中摘下一个缓冲区,并调整该缓冲区所在的散列队列,即该散列队列从原来的散列队列调整到新的散列队列中。因为当该缓冲区重新分配后,缓冲区对应的磁盘块号发生了变化,从而也相应地改变了其所在的散列队列。

12.11  Linux文件系统为什么设计了一个磁盘i节点又设计了一个内存i节点,为什么内I 

节点的内容和磁盘i节点内容不完全相同?

答:索引节点又称为i节点,其中存放文件的说明信息。索引节点以静态形式存放在磁盘上,故又称为磁盘索引节点。每个文件都有一个唯一的一个磁盘索引节点,它由下述字段构成:

文件所有者标识符

文件类型

文件存取权限

存放文件的物理地址

文件长度

文件连接记数

文件存取时间

为了加快文件的存取速度和减轻磁盘I/O压力,系统又专门在内存中建立了一个内存索引节点表,将那些要被引用的磁盘索引节点复制到内存索引节点表中,并增加了如下字段:

 索引节点号

内存索引节点状态

内存索引节点引用计数

设备号

    内存索引节点指针

 

12.12为什么用户在第一次访问任何文件之前,都必须先调用open()系统调用来打开指定的文件,然后才能对该文件执行读、写以及修改操作,在对文件操作结束必须关闭文件。

答:操作系统需要处理大量用户文件,而访问一个文件需要查询目录,有时甚至需要多次查询目录。由于文件目录与文件一起存放在辅存上,当存取文件时,必须先到辅存中读取文件目录信息,从中获得文件的存放地址,然后再去存取文件。这样一来,文件信息的存取将花费很多时间。如果将整个文件目录放入主存,虽然可以提高存取速度,但这需要占用大量的主存空间。显然也是不可取的。实际上,在一段时间内使用的文件数总是有限的,因此只要将目录中当前使用的那些文件的目录表复制到内存中就可以了。这样即不占用太多的主存空间,又可显著提高查询文件目录的速度。为此,大多数操作系统中设置了两个文件操作:打开文件和关闭文件。打开文件操作完成的功能是将文件的有关目录信息复制到主存活动文件表中,以建立用户和这个文件的联系。关闭文件操作的功能是用户宣布这个文件当前不再使用,系统将其在主存中的相应目录信息删去,从而也就切断了用户同这个文件的联系。


12.5设一个用户的当前工作目录是usr/mnt/daol。如果系统管理员在/usr/mnt目录上安装了了一个新的文件系统,这对用户会有什么影响?该用户是否能继续看到在/daol目录下的文件?

答:如果把一个已有内容的目录作为安装点目录,则该目录的原有内容被屏蔽,直至用umount命令将安装点目录与文件系统的联系解除之后,原目录的内容方可被访问。

所以系统管理员在/usr/mnt目录上安装了一个新的文件系统,将覆盖用户在该目录下的文件。所以用户不能继续看到在 /daol目录下的文件。

12.6系统文件表项(即系统打开文件链表中的元素)中含有一个偏移量,由它给出了文件中的当前位置。如果有两个进程各自都以读方式打开了一个文件,则它们各自都有自己访问文件的偏移,因此每个进程都独立于另一个进程来读文件。对于写操作将怎样呢?如果偏移被放在索引节点表中而不是文件系统表中将会出现怎样的情况?

答: 写操作是相互独立的。因为在系统文件表项中(即struct file)包含有下一次在文件中读写位置的偏移量以及文件打开方式等,在linux中对文件既可以顺序访问也可以随机访问,默认的访问方式是顺序访问,当用户打开一个文件时,内核将偏移指针初始化为0,在每次对文件读或写之后,内核就在原来的偏移量加上读出或写入的字节数,以记住当前的位置,下一次读或写都从该位置开始。系统可以用lseek将偏移量置为某一确定值,实现随机访问。此外,一个用户可以多次打开同一文件,而多个用户也可以同时打开一个文件。无论哪种情况,内核必须每次为调用者返回一个新的文件描述符和它对应的打开文件对象,及struct file 结构,这样当多个文件打开同一个文件时,读进程或写进程只改变他自己的struct file结构中的偏移指针,而不会干扰其它任务,使得一个文件能够被多个进程所共享而对用户又是透明的。一般情况下,应该考虑多个进程并发访问一个文件时必须对该文件进行同步操作,以避免反生竞争条件。每个用户可以重写其他用户已写的数据。另一方面,如果偏移被存储在索引节点表中,那么来自不同open的写将是连续进行的。这种情况下,进程将仅读取文件的一部分,因为它们正在使用的文件偏移可能会被其他进程更新。

 

12.7假定进程以读方式打开一个文件后,再执行fork,父进程和子进程将都可以读这个文件。这两个进程的读操作和写操作各有何关系?

答:这两个进程共享一个系统文件表项,于是也共享该文件的偏移。因此,这两个进程将读取文件的不同部分。如果没有其他的进程将该文件打开,写操作将添加到文件的尾部且写操作无数据丢失。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值