Concurrency in the server can be implemented in several different ways. One technique is to use a single process and offer apparent concurrency. In this scheme, when a connection is made on the well-known port, the new socket is added to the list of sockets that are listened to using the `select' call. This means that whilst multiple clients can be connected, `read' and `write' calls can only happen one at a time. A crashed client could still cause deadlock2.9 and many of the benefits of concurrency are lost.
True concurrency can be achieved by the use of multiple processes or threads. Threads are lightweight processes that are quicker to create than processes, and share the same memory. With regards to performance, threads would be the better choice for the server, but it is written to be multi-process. This decision was made largely due to the development time-scale, and considerations of portability as all Unix systems support forking2.10. Forking still makes good use of multiple processors and so scales well for large server systems.