热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

操作系统学习笔记_10_文档管理文件系统

文件管理--文件系统实现一、文件系统层次结构(1)用户调用接口文件系统为用户提供与文件及文件夹有关的调用,如新建、打开、读写、关闭、删除文件,建立、删除文件夹等。此层由若干程序模

文件管理

--文件系统实现



一、文件系统层次结构

(1)用户调用接口

   文件系统为用户提供与文件及文件夹有关的调用,如新建、打开、读写、关闭、删除文件,建立、删除文件夹等。此层由若干程序模块组成,每一模块相应一条系统调用,用户发出系统调用时,控制即转入相应的模块。

(2)文件文件夹系统

   主要功能是管理文件文件夹,其任务有:管理活跃文件文件夹表、管理读写状态信息表、管理用户进程的打开文件表、管理与组织在存储设备上的文件文件夹结构、调用下一级存取控制模块。

(3)存取控制验证

   实现文件保护主要由该级软件完毕,它把用户的訪问要求与文件控制块中指示的訪问控制权限进行比較,以确认訪问的合法性。

(4)逻辑文件系统与文件信息缓冲区

   主要功能是依据文件的逻辑结构将用户要读写的逻辑记录转换成文件逻辑结构内的相应块号。

(5)物理文件系统

   主要功能是把逻辑记录所在的相对块号转换成实际的物理地址。

(6)分配模块

   主要功能是管理辅存空间,即负责分配辅存空暇空间和回收辅存空间。

(7)设备管理程序模块

   主要功能是分配设备、分配设备读写用缓冲区、磁盘调度、启动设备、处理设备中断、释放设备读写缓冲区、释放设备等。



二、文件夹实现

   在读文件前,必须先打开文件,打开文件时,操作系统利用路径名找到相应文件夹项,文件夹项中提供了查找文件磁盘块所须要的信息。文件夹实现的基本方法有两种方法:

(1)线性列表

   最简单的文件夹实现方法是使用存储文件名称数据块指针的线性表。创建新文件时,必须首先搜索文件夹表以确定没有同名的文件存在,然后在文件夹表后添加一个文件夹项。删除文件,则依据给定的文件名称搜索文件夹表,接着释放分配给它的空间。若要重用文件夹项,有很多方法,能够将文件夹项标记为不再使用,或者将它加到空暇文件夹项表上,还能够将文件夹表中最后一个文件夹项拷贝到空暇位置,并减少文件夹表长度。採用链表结构能够减少删除文件的时间。其长处在于实现简单。

只是因为线性表的特殊性,执行比較费时。

(2)哈希表

   哈希表依据文件名称得到一个值,并返回一个指向线性列表中元素的指针。这样的方法的长处是查找非常迅速,插入和删除也较简单,只是须要一些预备措施来避免冲突。

最大困难的是哈希表长度固定以及哈希函数对表长的依赖性。

   文件夹查询必须通过在磁盘上重复搜索完毕,须要不断的进行I/O操作,开销较大。所以如第一节所述,为了减少I/O操作,把当前使用的文件文件夹拷贝到内存。以后要使用该文件时仅仅要在内存中操作,从而减少了磁盘操作次数。



三、文件实现

(1)文件分配方式

   文件分配相应于文件的物理结构,是指怎样为文件分配磁盘块。经常使用的磁盘空间分配方法有三种:连续分配、链接分配和索引分配。有的系统(RDOS操作系统)对三种方法都支持,可是,更普遍的是一个系统仅仅提供一种方法的支持。

  1)连续分配

   连续分配方法要求每一个文件在磁盘上占有一组连续的块。磁盘地址定义了磁盘上的一个线性排序。

这样的排序使作业訪问磁盘时须要的寻道数和寻道时间最小。文件的连续分配能够用第一块的磁盘地址和连续块的数量来定义。如果文件有n块长并从位置b開始,那么该文件将占有块b,b+1,b+2,„„,b+n-1。一个文件的文件夹条目包含開始块的地址和该文件所分配区域的长度。

   连续分配支持顺序訪问和直接訪问。其长处是实现简单、存取速度快。缺点在于,文件长度不宜动态添加,因为一个文件末尾后的盘块可能已经分配给其它文件,一旦须要添加,就须要大量移动盘块。此外,重复增删文件后会产生外部碎片(与内存管理分配方式中的碎片相似),而且非常难确定一个文件须要的空间大小,因而仅仅适用于长度固定的文件。

2)链接分配

   链接分配攻克了连续分配的碎片和文件大小问题。採用链接分配,每一个文件相应一个磁盘块的链表;磁盘块分布在磁盘的不论什么地方,除最后一个盘块外,每一个盘块都有指向下一个盘块的指针,这些指针对用户是透明的。

文件夹包含文件第一块的指针和最后一块的指针。

   创建新文件时,文件夹中添加一个新条目。链接分配中每一个文件夹项都有一个指向文件首块的指针。该指针初始化为 nil以表示空文件。大小字段为0。写文件会通过空暇空间管理系统找到空暇块,将该块链接到文件的尾部,以便写入。读文件则通过块到块的指针读块。

   链接分配方式没有外部碎片,空暇空间列表上的不论什么块都能够用来满足请求。创建文件时并不须要说明文件大小。

仅仅要有空暇块文件就能够增大,也无需合并磁盘空间。

   链接分配缺点在于无法直接訪问盘块,仅仅能通过指针顺序訪问文件。以及盘块指针消耗了一定的存储空间。

  3)索引分配

   链接分配攻克了连续分配的外部碎片和文件大小管理的问题。可是,链接分配不能有效支持直接訪问(FAT除外)

索引分配攻克了这个问题,它把每一个文件的全部的盘块号都集中放在一起构成索引块(表)。

   每一个文件都有其索引块,这是一个磁盘块地址的数组。

索引块的第i个条目指向文件的第i个块。文件夹条目包含索引块的地址。要读第i,通过索引块的第i个条目的指针来查找和读入所需的块。

   创建文件时,索引块的全部指针都设为空。当首次写入第i块时,先从空暇空间中取得一个块,再将其地址写到索引块的第i个条目。

   索引分配支持直接訪问,且没有外部碎片问题。其缺点是因为索引块的分配,添加了系统存储空间的开销。

   索引块的大小是一个重要的问题,每一个文件必须有一个索引块,因此索引块应尽可能小;但索引块太小无法支持大文件。

能够採用下面机制来处理这个问题:

   链接方案:一个索引块通常为一个磁盘块。

因此,它本身能直接读写。为了处理大文件,能够将多个索引块链接起来。

   多层索引:多层索引使第一层索引块指向第二层的索引块,第二层索引块再指向文件块。

这样的方法依据最大文件大小的要求,能够继续到第三层或第四层。比如,4096B的块,能在索引块中存入10244B的指针。

两层索引同意1048576个数据块,即同意最大文件为4GB

   混合索引:将多种索引分配方式相结合的分配方式。比如,系统既採用直接地址,又採用单级索引分配方式或两级索引分配方式。


訪问第n个记录

长处

缺点

顺序分配

需訪问磁盘1

顺序存取时速度快,当文件是定长时能够依据文件起始地址及记录长度进行随机訪问

文件存储要求连续的存储空间,会产生碎片,也不利于文件的动态扩充

链接分配

需訪问磁盘n

能够解决外存的碎片问

,提高了外存空间的利用率,动态增长较方便

仅仅能依照文件的指针链顺序訪问,查找效率低,指针信息存放消耗外存空间

索引分配

m级需訪问磁盘m+1

能够随机訪问,易于文件的增删

索引表添加存储空间的开销,索引表的查找策略对文件系统效率影响较大

   此外,訪问文件须要两次訪问外存——首先要读取索引块的内容,然后再訪问详细的磁盘块,因而减少了文件的存取速度。为了解决这一问题,通常将文件的索引块读入内存的缓冲区中,以加快文件的訪问速度

2)文件存储空间管理

   1)文件存储器空间的划分与初始化

    一般来说,一个文件存储在一个文件卷中。

文件卷能够是物理盘的一部分,也能够是整个物理盘,支持超大型文件的文件卷也能够由多个物理盘组成,如图所看到的。

  在一个文件卷中,文件数据信息的空间(文件区)和存放文件控制信息FCB的空间(文件夹区)是分离的。因为存在非常多种类的文件表示和存放格式,所以现代操作系统中一般都有非常多不同的文件管理模块,通过它们能够訪问不同格式的逻辑卷中的文件。逻辑卷在提供文件服务前,必须由相应的文件程序进行初始化,划分好文件夹区和文件区,建立空暇空间管理表格及存放逻辑卷信息的超级块。

    2)文件存储器空间管理

   文件存储设备分成很多大小相同的物理块,并以块为单位交换信息,因此,文件存储设备的管理实质上是对空暇块的组织和管理,它包含空暇块的组织、分配与回收等问题。

  • 空暇表法

   空暇表法属于连续分配方式,它与内存的动态分配方式相似,为每一个文件分配一块连续的存储空间。系统为外存上的全部空暇区建立一张空暇盘块表,每一个空暇区相应于一个空暇表项,当中包含表项序号、该空暇区第一个盘块号、该区的空暇盘块数等信息。再将全部空暇区按其起始盘块号递增的次序排列,例如以下表所看到的。

   空暇盘区的分配与内存的动态分配相似,相同是採用首次适应算法、循环首次适应算法等。比如,在系统为某新创建的文件分配空暇盘块时,先顺序地检索空暇盘块表的各表项,直至找到第一个其大小能满足要求的空暇区,再将该盘区分配给用户(进程),同一时候改动空暇盘块表。



系统在对用户所释放的存储空间进行回收时,也採取相似于内存回收的方法,即要考虑回收区是否与空暇表中插入点的前区和后区相邻接,对相邻接者应予以合并。

  • 空暇链表法

    将全部空暇盘区拉成一条空暇链,依据构成链所用的基本元素不同,可把链表分成两种形式:空暇盘块链和空暇盘区链。

    空暇盘块链是将磁盘上的全部空暇空间,以盘块为单位拉成一条链。当用户因创建文件而请求分配存储空间时,系统从链首開始,依次摘下适当的数目的空暇盘块分配给用户。当用户因删除文件而释放存储空间时,系统将回收的盘块依次插入空暇盘块链的末尾。长处是分配和回收一个盘块的过程非常easy,但在为一个文件分配盘块时,可能要重复多次操作。

    空暇盘区链是将磁盘上的全部空暇盘区(每一个盘区可包含若干个盘块)拉成一条链。在每一个盘区上除含实用于指示下一个空暇盘区的指针外,还应有能指明本盘区大小(盘块数)的信息。分配盘区的方法与内存的动态分区分配相似,通常採用首次适应算法。在回收盘区时,相同也要将回收区与相邻接的空暇盘区相合并。

  • 位示图法

   位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上全部的盘块都有一个二进制位与之相应。

当其值为“0”,表示相应的盘块空暇;当其值为“1”,表示相应的盘块已分配。

位示图法示意如图所看到的。


盘块的分配:

   1顺序扫描位示图,从中找出一个或一组其值为“0”的二进制位。

   2将所找到的一个或一组二进制位,转换成与之相应的盘块号。假定找到的其值为“0”的二进制位,位于位示图的第i行、第 j,则其相应的盘块号应按下式计算(n代表每行的位数):

    b=n(i-1)+j

   3改动位示图,map[i,j]=1

 盘块的回收:

  4将回收盘块的盘块号转换成位示图中的行号和列号。

转换公式为:

   i=(b-1)DIVn+1

   j=(b-1)MODn+1

  5改动位示图,map[i,j]=0

  • 成组链接法

   空暇表法和空暇链表法都不适合用于大型文件系统,因为这会使空暇表或空暇链表太大。在 UNIX系统中採用的是成组链接法,这样的方法结合了空暇表和空暇链表两种方法,克服了表太大的缺点。

其大致的思想是:把顺序的n个空暇扇区地址保存在第一个空暇扇区内,其后一个空暇扇区内则保存还有一顺序空暇扇区的地址,如此继续,直至全部空暇扇区均予以链接。

系统仅仅须要保存一个指向第一个空暇扇区的指针。如果磁盘最初全为空暇扇区,其成组链接如图4-14所看到的。通过这样的方式能够迅速找到大批空暇块地址。

   表示文件存储器空暇空间的“位向量”表或第一个成组链块以及卷中的文件夹区、文件区划分信息都须要存放在辅存储器中,一般放在卷头位置,UNIX中称为“超级块”。在对卷中文件进行操作前,“超级块”须要预先读入系统空间的主存,并保持主存储器“超级块”和辅助存储卷“超级块”一致。

版权声明:本文博主原创文章,博客,未经同意不得转载。


推荐阅读
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
author-avatar
ozkan_75889
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有