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.