Write a program to simulate managing files on disk. Define the disk as a one dimensional array disk of size numOfSectors*sizeOfSector, where sizeOfSector indicates the number of characters stored in one sector. (For the sake of debugging, make it a very small number.) A pool of available sectors is kept in a linked list sectors of three field structures: two fields to indicate ranges of available sectors and one next field. Files are kept in a linked list files of four field structures: file name, the number of characters in the file, a reference to a linked list of sectors where the contents of the file can be found, and the next field.
a. In the first part, implement methods to save and delete files. Saving files requires claiming a sufficient number of sectors from pool, if available. The sectors may not be contiguous, so the linked list assigned to the file may contain several nodes. Then the contents of the file have to be written to the sectors assigned to the file. Deletion of a file only requires removing the nodes corresponding with this file (one from files and the rest from its own linked list of sectors) and transferring the sectors assigned to this file back to pool. No changes are made in disk.
b. File fragmentation slows down file retrieval. In the ideal situation, one cluster of sectors is assigned to one file. However, after many operations with files, it may not be possible. Extend the program to include a method together() to transfer files to contiguous sectors; that is, to create a situation illustrated in Figure 3.33. Fragmented files file1 and file2 occupy only one cluster of sectors after together() is finished. However, particular care should be taken not to overwrite sectors occupied by other files. For example, file1 requires eight sectors; five sectors are free at the beginning of pool, but sectors 5 and 6 are occupied by file2. Therefore, a file f occupying such sectors has to be located first by scanning files. The contents of these sectors must be transferred to unoccupied positions, which requires updating the sectors belonging to f in the linked list; only then can the released sectors be utilized. One way of accomplishing this is by copying from the area into which one file is copied chunks of sectors of another file into an area of the disk large enough to accommodate these chunks. In the example in Figure 3.33, contents of file1 first are copied to sectors 0 through 4, and then copying is temporarily suspended because sector 5 is occupied. Thus, contents of sectors 5 and 6 are moved to sectors 12 and 14, and the copying of file1 is resumed.
Fig. 3.33