逻辑文件中的记录在物理文件中将如何实现?
定长记录
定长记录的删除的三种方式
1、将被删除记录后的记录依次移上来
缺点:删除一条记录平均要移动文件中的一半记录,开销大
2、把文件中最后一条记录填补到被删记录位置
缺点:还是要移动结点,操作不灵活
3、把被删结点用指针链接起来
在每条记录中增加一个指针,在文件中增设一个文件首部。文件首部中包括文件的有关信息,其中有一个指针指向第一个被删记录位置,所有被删结点用指针链接,构成一个栈结构的空闲记录链表。
缺点:要注意悬挂指针问题(不甚理解)
变长记录
变长记录的表示有字节串形式和定长形式两种
1、变长记录的字节串表示形式
1)这种形式是把每条记录看成连续的字节串,然后在每条记录的尾部附加“记录尾标示符”
2)字节串的另一种表现形式是在记录的开始加一条纪录长度的字段来实现,而不是使用在记录尾加标示符的方法。
缺点:
a、被删记录的位置难以复用,导致磁盘碎片
b、如果文件中记录要伸长,很难实现,必须移动到他处才能伸长,如果要伸长的记录是被拴记录,那么移动的代价是很大的。
3)分槽式页结构
一般一个分槽式页就是一个块大小,每块开始处设置一个块首部,块首部中包括以下信息:
a、块中记录数目
b、指向块中自由空间尾部的指针
c、登记每条记录的开始位置和大小信息
在块中实际记录紧连着,靠近尾部存放;自由空间也紧连着,在块中间。插入总是从自由空间的尾部开始,并需要在块首部中登记插入记录的大小和位置。
删除记录时要更新块首部中记录大小为-1,需将左边记录移动过来填补,因为在块中移动记录的代价也不太高,这是因为一块的大小最多只有4KB。
在这个结构中,要求其他指针不能直接指向记录本身,而是指向块首部中的记录信息登记项,这样块中记录的移动就独立于外界因素了(移动时只要更新块首部中的登记信息,无需修改其他指针指向地址)
2、变长记录的定长表示形式
在文件系统中往往是使用一个或多个定长记录来表示变长记录的方法。
1)预留空间的方法
取所有变长记录中最长的一条记录的长度座位存储空间的记录长度,来存储变长记录。
缺点:若记录长度相差很大,浪费空间
2)指针形式
如果记录的长度相差很大,那么可用指针形式实现变长记录的定长表示形式。
缺点:总有一些字段的空间存在浪费
改进方式:在一个文件中使用两种块:固定块和溢出块
用固定块存放每条链中的第一条记录,其余记录全放在溢出块中,并且在溢出块不放与固定块重复的字段值。这两种块中记录的长度可以不一样,但同一种块内的记录是定长的。