So far we have considered machines which have only a single processor (known as the Central Processor Unit). Becoming more common these days are multi-processor machines which may have a number of processors (for example four or thirty two) which may provide true concurrency to multiple tasks running on the machine. On these machines the scheduler will arrange for the execution of processes to occur in a manner selected to take maximum advantage of the available processing capacity. Asymmetric multiprocessing (ASMP) operating systems typically select one processor to run operating system code, with the other processors running user jobs. Problems with such systems include a lack of portability of the operating system to other platforms. Symmetric multiprocessing systems (SMPs), which include Linux, Sun's Solaris and Windows NT each allow the operating system to run on any or all of the available processors, sharing memory between them. The central unit for execution on such machines is the thread, with multiple threads of a single process having the possibility to be spread across multiple processors. The scheduling task on an SMP computer can become extremely complex.