结构推理 UNIX对磁盘上的一般数据存储区是如何管理的?试分析在成组链接法基础上,实现空闲块分配与释放的关键步骤。
【正确答案】UNIX操作系统对磁盘上的一般数据存储区,是采用把空闲块分成若干组然后加以链接的方法来进行管理的,也就是所谓的“成组链接”法。空闲块成组链接后,无论是分配还是回收,都是在filsys中的空闲磁盘块索引表s_free[]里进行,并把它视为一个栈。s_nfree中记录的值,是s_free[]里当前实际有的空闲块数,正好也是空闲磁盘块索引表s_free[]里下一个可以使用的索引表目的下标。分配时,执行出栈操作;回收时,执行进栈操作。
   分配空闲块的步骤如下。
   (1)在s_nfree上执行减1操作,然后把s_free[s_nfree]里记录的磁盘块分配出去。
   (2)如果在s_nfree上执行减1操作后,其值等于0,这意味要把s_free[0]所指向的那一个磁盘空闲块分配出去。由于它是这一组的第0个磁盘块(按照分配顺序,它总是在一组中最后被分配出去),里面包含有它前一组空闲块的信息在内。因此必须先把它所记录的101个信息拷贝到filsys结构的s_nfree和s_free[]里面去,然后才能将它分配出去。
   (3)如果分配一直进行,并把第1组的99块全部分配了出去。这样,filsys里的s_nfree=1,s_free[0]=0。若再申请空闲块,s_nfree减1后成为0,它不是磁盘块的地址,而是表明所有的磁盘空闲块都分配出去了,提出请求的进程只能阻塞等待。
   释放空闲块的步骤如下。
   (1)将释放块的地址登记在空闲磁盘块索引表的s_free[s_nfree]表目里,然后让s_nfree加1。
   (2)在把释放块的地址存入索引表s_free[]的表目前,先检查s_nfree的取值。如果发现s_nfree等于100,那么表明这时空闲磁盘块索引表在此之前已经收集满了100个空闲的磁盘块,它们应该形成一个新的链组。现在要释放的一块,是下一组空闲块的第0块。于是,就把filsys里的s_nfree和s_free[0]~s_free[99]共101个值存入新释放块里,然后将此块的地址填入s_free[0]中,将s_nfree置为1。
【答案解析】