||This article has multiple issues. Please help improve it or discuss these issues on the talk page.
Processor affinity or CPU pinning enables the binding and un-binding of a process or thread to a physical CPU or a range of CPUs, so that the process or thread in question will run only on the CPU or range of CPUs in question, rather than being able to run on any CPU. It is a modification of the native central queue scheduling algorithm in a symmetric multiprocessing operating system. Each item in the queue has a tag indicating its preferred / kin processor. At allocation time, each task is allocated to its kin processor in preference to others.
Processor affinity takes advantage of the fact that some remnants of a process may remain in one processor's state (in particular, its cache) from the last time the process ran. Scheduling it to run on the same processor the next time could result in the process's running more efficiently by reducing performance-degrading situations such as cache misses. A practical example might be running multiple instances of an application which does not use multiple threads, such as some graphics-rendering software. Processor affinity is meant to increase system efficiency, overall.
Scheduling algorithm implementations vary in adherence to processor affinity. Under certain circumstances some implementations will allow a task to change to another processor if this is deemed to be most efficient. This may be the case if two processor-intensive tasks (A and B) have affinity to one processor while another processor lies unused. Many algorithms would shift task B to the second processor in order to maximize processor use. Task B would then acquire affinity with the second processor while task A would continue to have affinity with the original processor.
Processor affinity can effectively reduce cache problems but it does not curb the persistent load-balancing problem. Further, processor affinity becomes more complicated in systems with non-uniform architectures. For example, a system with two dual-core hyper-threaded CPUs presents a challenge to a scheduling algorithm. There is complete affinity between two virtual CPUs implemented on the same core via hyper-threading, partial affinity between two cores on the same physical chip (as the cores share some, but not all, cache), and no affinity between separate physical chips.
As other resources are also shared, processor affinity alone cannot be used as the basis for CPU dispatching. If a process has recently run on one virtual hyper-threaded CPU in a given core, and that virtual CPU is currently busy but its partner is not, cache affinity would suggest that the process should be dispatched to the idle partner. However, the two virtual CPUs compete for essentially all computing, cache, and memory resources. It would typically be more efficient in this case to dispatch the process to a different core or CPU if one is available. This would likely incur a penalty when process repopulates the cache, but overall performance would likely be higher as the process would not have to compete for resources within the CPU.
Specific operating systems
On Linux, the CPU affinity of a process can be altered with the taskset(1) program and the sched_setaffinity(2) system call, and the affinity of a thread with one of the library functions pthread_setaffinity_np(3) and pthread_attr_setaffinity_np(3).
NetBSD 5.0, FreeBSD 7.2 and later versions can use pthread_setaffinity_np and pthread_getaffinity_np. In NetBSD, the psrset utility to set a thread's affinity to a certain CPU set. In FreeBSD, cpuset utility is used to create CPU sets and to assign processes to these sets.
On Windows NT, thread and process CPU affinities can be set separately by using SetThreadAffinityMask and SetProcessAffinityMask API calls or via the Task Manager interface (for process affinity only).
- White Paper - Processor Affinity - From tmurgent.com. Accessed 2007-07-06.
- taskset - From LinuxCommand.org. Accessed 2007-07-06.
- dplace.1 - From sgi.com. Accessed 2007-07-06.
- affinity(3) - NetBSD manpage
- psrset(8) - NetBSD manpage
- cpuset(1) - FreeBSD manpage
- SetThreadAffinityMask - MSDN Library
- SetProcessAffinityMask - MSDN Library