Modern hardware and operating systems follow a very common pattern of allocating some unit of hardware only at the very instant where the program comes to the point of really needing it. Demand paging brings the page to RAM only after the computation as come to the instruction that cannot be completed without that page.
Examples of this pattern are:
- Caches
- Modern microprocessors provide 2 or 3 levels of cache for RAM data.
- Register Windows
- The hardware detects the demand and the software allocates the window.
- TLB entries
- The hardware detects the demand and the software responds on some systems and on others the hardware consults RAM.
- Ram Pages
- When the TLB cannot be filled by the simple RAM fill algorithm, more general software takes over to try to satisfy the faulting program.
Eventually a RAM page will be found or allocated to satisfy the program.
- OS data structures
- In Keykos and most modern OSes many data structures with no direct relation to hardware are allocated this way.
This structures require RAM to hold them and this allocation can cause delays that may affect the program making the demand.
In each of these cases the program is affected by being delayed in execution.
If the program can sense the time by reading a clock or sensing the progress of some other regular process, it is affected.
Adaptive formats are wide spread in other areas too.
There are several reasons to provide reproducible environments:
- To replay executions of code that fail to understand the cause of failure,
- To thwart covert channel listeners,
- To regenerate a release of software previously delivered to a customer.
You may have committed to its behavior and may even have signed it.