成组链接法 即空闲表和空闲链里两种方法相结合。
将空闲块按100块为一组进行组织,利用空闲块每组的第0块来存放前一组的100块的地址,所以第0块既是可以分配的空闲块,同时也充当了数据结构。
具体来说,每100块分为一组(第一组为99块,这里的是s_free[0]是用来标识空闲盘块链的链尾标志,即表示下面已经没有索引表登记空闲块了)
s_nfree表示这个表中有多少空闲块,s_free表示这个表中的第几块空闲块
每一组相当于一个栈,s_free[0]相当于栈底,s_free[99]相当于栈顶,在一个组存放到100之后,就开一个新组来存放,新组的栈底就是上一组的栈顶,这样就可以把这些组给连接起来,组间是链,组内是表。
分配时,先分配栈顶的空闲块,直到s_free[0]内的值为0,说明已经到了空闲盘块链尾,没有盘块可以分配了,这是分配程序就将错误信息打印出来,并返回一个NULL给调用者,相当于出栈。
回收时,把回收的空闲块放入栈顶,如果前一个栈已经放满,就再在这组之后开一个新组,放入新组栈顶,并置s_nfree:为1;如果前一个栈未放满,就填入原组表中第一个 占用的项,相当于压栈。
这种后进先出的栈式管理和成组链接方法加快了磁盘的分配和释放的速度,减少了系统的时空开销,提高系统效率。