I/O units span a broad range of sophistication. An elementary von Neumann implementation requires that the CPU directly controls the I/O unit. The CPU must repeatedly test the status of the device to see if the requested operation has been finished. A major advance in the design of the I/O unit was made possible by the addition of interrupts to the computer. This feature facilitated multiprogramming, with its associated increases in efficiency and productivity. In many applications today, large amounts of data must be transferred and many interrupts must be processed. The performance of the I/O unit in systems running these applications is critical. In transaction processing, for instance, the speed and efficiency of the I/O unit is more critical than the speed of the ALU.