首页 理论教育 文件系统性能:磁盘块和文件的一致性检查

文件系统性能:磁盘块和文件的一致性检查

时间:2023-11-06 理论教育 版权反馈
【摘要】:一致性是指要求文件系统中的数据保持一致,且符合客观事实,一般通过日志、事务和随影实现。文件系统的一致性检查主要有两种:磁盘块的一致性检查和文件的一致性检查。

文件系统性能:磁盘块和文件的一致性检查

7.7.1 文件系统的可靠性

文件系统的可靠性是文件系统应用中必须解决的一个重要问题。文件系统的可靠性包括文件系统的持久性和一致性。持久性是指文件系统中的数据必须能够持久保存,一般通过备份和复制实现。一致性是指要求文件系统中的数据保持一致,且符合客观事实,一般通过日志、事务和随影实现。

1.文件系统的持久性

文件系统的持久性一般通过备份和复制来实现。为文件做备份既耗时间又费空间,所以需要做得又快又好。备份包括两种方式:物理备份和逻辑备份。物理备份是指备份整个磁盘,逻辑备份是指备份指定的目录和文件。由于实际应用中,多数系统的可执行程序放置在文件系统的受限部分,它们或者可由厂商直接提供不需要备份,或者由于访问受限使得备份程序反而被挂起,所以一般保持文件的持久性大多采用逻辑备份,只备份指定的目录及文件。逻辑备份的文件系统示例如图7-18所示。

图7-18 逻辑备份的文件系统

2.文件系统的一致性

文件系统的多步更新过程中如果出现系统崩溃有可能导致数据的不一致问题,比如,从账号1转账100元到账号2分两个步骤:①从账号1扣除100元。②增加100元到账号2。如果在第一步和第二步之间系统发生崩溃就会导致两个账户中数据的不一致。另外创建新文件时首先建立文件I-NODE,将I-NODE写入磁盘;然后将I-NODE的磁盘地址和文件名写入该文件所属文件夹里。或者移动文件从一个目录到另一个目录时,首先从旧目录删除文件,然后增加文件到新目录,如果两步中间系统发生崩溃都会导致文件系统的不一致。

为了解决文件系统的不一致问题,系统可采取多种措施,比如数据库管理系统中的“事务”借助日志文件实现对数据文件的原子性操作,保持数据块的两个版本的随影,将新数据写入增补式日志方式,以及设置文件系统的一致性检查等。

文件系统的一致性检查主要有两种:磁盘块的一致性检查和文件的一致性检查。

7.7.2 文件系统性能的优化

磁盘访问比起内存访问速度慢很多,需要考虑各种优化措施以改善性能。

1.高速缓存

高速缓存是最常用的减少磁盘访问次数的技术。在这里,高速缓存指的是一系列的块,它们在逻辑上属于磁盘,但实际上基于性能的考虑被保存在内存中。

管理高速缓存有不同的算法,常用的算法是检查全部读请求,查看在高速缓存中是否有需要的块。如果存在,可执行读操作而无须访问磁盘,如果该块不在高速缓存中,首先要把它读到高速缓存中,再复制到其他地方。之后对同一块的请求都通过高速缓存完成,从而提高读取效率

2.提取读取

块提取读取是第二个明显提高文件系统性能的技术。在需要用到块之前,试图提前多读一些数据并将其写入高速缓存,从而提高命中率,这是基于数据读取的时空局域性原则,因为后面的数据可能很快会被读取。比如,许多文件都是顺序读的,如果用户请求文件系统在某个文件中读取块K,文件系统执行相关操作且在完成后,会检查高速缓存,如果块K+1已经在高速缓存即可直接读取,提高读取效率,如果不在,文件系统会为后续块安排预读,为以后的高效读取奠定基础。

块提取读取策略仅仅在顺序读取时效果较好,对于随机存取文件,提取读取丝毫不起作用。不过相比于磁盘寻道和旋转时间,数据传输时间可以忽略,因此提取读取付出的代价并不大。

3.减少磁臂运动

除了高速缓存和提取读取,减少磁臂运动是另一种提高文件性能的方法。寻道时间在磁盘访问中占据很大比例,因此把有可能顺序存放的块放在一起,最好是放在同一个柱面上,可通过减少磁臂运动来减少寻道时间,从而改善文件系统的性能。

例如,在索引文件中,读取一个文件都需要两次磁盘访问,一次访问索引节点,另一次访问数据块。通常情况下,索引节点的放置如图7-19a所示,其中,全部节点都放置在靠近磁盘开始的位置,所以索引和它指向的数据块之间的平均距离是柱面数的一半,每次读取将需要较长的寻道时间。

一个改进的方法是,将磁盘分成多个柱面组,每个柱面组有自己的索引节点、数据块和空闲表等,如图7-19b所示。在读取文件时,读取完索引节点就可直接在自己所在的柱面组读取具体的数据,从而减少磁臂运动。

7.7.3 文件的保护机制

图7-19 索引节点的放置

授权机制确认用户或进程只有在策略许可时才能使用计算机的实体(如资源),也是一种最传统的应用最广泛的文件保护机制。每个可证明其身份的用户才有权使用计算机,这样的用户就是系统管理员及其注册的合法用户。当一个用户通过身份安全验证而进入系统后,每次要访问系统中的资源时,还必须经过授权机制验证自己对资源访问的合法性,以保证对系统资源进行访问的用户是被授权的合法用户。

1.保护域(www.xing528.com)

在计算机系统中有很多必须受到保护的对象,这些对象可以是硬件,例如CPU、内存段、磁盘驱动器或打印机等,也可以是软件,例如进程、文件、数据库和信号量等。每个对象都有一个名字和可对它执行的一组操作,例如对文件A可执行读或写操作,对信号量M可执行PV操作。显然,系统需要某种方法禁止未授权进程访问对象,或者限制进程只执行合法操作的子集。保护域就是一种可行的机制。

保护域简称“域”,是对象、权限对的集合,每个对标记了一个对象和一个在该对象上可执行的一组操作的子集,权限在这里表示允许执行的操作。域是进程对一组对象的访问权限的集合。将访问控制权限一样的文件和对象组织成同一个域。进程只能在保护域中执行操作,该域指出进程所能访问的对象。图7-20中列出了三个域,并给出了每个域的对象,以及这些对象允许的操作:读(R)、写(W)或执行(X)。请注意打印机同时出现在两个域中,表示在这两个域中都能使用打印机,即都可对其执行写操作。

图7-20 保护域

进程在任何时刻都运行在某个保护域中,即它可以访问这个域中的对象,对其中的每一个对象有一定的访问权限。进程和域之间的关系可以是静态联系,也可以是动态联系。静态联系指进程的可用资源集在进程的整个生命期中是固定的,动态联系是指进程的可用资源集在进程的整个生命期中是可变的。在允许进程和域之间有动态联系的系统中,资源可以得到更充分的利用,但系统必须增加保护域的切换功能,以使进程能在不同的运行阶段从一个保护域切换到另一个保护域。

域是抽象的概念,在实际的系统中常指用户或进程。比如,在UNIX系统中,用用户标识(UID)及其组标识(GID)来定义进程的域,用一个(UID,GID)对,可以建立一张完整的表,将可以访问的对象(文件等)以及是否可以读、写、执行这些对象全部列出。凡是(UID,GID)对相同的两个进程就有完全相同的访问对象集。(UID,GID)对不同的进程有可能访问不同的对象集,不过多数情况下,这些对象集是相互重叠的。

2.保护矩阵

保护域可以用一个保护矩阵来实现。矩阵的行表示域,列表示对象,矩阵元素表示一组访问权限,即进程对某域中的一个对象可执行的一组操作的集合,图7-21列出了与图7-20相对应的保护矩阵。

图7-21 保护矩阵

图7-22 具有切换权的保护矩阵

保护矩阵的访问权限通常是由资源的拥有者或管理者所决定的。当用户创建一个新文件时,创建者便是拥有者,系统在访问矩阵中为新文件增加一列,由用户决定在该列的某个元素中应具有哪些访问权限,而在另一个元素中又具有哪些权限。

为了实现进程和域之间的动态联系,还可以定义具有切换权的保护矩阵,如图7-22所示。切换是一种权力,仅当进程拥有切换权时,才能进行这种切换,比如图中所示,D1可以切换到D2,D2可以切换到D3,反过来却不行。

保护矩阵概念简单,但实际应用中使用却较少,因为该矩阵通常是个非常大的稀疏矩阵,存储这样的矩阵浪费的磁盘空间很大。例如,一个有100个域和106个对象的系统的保护矩阵会有108个元素,即使每个元素只占一个字节,存储该矩阵也需要100 M的空间,而且对这样大的矩阵进行访问也是十分费时的。有两种方法比较实用:按行或按列存储矩阵,而且只存储非空元素。

图7-23 访问控制表

3.访问控制表

保护矩阵有能力实现和控制动态保护,但是要实现起来开销太大。为了减少时、空开销,将矩阵按行划分,也就是系统中每个可以访问的对象(例如文件或设备)在保护矩阵中被赋予一列,其中列出了可以访问该对象的所有域及其访问权限,去掉空值元素,单独存储这一列即得到一张该对象的访问控制表(access control list,ACL),如图7-23所示。因为只存储了非空元素,故系统所需要的全部ACL存储空间比原来的整个保护矩阵所占的空间少很多,进而提高了访问速度。在不少系统中,当对象是文件时,便把ACL存放在该文件的FCB或索引节点中,作为该文件的存取控制信息。

4.访问权限表

另外一种方法是按行分割保护矩阵。采用这种方法时,每个进程都赋予一张该进程可访问的对象表以及每个对象允许进行的操作,即域。该表成为权限表,同ACL一样,系统中所有权限表需要的空间比原来整个保护矩阵所占的空间少得多,而且访问速度快。

一个典型的访问权限表如图7-24所示。由表可以看出,该域中可访问的对象有四个,即文件A、文件B、文件C和打印机,对文件A的访问权限是只读,对文件B的访问权限是读写执行,对文件C的访问权限是读和写,对打印机的权限是写。

应当指出,只有访问权限表是安全的,由它保护的对象才是安全的。因此,应该保护好权限表,以防被用户修改。通常的做法是将权限表存储在系统区的一个专用区中,只允许专用于进行访问合法性检查的程序对该表进行访问,以实现对权限表的保护。

目前,有些系统同时采用访问控制表和权限表。具体做法是,系统为每个对象配置一张访问控制表。当一个进程第一次试图访问一个对象时,必须先检查访问控制表,若发现进程无权访问,便由系统来拒绝进程的访问,并形成一个异常事件;否则便允许进程对该对象的访问,并为该进程建立一个访问权限,将其连接到进程。以后,该进程便可直接利用这一返回的权限去访问该对象,这样便可以快速地验证其访问的合法性。当进程不再需要对该对象进行访问时,便可撤销该访问权限。

图7-24 访问权限表

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈