A system with multiple identical CPUs having equal access to memory and to the I/O subsytem(s). Contrast NUMA and AsymmetricMultiProcessing.

It is an accepted rule of thumb that due to the InterProcessCommunication "friction" required to synchronize tasks across CPUs, each additional CPU contributes about 1/6 less performance than the previous one. As a result, fitting more than four CPUs in a machine tends to cost heaps of money with surprisingly little to show for it.

On the OperatingSystem level, there is a wide span for the degree of symmetry expressed. On a fully symmetric system, any CPU may run any userland process, any kernel process, and any interrupt handler. This is rare in practice due to limitations in various platforms -- most of the time, the interrupt handler can only be run by the first CPU. In simpler OperatingSystems, this is also the only CPU that may kernel tasks. In yet simpler system designs, even user processes are assigned to a fixed CPU and cannot move among CPUs.

In practice, a less symmetric system OperatingSystem design may not be a drawback. It is desirable to tie processes to a certain CPU as long the system load is evenly distributed among CPUs, because this maximizes the efficiency of CPU caches. Even in a completely symmetric system, an intelligently written scheduler will take this into account and try not to shuffle tasks around needlessly.

Applications have to be explicitly designed to exploit the additional processing power available in an SMP system. This is not often the case. It only commonly applies to multithreaded applications, which are common in the Java world where the GUI, GarbageCollection, and application logic will often run on sepreate CPUs. (What else can you do when all your I/O is blocking? At least there are nonblocking I/O classes in more recent Java versions, but of course they add yet another layer to the already byzantine library.)