网站大量收购独家精品文档,联系QQ:2885784924

操作系统:第7章.ppt

  1. 1、本文档共108页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
当一个文件所需的磁盘块大于16522个磁盘块时,就成为UNIX的巨型文件了。这时除了用到di_addr[0]~di_addr[9]外,还要用到di_addr[10]、di_addr[11]和di_addr[12]。此时,文件的最大长度可以达到约11亿个字节,但是由于此时要经过多次间接索引,会使系统的查找速度大大降低。有关巨型文件的索引结构和它拥有的规模,留作一个习题去思考,这里就不具体解释了。 7.3.4 UNIX对文件存储空间的管理 在磁盘上,UNIX总是把文件安排在一般数据存储区(见图7-14)。因此,UNIX对文件存储空间的管理,即是对磁盘上一般数据存储区的管理。在5.2.3节介绍使用“空闲块链”管理磁盘上的空闲块时,曾提及“成组链接”法,并说UNIX操作系统就是采用这种方法来管理磁盘上的空闲块的。下面详细介绍它的实现过程。 在磁盘管理区filsys结构中,有两个内容涉及到磁盘空闲块的管理,一个是由数组s_free[100]构成的一个空闲磁盘块索引表。当一个文件要申请磁盘块时,就到这个索引表中去获得需要的空闲块;当一个磁盘块被释放时,就把它还回到这个索引表中。所以,这个索引表中记录的是当前系统可以直接分配的空闲磁盘块。另一个是s_nfree,它记录了s_free[ ]中现有的可分配的空闲磁盘块数。 从形式上看,利用数组s_free[100]直接管理100个空闲的磁盘块,与利用数组s_inode[100]直接管理100个空闲的i节点相类似,但实际上相差很远。因为除这100个直接管理的空闲块外,UNIX对其余的空闲块并没有放置不管,而是将它们分组进行链接。具体做法如图7-19所示。 UNIX把磁盘上一般数据存储区中的所有空闲块依次分组。为了下面讲述方便,对每一组的块都进行分别编号。具体的办法是:第1组为99块,编号为1~99(为什么第1组只有99块,后面会给出解释)。从第2组起,每组都是100块,剩下的块归并成为最后一组。它们都按0~99的顺序进行编号。在图7-19中,从右至左反映了这种分组的结构。在图中,假定最后一组中只有52个空闲块,各块的编号为0~51。 分好组以后,总是在后一组的第0块中开辟101个位置,依次存放前一组的总块数以及前一组中每一块的地址。也就是说,相当于总是在后一组中,开辟s_nfree和s_free[100]所需要的位置,用于存放前一组的分组信息。 在此,有两组的情况要做特殊处理。一个是第1组。在第1组中,实际只有99个空闲块。为了管理的需要,把它的总块数仍记为100,见图7-19中第2组里的s_nfree=100。另外,第一组磁盘块编号是从1开始的,因此在相当于第0号磁盘块的位置存放一个0,而不是某一个磁盘块的地址,见图7-19中第2组中的s_free[0]=0。 另一个要特殊处理的是最后一组。因为在最后一组的后面已经没有下一组了,所以UNIX就把它的所有信息存放在管理块的filsys中,即存放在filsys的s_nfree和s_free[100]中。由于现在最后一组只有52个空闲块,因此在filsys中的s_nfree取值为52,并且只用到数组s_free[100]的前52个元素,即用s_ferr[0]到s_free[51]存放最后一组的52个空闲块的地址。 至此,成组链接的格局已经完成:在filsys的s_free[ ]中,记录了当前直接可以分配的52个空闲块。在这52个空闲块的第0块中,记录了下一组100个空闲的磁盘块地址,下一组100个空闲的第0块中,记录了再下一组100个空闲的磁盘块地址,如此等等。 在采用“成组链接”法后,如何分配空闲块,如何回收空闲块?下面来讨论这两个问题。无论是磁盘空闲块的分配还是回收,都是在filsys中的空闲磁盘块索引表s_free[ ]中进行,并把它视为一个栈。分配时,做出栈操作;回收时,做进栈操作。 s_nfree中记录的值,是s_free[ ]中当前实际有的空闲块数,正好也是空闲磁盘块索引表s_free[ ]中下一个可以使用的索引表目的下标。 因此,总是先在s_nfree上做减1操作,然后把s_free[s_nfree]中记录的磁盘块分配出去。这里要注意的是,如果在s_nfree上做减1操作后,其值等于0了,那么就是要把s_free[0]所指向的那一个磁盘空闲块分配出去。由于它是这一组的第0个磁盘块(按照分配顺序,它总是在一组中最后被分配出去),里面包含有它前一组空闲块的信息在内。因此在把这一块分配出去之前,应该先把它记录的101个信息拷贝到filsys结构的s_nfree和s_free[ ]里面去,然后才能将它分配出去。 分配时还要注意的一个问题是如果分配一直进行,现在要把第2组的第0块分配出去。根据前面

文档评论(0)

xiaohuer + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档