  We present the checkpointing scheme of Abacus, an $N$-body simulation code
that allocates all persistent state in POSIX shared memory, or ramdisk.
Checkpointing becomes as simple as copying files from ramdisk to external
storage. The main simulation executable is invoked once per time step, memory
mapping the input state, computing the output state directly into ramdisk, and
unmapping the input state. The main executable remains unaware of the concept
of checkpointing, with the top-level driver code launching a file-system copy
between executable invocations when a checkpoint is needed. Since the only
information flow is through files on ramdisk, the checkpoint must be correct so
long as the simulation is correct. However, we find that with multi-GB of
state, there is a significant overhead to unmapping the shared memory. This can
be partially mitigated with multithreading, but ultimately, we do not recommend
shared memory for use with a large state.
