By implementing file system caching within the operating system,
applications are required to cede to the OS a degree of control over
memory utilization and IO scheduling. This dissertation explores ways
in which applications can rediscover information hidden by the
file system buffer cache and reclaim some of the control ceded
to it. We find that this can be achieved without a wholesale redesign
of either the operating systems or applications concerned.
We present Dust
a tool to automatically determine the buffer cache replacement
policy of an operating system. We describe a cache-aware web
server. Using the information gained through Dust, our
cache-aware web server is able to infer the contents of the buffer
cache. It uses this information to schedule web connections on an
in-cache-first basis, improving throughput and response time.
Implicit information can be imprecise. To address this limitation, we modify
Linux and NetBSD to expose a list of pages which are about
to be evicted. This explicit information is always
accurate. We present Inforeplace, a user library which observes
that list and touches pages that should remain cached, allowing applications
to transform the kernel policy into one of the application's choice.
Some applications, such as those that
use write-ahead logging, require control over the order in which data
is written to disk. We propose two new interfaces by which
applications can express write ordering constraints to the operating
system. File system barriers introduce the
barrier() system call. The operating
system guarantees that no write operations will be reordered
across a barrier. Asynchronous graphs allows
applications to specify ordering constraints on a per-write-operation
basis. Both would be difficult to implement with only information.