1. In discussing software algorithms for mutual exclusion, we noted that optimizing compilers and out-of-order execution by processors could invalidate most of these algorithms because such “optimization” does not take into account that the value of a shared variable can be changed by something other than the immediately evident code. This overly-simplistic characterization also happens with I/O devices, especially simple programmed I/O where data or control register contents changes as a result of the state of the device, not as a consequence of execution of processor instructions, as well as with clocks where the current time register changes continually. It also happens when DMA is used to input blocks of data, which is slightly more complex because the addresses whose value changes are not evident literally. What does this imply about device drivers?