Multiprogramming requires both hardware capability (independent I/O units that don't block the CPU) AND software (the operating system to manage multiple processes). The OS switches the CPU between processes when one does I/O, while independent I/O units allow the CPU to continue executing other processes instead of waiting.