For prefetchable files, the AASFP kernel turns off 
Linux's sequential prefetching mechanism  
and supports application-specific prefetching. 
Whenever an AASFP application's computation thread makes a disk access call,
the kernel first satisfies this access with data already prefetched and stored
in the file buffer, then performs asynchronous disk read for a certain number of 
requests in the kernel-level prefetch queue.
That is, physical disk prefetching is triggered by disk accesses that
the computation thread makes.   
This scheme works well
for applications with periodic I/O calls. However, if an application
performs a long computation followed by a burst of I/O, physical disk prefetch operations  
may be invoked too late to mask all disk I/O delay.  
Therefore AASFP uses a timer-driven approach to schedule disk prefetch operations. 
That is, every time   
Linux's timer interrupt occurs (roughly every 
), the CPU  
scheduler will assign a higher priority to the prefetch thread
so that the prefetch thread can get scheduled sooner in the near future if  
it does not find any entry in the kernel-level
prefetch queue. Furthermore it will check whether there are prefetch 
entries in the kernel-level prefetch queue that should be moved to the disk queue
according to an algorithm described next. 
Before a request in the kernel-level prefetch queue is serviced, the 
kernel checks whether this request is still valid by comparing its
prefetch call ID with the number of disk I/O calls that the computation
thread has made up to that point.
If the prefetch entry's call ID 
is smaller, the entry is invalid 
and the kernel just deletes it. For a valid  
entry, the kernel dynamically determines whether to service that entry
at that moment. To make this decision, 
the kernel maintains the current number of entries in the disk queue (
),
the average time taken to service a disk request (
), and
the average computation time between two consecutive disk I/O calls for the 
application (
). Suppose at time 
, the current disk I/O call's ID is 
,
and the prefetch call ID for the entry is 
. Then, the
time available before the application accesses the 
block corresponding to the 
th prefetch call is approximately 
. 
A prefetch request that is sent to the disk queue at 
 will
be expected to be completed at time 
. Therefore the kernel should service 
the prefetch request only if