PIO, or programmed input-output is a method of data transfer between a CPU and a peripheral device.
In contrast to DMA, the CPU is involved in every transaction and the transfer is always initiated by the CPU, generally by an instruction in a program. It commonly uses IO mapped memory.
PIO Limitations
Reading/writing large amounts of data slow the CPU, since the CPU transfers one word at a time.
Since a controller device is much slower than the CPU, the CPU is mostly waiting for the controller.
This is because the I/O controller cannot initiate communication as PIO is initiated by the CPU. This problem can technically be resolved with polling, constantly asking the devices for updates, however this also has its limitations.
Uses
Non-testable
Most peripherals now use other forms of interfacing, including DMA. Some examples of PIO usage include legacy ports and interfaces like PATA, older keyboards and mouses (PS/2) and legacy MIDI. For the most part it’s now only used in very specific use cases usually for micro controllers.