There are two kinds of prefetch requests: (i) synchronous prefetch, and
(ii) asynchronous prefetch. A synchronous prefetch is when on a miss
on page , we prefetch
extra pages beyond page
.
It merely extends the extent of the client's read request to include more pages.
On the other hand, an asynchronous prefetch is when on a cache hit
on a page
, we create a new read request to prefetch
pages
beyond those already in the cache. In each set of
prefetched pages, a
trigger page is identified at a trigger distance of
from the
end of the prefetched set of pages (Figure 1). When
, the trigger is set on
the last page of the prefetched set. When a trigger page is hit, an
asynchronous prefetch is requested for the next set of
sequential pages.
Unlike synchronous prefetching, asynchronous prefetching enables us to always
stay ahead of sequential read requests and for suitable values of
and
,
never incur a read miss after the initial miss for a sequential stream [17].
Asynchronous prefetching is always used in conjunction with some form of
synchronous prefetching to prefetch the initial set of pages.
Notice that asynchronous prefetching creates new read requests on its own and, therefore, in cases where prefetches are wasted, asynchronous prefetching will have more disk seeks on the backend for the same workload than synchronous prefetching. However, for larger prefetches on data striped across disks, even synchronous prefetches will result in new read requests.
As a guideline, asynchronous prefetching should be avoided in cases where prefetch wastage is high.