However, the implementation of pipes as memory buffers meant data was being copied from program to program, a time-consuming and resource intensive operation. This made the pipe concept unsuitable for tasks where quick turnaround or low latency was needed, as is the case in most device drivers. The operating system kernel and most core functionality was instead written as a single large program. As the operating system added new functionality (computer networking, for instance), the size and complexity of the kernel grew, too.