Ideally, handle all I/O devices in the same way; Both in the OS and in user applications, problem is diversity of I/O devices, especially different access methods and vastly different data rates, generality often compromises efficiency, hide most of the details of device I/O in lower-level routines so that processes and upper levels see devices in general terms such as read, write, open, close, lock, unlock