Background of the Invention
The invention pertains to performance improvements for input/output operations with disk drives in personal computers. More particularly, the invention relates to modifications to disk drive software drivers to implement software caches for I/O transactions between Macintosh personal computers and external hard disk drivers.
It has been discovered by the applicants that personal computer software authors tend to write code which reads data blocks stored on hard disk media in sequential order one block at a time. About 50% of the time only one data block of 512 bytes is read on any particular read operation. The requesting application program then does something with the data, and then requests the next block in sequence from the disk a high percentage of the time. Where the particular disk drive being read is an external disk drive outside the chassis of the personal computer, the disk drive will be connected to the personal computer by an interface. In particular, external hard disk drives for the Macintosh personal computer are connected to the CPU by the industry standard SCSI Interface. Each input/output operation with an external hard disk drive via such an interface (the invention is not limited to the SCSI Interface) requires a very large block of time to set up the transaction compared to the actual data transfer time. In particular, for the SCSI Interface and the Macintosh operating system, the overhead time to set up the input/output transaction is on the order of 20 milliseconds while the actual transfer time for the data block is approximately 0.5 milliseconds.
Inefficiency results where blocks of data are requested sequentially one block at a time from an external disk drive connected to the CPU by an interface connector. This is because each block of data so requested has associated therewith an overhead time to set up the transaction which is substantially greater than the time to make the actual data transfer. Accordingly, a need has arisen for a more efficient system for retrieving blocks of data from external hard disks of personal computers in the manner many application programs tend to operate.
Summary of the Invention
The teachings of the invention contemplate, in the preferred embodiment, a modified device driver software program for an external hard disk drive coupled to a MacIntosh personal computer running the MacIntosh operating system. According to the teachings of the invention, the standard driver code for the external hard disk drive is modified to manage a multi-block cache of random access memory storage locations on the motherboard. This reserved cache address base is contiguous to the memory locations in which the driver code itself is stored at boot time. That is, at boot time the driver code is read into the motherboard RAM from the boot block on the hard disk drive connected to the MacIntosh through the SCSI Interface. The driver code contains instructions to the CPU operating system telling the operating system how big the driver is. The size specified is equal to the size of the driver code plus the size of the cache. These instructions can be modified to reserve any size cache desired. In the preferred embodiment, a block of addresses approximately 2,000 bytes in size, plus or minus a few hundred bytes is reserved for the cache which is big enough to store four blocks of data. In other embodiments, the driver code may manage multiple caches where multiple external hard drives are used and where each cache is assigned to one external hard drive. In still other embodiments, a single cache may be used which is shared between multiple external hard drives. Each time the hard drive to which the read request is directed from the operating system changes, the shared cache will be invalidated by setting a flag and ultimately will be refilled with several sequential blocks of data from the new data storage peripheral being addressed.
The cache management code carries out read requests and write requests. This cache management code determines whether the number of blocks requested is greater than the cache size. Typically the cache size is four blocks in the preferred embodiment, but as noted above, the size of the cache can be varied. If the number of blocks needed is greater than the cache size, the request is filled by carrying out the requested transaction directly with the drive. If it is a read request, the number of blocks requested are read from the drive and copied directly to the storage locations designated in the request by the operating system.
If the number of blocks requested is less than the cache size, the cache management code then determines whether the request is a read request or a write request. If it is a write request, the cache is turned off and the write transaction to the external hard drive is carried out.
Next, the cache management code determines whether or not the cache is "on". This means that the data in the cache is valid and available for reading. The cache is turned "off" by setting data in an "on/off" byte whenever a write occurs to the external hard drive corresponding to the hard drive from which the data in the cache was copied since any write operation to the external hard drive may invalidate the data currently stored in the cache.
If the cache management program determines that the cache is on, the program determines whether or not the read request is directed to the same hard drive from which the data currently stored in the cache came. If the drive ID in the request matches the drive ID for the data stored in the cache, the cache management program determines whether or not the requested data block is currently stored in the cache. If it is, the requested data block (or blocks) is retrieved from the cache and put into the file system buffer designated by the operating system in the read request. Other code in the cache management program loads the cache with a sequential group of blocks of data if the requested block or blocks is not currently stored in the cache under predetermined conditions.
Brief Description of the Drawings
FIG. 1 is a block diagram showing the hardware arrangement in which the software implementing the teachings of the invention resides. The embodiment shown in FIG. 1 is a single software cache shared between two external hard drives.
FIG. 2 is a block diagram similar to that shown in FIG. 1 except that two individual software caches are used, each assigned to one of two external hard drive disk storage units.
FIGS. 3A and 3B are a flow chart of the software which implements the software cache according to the teachings of the invention. This software is resident in a software driver which controls input/output transactions between an external hard disk drive and the motherboard of the central processing unit. The object code for an exemplary embodiment of the program is given in Appendix A.
Detailed Description of the Drawings
Referring to FIG. 1, there is shown a block diagram illustrating the arrangement of hardware in which the software program which implements the teachings of the invention resides. The invention has particular applicability to MacIntosh computer systems and the MacIntosh operating system environment when working with an external hard disk drive where the probabilities indicate that a larger percentage of the time application programs request data blocks sequentially one block at a time. However, the teachings of the invention may also be employed in other operating system environments where application programmers write programs which have a tendency to request blocks of data from external disk drives one block at a time in sequential order.
In FIG. 1, a central processing unit 10 having a display 12 is coupled to external hard disk drives 14 and 16 and a keyboard 18. The central processing unit has a motherboard (not shown) which includes a large block of random access memory 20. This random access memory 20 is loaded at power up time with the operating system programs, and various support programs such as drivers for the various peripherals including a driver program 26 including a cache management program 28 which are shared by the external hard disk drives 14 and 16. The address space, shown generally at 22, symbolizes the address space of addressable storage locations for random access memory 20. At boot time (typically power up or system reset) a portion of the address space is reserved by the operating system for the driver program which controls input/output transactions with the external hard disk drives 14 and 16. The section of the address space reserved by the operating system for the hard disk driver code is symbolized by block 24. The portion of the driver code which interfaces with the operating system to help manage the input/output transactions with the external hard disk drives 14 and 16 is symbolized by block 26. There is a portion of the driver code 26 which implements the teaching of the invention to manage a multiblock cache to speed up read transactions. This portion is described in the flow chart of FIG. 3A and 3B and the accompanying text description below, and is symbolized by block 28. The object code for an actual program implementing the cache management code for which FIGS. 3A and 3B are a flow chart is given in Appendix A. The block of addresses reserved for the software cache is part of the block 24 of addresses reserved for the driver code and is symbolized by block 30.
The block of address spaces shown at 32 is for storage of other programs such as application programs, operating system programs or other drivers.
The embodiment shown in FIG. 1 uses a single block of address space to implement the cache. The cache 30 is then shared between the external hard drives 14 and 16. In other embodiments, such as the embodiment shown in FIG. 2, the driver code 24 reserves two separate blocks of memory in which separate cache spaces 34 and 36 are implemented.
In the world of personal computer application software in general, and MacIntosh application programs in particular, it has been found statistically that programmers tend to write their application programs to request blocks of data from disk storage sequentially one block at a time with some manipulation being performed on the data between requests. This is not the most efficient way to request data from slower peripherals, especially external hard drives such as drives 14 and 16 and FIGS. 1 and 2. External hard drives are connected to MacIntosh computers via a standard interface known as SCSI. When an input/output transaction must be performed with an external hard drive via the SCSI Interface, approximately 20 milliseconds of overhead time is consumed in setting up the transaction. The actual data transfer to or from the external hard drive takes only approximately 0.5 milliseconds. Accordingly, if data blocks are requested sequentially but only one block is requested at a time, a 20 millisecond overhead penalty is paid for each such request.
The applicants realized that input/output transaction processing can be substantially speeded up by reading data from external hard drives in groups comprising multiple sequential blocks and storing this data in a cache comprised of random access memory on the motherboard. Then, as data blocks are requested individually, software according to the teachings of the invention may first check the cache of data blocks previously stored in random access memory to determine if the requested block is present in the cache and is eligible for reading. If it is, the data may be transferred from the RAM location in the cache to another random access memory location designated by the operating system in the read request and hereafter referred to as the file system buffer. The requesting application program may then have access to the requested data without having to pay the 20 millisecond overhead penalty in getting this block of data from the external hard drive. If, however, the requested block of data is not currently stored in the cache memory, then an input/output transaction must be performed with the external hard drive to obtain the requested block of data, and, under some conditions, the cache is reloaded with a group of sequential blocks of data starting with the requested block number. Generally speaking each block is numbered and contains 512 bytes of data. The external hard disks will each store a plurality of these blocks.
The driver code 26 including the cache management code 28 is stored in block 0 of one of the external hard drives 14 or 16. At boot time, the operating system reads block 0 of the external hard drive and brings in the driver code through the SCSI Interface. The data in block 0 is read by the operating system to learn the address on disk where the driver program starts and how big the driver program is. The operating system then reserves a section in random access memory 20 on the motherboard to store the driver code. The data in block 0 that indicates the size of the driver is modified according to the teachings of the invention to reserve a block of space which is larger than the driver program itself so as to include a block of extra memory which is used by the cache management code 28 in the driver as a cache memory.
In the preferred embodiment, the amount of random access memory reserved for the cache is approximately 2,000 bytes. The driver size data in block 0 may be modified however to reserve a cache of any size. Further, the driver size data in block 0 may be used to reserve 0 multiple blocks of addresses each of which is managed as an independently operating cache assigned to one external disk drive. In the embodiment shown in FIG. 2, cache number 1, represented by the block of addresses at 34 is a lookahead cache storing data from external hard drive 14. Likewise, cache number 2, represented by the block of addresses at 36, serves as a lookahead cache to store data read from the external hard drive 16.
Three sections of the address space, labeled with reference numerals 46, 48 and 50 in FIG. 1 are used by the cache management code 28 to manage the cache address space 30. In a preferred embodiment, sections 46 and 48 of the address space are single bytes while section 50 of the address space is a 4 byte group. Section 46 is used to store the on/off byte. This byte is used as a flag by the cache management code to determine whether the data stored in the cache 30 is valid or not. The data stored in the cache will be valid so long as there has not been a write transaction to the disk from which the data stored in the cache 30 was read subsequent to the time that the data stored in the cache 30 was copied from the corresponding disk. For example, if the cache 30 is currently storing 4 blocks of data read from external hard drive I4 and there has been no write transaction to external hard drive 14 since the time that the 4 blocks were read, then it is assumed that the data on the disk I4 corresponds to the data in the cache 30 and the cache will be deemed "on". If however there has been a write transaction to hard disk 14 subsequent to the time that the 4 blocks of data were read from the external hard drive 14 into the cache 30, then it will be assumed by the cache management code 28 that the data stored in the cache 30 is no longer valid regardless of whether or not the write transactions to the external hard drive 14 actually changed the data on the disk which corresponds to the data in the cache 30. In such a case, the cache will be deemed "off" to prevent the possibility of obsolete data being read from the cache and used by the application program when the actual data on the external hard drive is different.
Section 48 of the address space is the identification code used by the SCSI Interface to identify the external hard drive from which the data stored in the cache 30 was read. In the embodiment shown in FIG. 2, where each cache is assigned to a single external hard drive, section 48 of the address space is not necessary because each cache stores data from only one drive. In the embodiment of FIG. 1, when the central processing unit 10 addresses external hard drive 16 after the cache 30 has been loaded with data from external hard drive 14, the mismatch in identification codes between the identification code in the I/O request and the identification code in section 48 of the address space will usually cause the cache 30 to be flushed and refilled with new data from external hard drive 16 and will always prevent the data in the cache from being read. The preferred embodiment is shown in FIG. 1 since it is rare to switch between external hard drives during execution of any particular application program.
Section 50 of the address space stores a 4 byte group which is the address on the hard drive which corresponds to the first block of data stored in the cache 30.
Referring to FIGS. 3A and 3B, there is shown a flow chart of the cache management code 28 of the embodiment of FIG. 1. The first step carried out by the cache management code is to get the starting address of the block of addresses reserved for the cache memory. This step is symbolized by block 60, and results in return of the address in random access memory 20 for the on/off byte 46 which represents the first byte in the cache 30. This is done by getting the address in random access memory 20 for the first byte of the driver code 26 and calculating the address for the on/off byte 46. To do this the cache management code 28 asks the driver code 26 where the driver code is located in the address space 22. The driver 26 then requests this information from the operating system. The operating system knows where in the address space each program is located, and returns the address of the first byte of the driver code 26 to the driver. Because the length of the driver code is known, the address for the on/off byte 46 can be calculated by adding the length of the driver code to the absolute address of the first byte of the driver received from the operating system.
Next, the test of block 62 is performed to determine whether the number of blocks involved in the I/O transaction is greater than the cache size. Typically, a 2,000 byte cache will be capable of storing 4 blocks of data of about 500 bytes per block. The actual size of each block is 512 bytes so the actual size of a 4 block cache will be 4 times 512. If a read request to an external hard drive calls for more than 5 blocks for a 4 block cache, the test of 62 causes the cache to be bypassed and causes the data to be retrieved directly from the hard disk. This result is symbolized by path 64. If the number of blocks needed is less than the cache size, processing flows along path 66 to the test of block 68.
Block 68 determines whether or not the I/O request is a read or write transaction. If the request is a write transaction, processing flows to block 70 where the cache is turned off. The reason for this is that if a write transaction is to be performed to alter the data stored on the hard disk, the data stored in the cache is thereby rendered questionable. Block 70 represents the process of addressing the on/off byte 46 and altering the data stored there to indicate an off status.
After turning the cache off, block 72 is performed representing the process of writing the desired data to the hard disk. Preferably this is done via the SCSI Interface but the teachings of the invention are also applicable to internal Winchester disk drives as well as to interfaces to other types of data storage peripherals.
If step 68 determines that the I/O request is a read transaction, processing flows on path 74 to the test of block 76.
The test of block 76 determines whether the cache is on. This means that the on/off byte 46 is read to determine whether or not the data stored in the cache 30 is valid or not. If it is determined that the cache is turned off, processing flows via path 78 to the test of block 80.
The test of block 80 determines whether the number of blocks requested is greater than 2, the reason for this test is to maximize the efficiency of the cache operation. Because of the overhead costs of first moving a 4 block group of data bytes to the cache 30 from the hard disk upon which it is stored and then moving the requested block or blocks of data from the cache memory to the file system buffer designated in the I/O request, it is advantageous to use the cache only for read requests of 1 or 2 blocks of data. If the read request is for more than 2 blocks of data, it is more efficient to obtain the data directly from the hard disk. Thus, if test 80 determines that the read request is for more than 2 blocks of data, processing flows via path 82 and 64 to block 84 on FIG. 3B.
Block 84 represents the process of carrying out an input/output transaction directly with the drive. The process of block 84 is conventional and well known to those skilled in the art. Note that the test of block 80 will only be reached if the I/O request is a read transaction and the cache is turned off or there is an ID mismatch (step 104) or the requested data is not in the cache (step 108). This means that the cache must be reloaded with new data. The test of block 80 insures that the cache is reloaded with new data only when the read request is for 2 blocks or less for the reasons detailed above. In such a case processing flows via path 86 to the test of block 88 in FIG. 3B. The purpose of the test symbolized by block 88 is to prevent use of the cache if the requested block number is within a "guard band" symbolizing the 4 blocks closest to end of the blocks stored on the hard disk (for a 4 block cache). The test of block 88 is a calculation. The calculation compares the block number for the starting block in the read request to the range defined by the largest numbered block on the disk and by the block number equal to the highest numbered block on the disk minus the number of blocks in the cache. Therefore, if there are 2,000 blocks stored on a disk, and the cache size is 4 blocks, then the guard band will be from block number 1997 to block 2000. If the requested block number is 1998, processing flows via path 90 and path 64 to block 84 where the requested blocks are read directly from the disk.
If the requested block is not within the guard band, processing proceeds to block 92 where the cache is turned on by addressing the on/off byte 46 and altering the data therein to indicate an on status.
Next, a number of blocks of data equalling the maximum number of blocks which can be stored in the cache are read from the hard disk addressed by the read request in a conventional manner as symbolized by block 94. These blocks are written into the cache 30 as symbolized by block 96. Finally, in block 98, the requested block or blocks of data are taken out of the cache 30 and written to the designated file system buffer specified in the read request.
Returning to the consideration of FIG. 3A, the path 102 from the test of block 76 is taken only if the cache is turned on and the I/O request is a read transaction. If such is the case, the test of block 104 is performed wherein a comparison is made between the identification code of the drive specified in the read request is compared to the identification code of the drive from which the data currently stored in the cache was obtained. If there is a match, path 106 is taken to the test symbolized by block 108. If there is no match, path 110 is taken to the test of block 80, and processing proceeds as described above for block 80 and the other blocks associated therewith. If the test of block 104 indicates there is an identification mismatch, then the data stored is cache is not eligible for use and the cache must be reloaded. This step is also necessary for the multiple cache embodiment illustrated in FIG. 2, especially if multiple caches are used for a single drive. For each of these cache management programs, the step 60 symbolizes the process of getting the starting address of the appropriate cache to which the program is associated. In alternative embodiments, a single cache management program can be shared between the multiple caches and a suitable branching step matching the drive identification and the read request to the appropriate corresponding cache and the corresponding cache management program will be added.
The test of block 108 determines whether the requested block in the read request is stored in the cache. If the answer is no, processing proceeds along path 110 to the test of block 80 for purposes of reloading the cache. If the answer is yes, processing proceeds along path 112 to block 114 wherein the requested blocks of data are retrieved from the cache 30. The requested blocks of data are then put in the designated file system buffer specified in the read request as symbolized by block 116.
Although the invention has been described in terms of preferred and alternative embodiments disclosed herein, those skilled in the art will appreciate numerous modification, additions or deletions which may be made without departing from the spirit and scope of the invention. All such additions, modifications and deletions are intended to be included within the scope of the claims appended hereto.