In
computer science and
software engineering, busy-waiting, busy-looping or spinning is a technique in which a
process repeatedly checks to see if a condition is true, such as whether
keyboard input or a
lock is available. Spinning can also be used to generate an arbitrary time delay, a technique that was necessary on systems that lacked a method of waiting a specific length of time. Processor speeds vary greatly from computer to computer, especially as some processors are designed to dynamically adjust speed based on current workload. Consequently, spinning as a time-delay technique can produce unpredictable or even inconsistent results on different systems unless code is included to determine the time a processor takes to execute a "do nothing"
loop, or the looping code explicitly checks a
real-time clock.
In most cases spinning is considered an
anti-pattern and should be avoided,
as processor time that could be used to execute a different
task is instead wasted on useless activity. Spinning can be a valid strategy in certain circumstances, most notably in the implementation of
spinlocks within operating systems designed to run on
SMP
SMP may refer to:
Organisations
* Scale Model Products, 1950s, acquired by Aluminum Model Toys
* School Mathematics Project, UK developer of mathematics textbooks
* '' Sekolah Menengah Pertama'', "junior high school" in Indonesia
* Shanghai Mun ...
systems.
Example C code
The following
C code examples illustrate two threads that share a global
integer i. The first thread uses busy-waiting to check for a change in the value of i:
#include
#include
#include
#include
#include
/* i is global, so it is visible to all functions. It makes use of the special
* type atomic_int, which allows atomic memory accesses.
*/
atomic_int i = 0;
/* f1 uses a spinlock to wait for i to change from 0. */
static void *f1(void *p)
static void *f2(void *p)
int main()
In a use case like this, one can consider using
C11 C11, C.XI, C-11 or C.11 may refer to:
Transport
* C-11 Fleetster, a 1920s American light transport aircraft for use of the United States Assistant Secretary of War
* Fokker C.XI, a 1935 Dutch reconnaissance seaplane
* LET C-11, a license-build var ...
's
condition variables.
Alternatives
Most operating systems and threading libraries provide a variety of
system calls that will
block the process on an event, such as lock acquisition, timer changes,
I/O availability or
signals. Using such calls generally produces the simplest, most efficient, fair, and
race-free result. A single call checks, informs the scheduler of the event it is waiting for, inserts a
memory barrier where applicable, and may perform a requested I/O operation before returning. Other processes can use the CPU while the caller is blocked. The scheduler is given the information needed to implement
priority inheritance or other mechanisms to avoid
starvation
Starvation is a severe deficiency in caloric energy intake, below the level needed to maintain an organism's life. It is the most extreme form of malnutrition. In humans, prolonged starvation can cause permanent organ damage and eventually, dea ...
.
Busy-waiting itself can be made much less wasteful by using a delay function (e.g.,
sleep()
) found in most operating systems. This puts a thread to sleep for a specified time, during which the thread will waste no CPU time. If the loop is checking something simple then it will spend most of its time asleep and will waste very little CPU time.
In programs that never end (such as operating systems), infinite busy waiting can be implemented by using unconditional jumps as shown by this
NASM syntax:
jmp $. The CPU will unconditionally
jump to its
own position forever. A busy wait like this can be replaced with:
sleep:
hlt
jmp sleep
For more information, see
HLT (x86 instruction).
Appropriate usage
In low-level programming, busy-waits may actually be desirable. It may not be desirable or practical to implement interrupt-driven processing for every hardware device, particularly those that are seldom accessed. Sometimes it is necessary to write some sort of control data to hardware and then fetch device status resulting from the write operation, status that may not become valid until a number of machine cycles have elapsed following the write. The programmer could call an operating system delay function, but doing so may consume more time than would be expended in spinning for a few clock cycles waiting for the device to return its status.
See also
*
Polling (computer science)
*
Non-blocking I/O
*
Spinlock
*
BogoMips
*
volatile variable
*
Synchronization (computer science)
*
Peterson's algorithm
References
{{Reflist
External links
Descriptionfrom The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
*Article
User-Level Spin Locks - Threads, Processes & IPC by
Gert Boddaert
Gert is a mainly masculine given name (Hypocorism, short form of Gerrit, Gerard, etc.) with some female bearers (short for Gertrude (given name), Gertrude).
Since 1993 no one in Sweden has been baptised as Gert according to the Swedish Bureau o ...
Austria SpinLock Class Reference
Anti-patterns
Concurrency control
Articles with example C code