Block suballocation addresses this problem by dividing up a tail block in some way to allow it to store fragments from other files. Some block suballocation schemes can perform allocation at the byte level; most, however, simply divide up the block into smaller ones (the divisor usually being some power of 2). For example, if a 38
KiB file is to be stored in a
file system using 32 KiB blocks, the file would normally span two blocks, or 64 KiB, for storage; the remaining 26 KiB of the second block becomes unused slack space. With an 8 KiB block suballocation, however, the file would occupy just 6 KiB of the second block, leave 2 KiB (of the 8 KiB suballocation block) slack and free the other 24 KiB of the block for other files.
Tail packing Some file systems have since been designed to take advantage of this unused space, and can pack the tails of several files in a single shared tail block. While this may, at first, seem like it would significantly increase file system fragmentation, the negative effect can be mitigated with
readahead features on modern
operating systems – when dealing with short files, several tails may be close enough to each another to be read together, and thus a
disk seek is not introduced. Such file systems often employ
heuristics in order to determine whether tail packing is worthwhile in a given situation, and
defragmentation software may use a more evolved heuristic. == Efficiency ==