A key concept to almost all microkernels is to break down one larger kernel into a set of communicating "servers". Instead of having one larger program controlling all of the hardware of a computer system, the various duties are apportioned among smaller programs that are given rights to control different parts of the machine. For example, one server can be given control of the networking hardware, while another has the task of managing the hard disk drives. Another server would handle the file system, calling both of these lower-level servers. User applications ask for services by sending "messages" to these servers, using some form of inter-process communications (IPC), in contrast to asking the kernel to do this work via a "system call" (syscall) or "trap".