software transactional memory
   HOME

TheInfoList



OR:

In
computer science Computer science is the study of computation, automation, and information. Computer science spans theoretical disciplines (such as algorithms, theory of computation, information theory, and automation) to Applied science, practical discipli ...
, software
transactional memory In computer science and engineering, transactional memory attempts to simplify concurrent programming by allowing a group of load and store instructions to execute in an atomic way. It is a concurrency control mechanism analogous to database transa ...
(STM) is a
concurrency control In information technology and computer science, especially in the fields of computer programming, operating systems, multiprocessors, and databases, concurrency control ensures that correct results for Concurrent computing, concurrent operations a ...
mechanism analogous to
database transaction A database transaction symbolizes a unit of work, performed within a database management system (or similar system) against a database, that is treated in a coherent and reliable way independent of other transactions. A transaction generally rep ...
s for controlling access to
shared memory In computer science, shared memory is memory that may be simultaneously accessed by multiple programs with an intent to provide communication among them or avoid redundant copies. Shared memory is an efficient means of passing data between progr ...
in
concurrent computing Concurrent computing is a form of computing in which several computations are executed '' concurrently''—during overlapping time periods—instead of ''sequentially—''with one completing before the next starts. This is a property of a syst ...
. It is an alternative to lock-based synchronization. STM is a strategy implemented in software, rather than as a hardware component. A transaction in this context occurs when a piece of code executes a series of reads and writes to shared memory. These reads and writes logically occur at a single instant in time; intermediate states are not visible to other (successful) transactions. The idea of providing hardware support for transactions originated in a 1986 paper by Tom Knight. The idea was popularized by
Maurice Herlihy Maurice Peter Herlihy (born 4 January 1954) is a computer scientist active in the field of multiprocessor synchronization. Herlihy has contributed to areas including theoretical foundations of wait-free synchronization, linearizable data structu ...
and J. Eliot B. Moss.Maurice Herlihy and J. Eliot B. Moss. ''Transactional memory: architectural support for lock-free data structures.'' Proceedings of the 20th annual international symposium on Computer architecture (ISCA '93). Volume 21, Issue 2, May 1993. In 1995 Nir Shavit and Dan Touitou extended this idea to software-only transactional memory (STM). Since 2005, STM has been the focus of intense research and support for practical implementations is growing.


Performance

Unlike the locking techniques used in most modern multithreaded applications, STM is often very
optimistic Optimism is an attitude reflecting a belief or hope that the outcome of some specific endeavor, or outcomes in general, will be positive, favorable, and desirable. A common idiom used to illustrate optimism versus pessimism is a glass filled wi ...
: a thread completes modifications to shared memory without regard for what other threads might be doing, recording every read and write that it is performing in a log. Instead of placing the onus on the writer to make sure it does not adversely affect other operations in progress, it is placed on the reader, who after completing an entire transaction verifies that other threads have not concurrently made changes to memory that it accessed in the past. This final operation, in which the changes of a transaction are validated and, if validation is successful, made permanent, is called a ''commit''. A transaction may also ''abort'' at any time, causing all of its prior changes to be rolled back or undone. If a transaction cannot be committed due to conflicting changes, it is typically aborted and re-executed from the beginning until it succeeds. The benefit of this optimistic approach is increased concurrency: no thread needs to wait for access to a resource, and different threads can safely and simultaneously modify disjoint parts of a data structure that would normally be protected under the same lock. However, in practice, STM systems also suffer a performance hit compared to fine-grained lock-based systems on small numbers of processors (1 to 4 depending on the application). This is due primarily to the overhead associated with maintaining the log and the time spent committing transactions. Even in this case performance is typically no worse than twice as slow. Advocates of STM believe this penalty is justified by the conceptual benefits of STM. Theoretically, the
worst case In computer science, best, worst, and average cases of a given algorithm express what the resource usage is ''at least'', ''at most'' and ''on average'', respectively. Usually the resource being considered is running time, i.e. time complexity, b ...
space and time complexity of ''n'' concurrent transactions is ''O''(''n''). Actual needs depend on implementation details (one can make transactions fail early enough to avoid overhead), but there will also be cases, albeit rare, where lock-based algorithms have better time complexity than software transactional memory.


Conceptual advantages and disadvantages

In addition to their performance benefits, STM greatly simplifies conceptual understanding of multithreaded programs and helps make programs more maintainable by working in harmony with existing high-level abstractions such as objects and modules. Lock-based programming has a number of well-known problems that frequently arise in practice: * Locking requires thinking about overlapping operations and partial operations in distantly separated and seemingly unrelated sections of code, a task which is very difficult and error-prone. * Locking requires programmers to adopt a locking policy to prevent
deadlock In concurrent computing, deadlock is any situation in which no member of some group of entities can proceed because each waits for another member, including itself, to take action, such as sending a message or, more commonly, releasing a lo ...
,
livelock In concurrent computing, deadlock is any situation in which no member of some group of entities can proceed because each waits for another member, including itself, to take action, such as sending a message or, more commonly, releasing a loc ...
, and other failures to make progress. Such policies are often informally enforced and fallible, and when these issues arise they are insidiously difficult to reproduce and debug. * Locking can lead to
priority inversion In computer science, priority inversion is a scenario in scheduling in which a high priority task is indirectly superseded by a lower priority task effectively inverting the assigned priorities of the tasks. This violates the priority model that h ...
, a phenomenon where a high-priority thread is forced to wait for a low-priority thread holding exclusive access to a resource that it needs. In contrast, the concept of a memory transaction is much simpler, because each transaction can be viewed in isolation as a single-threaded computation. Deadlock and livelock are either prevented entirely or handled by an external transaction manager; the programmer need hardly worry about it. Priority inversion can still be an issue, but high-priority transactions can abort conflicting lower priority transactions that have not already committed. On the other hand, the need to abort failed transactions also places limitations on the behavior of transactions: they cannot perform any operation that cannot be undone, including most I/O. Such limitations are typically overcome in practice by creating buffers that queue up the irreversible operations and perform them at a later time outside of any transaction. In
Haskell Haskell () is a general-purpose, statically-typed, purely functional programming language with type inference and lazy evaluation. Designed for teaching, research and industrial applications, Haskell has pioneered a number of programming lan ...
, this limitation is enforced at compile time by the type system.


Composable operations

In 2005, Tim Harris,
Simon Marlow Simon Marlow is a British computer programmer, author, and co-developer of the Glasgow Haskell Compiler (GHC). He and Simon Peyton Jones won the SIGPLAN Programming Languages Software Award in 2011 for their work on GHC. Marlow's book Parallel ...
,
Simon Peyton Jones Simon Peyton Jones (born 18 January 1958) is a British computer scientist who researches the implementation and applications of functional programming languages, particularly lazy functional programming. Education Peyton Jones graduated fr ...
, and
Maurice Herlihy Maurice Peter Herlihy (born 4 January 1954) is a computer scientist active in the field of multiprocessor synchronization. Herlihy has contributed to areas including theoretical foundations of wait-free synchronization, linearizable data structu ...
described an STM system built on
Concurrent Haskell Concurrent Haskell extends Haskell 98 with explicit concurrency. Its two main underlying concepts are: * A primitive type MVar α implementing a bounded/single-place asynchronous channel, which is either empty or holds a value of type α. * The ...
that enables arbitrary atomic operations to be composed into larger atomic operations, a useful concept impossible with lock-based programming. To quote the authors:
Perhaps the most fundamental objection ..is that ''lock-based programs do not compose'': correct fragments may fail when combined. For example, consider a hash table with thread-safe insert and delete operations. Now suppose that we want to delete one item A from table t1, and insert it into table t2; but the intermediate state (in which neither table contains the item) must not be visible to other threads. Unless the implementor of the hash table anticipates this need, there is simply no way to satisfy this requirement. ..In short, operations that are individually correct (insert, delete) cannot be composed into larger correct operations.
—Tim Harris et al., "Composable Memory Transactions", Section 2: Background, pg.2
With STM, this problem is simple to solve: simply wrapping two operations in a transaction makes the combined operation atomic. The only sticking point is that it is unclear to the caller, who is unaware of the implementation details of the component methods, when it should attempt to re-execute the transaction if it fails. In response, the authors proposed a retry command which uses the transaction log generated by the failed transaction to determine which memory cells it read, and automatically retries the transaction when one of these cells is modified, based on the logic that the transaction will not behave differently until at least one such value is changed. The authors also proposed a mechanism for composition of ''alternatives'', the orElse function. It runs one transaction and, if that transaction does a ''retry'', runs a second one. If both retry, it tries them both again as soon as a relevant change is made. This facility, comparable to features such as the POSIX networking ''select()'' call, allows the caller to wait on any one of a number of events simultaneously. It also simplifies programming interfaces, for example by providing a simple mechanism to convert between blocking and nonblocking operations. This scheme has been implemented in the
Glasgow Haskell Compiler The Glasgow Haskell Compiler (GHC) is an open-source native code compiler for the functional programming language Haskell. It provides a cross-platform environment for the writing and testing of Haskell code and it supports numerous extensions, ...
.


Proposed language support

The conceptual simplicity of STMs enables them to be exposed to the programmer using relatively simple language syntax. Tim Harris and Keir Fraser's "Language Support for Lightweight Transactions" proposed the idea of using the classical ''conditional critical region'' (CCR) to represent transactions. In its simplest form, this is just an "atomic block", a block of code which logically occurs at a single instant: ''// Insert a node into a doubly linked list atomically'' atomic When the end of the block is reached, the transaction is committed if possible, or else aborted and retried. (This is simply a conceptual example, not correct code. For example, it behaves incorrectly if node is deleted from the list during the transaction.) CCRs also permit a ''guard condition'', which enables a transaction to wait until it has work to do: atomic (queueSize > 0) If the condition is not satisfied, the transaction manager will wait until another transaction has made a ''commit'' that affects the condition before retrying. This
loose coupling In computing and systems design, a loosely coupled system is one # in which components are weakly associated (have breakable relationships) with each other, and thus changes in one component least affect existence or performance of another comp ...
between producers and consumers enhances modularity compared to explicit signaling between threads. "Composable Memory Transactions" took this a step farther with its retry command (discussed above), which can, at any time, abort the transaction and wait until ''some value'' previously read by the transaction is modified before retrying. For example: atomic This ability to retry dynamically late in the transaction simplifies the programming model and opens up new possibilities. One issue is how exceptions behave when they propagate outside of transactions. In "Composable Memory Transactions", the authors decided that this should abort the transaction, since exceptions normally indicate unexpected errors in Concurrent Haskell, but that the exception could retain information allocated by and read during the transaction for diagnostic purposes. They stress that other design decisions may be reasonable in other settings.


Transactional locking

STM can be implemented as a lock-free algorithm or it can use locking. There are two types of locking schemes: In encounter-time locking (Ennals, Saha, and Harris), memory writes are done by first temporarily acquiring a lock for a given location, writing the value directly, and logging it in the undo log. Commit-time locking locks memory locations only during the commit phase. A commit-time scheme named "Transactional Locking II" implemented by Dice, Shalev, and Shavit uses a global version clock. Every transaction starts by reading the current value of the clock and storing it as the read-version. Then, on every read or write, the version of the particular memory location is compared to the read-version; and, if it is greater, the transaction is aborted. This guarantees that the code is executed on a consistent snapshot of memory. During commit, all write locations are locked, and version numbers of all read and write locations are re-checked. Finally, the global version clock is incremented, new write values from the log are written back to memory and stamped with the new clock version. An increasingly utilized method to manage transactional conflicts in
Transactional memory In computer science and engineering, transactional memory attempts to simplify concurrent programming by allowing a group of load and store instructions to execute in an atomic way. It is a concurrency control mechanism analogous to database transa ...
, and especially in STM, is
Commitment ordering Commitment ordering (CO) is a class of interoperable ''serializability'' techniques in concurrency control of databases, transaction processing, and related applications. It allows optimistic (non-blocking) implementations. With the proliferation o ...
(also called Commit ordering; CO). It is utilized for achieving
serializability In concurrency control of databases, Philip A. Bernstein, Vassos Hadzilacos, Nathan Goodman (1987)''Concurrency Control and Recovery in Database Systems''(free PDF download), Addison Wesley Publishing Company, Gerhard Weikum, Gottfried Vossen (200 ...
optimistically (i.e., without blocking upon conflict, and only locking for commit) by "commit order" (e.g., Ramadan et al. 2009,Hany E. Ramadan, Indrajit Roy, Maurice Herlihy, Emmett Witchel (2009)
"Committing conflicting transactions in an STM"
''Proceedings of the 14th ACM SIGPLAN symposium on Principles and practice of parallel programming'' (PPoPP '09),
and Zhang et al. 2006Lingli Zhang, Vinod K.Grover, Michael M. Magruder, David Detlefs, John Joseph Duffy, Goetz Graefe (2006)

United States Patent 7711678, Granted 05/04/2010.
). Serializability is the basis for the correctness of (concurrent transactions and) transactional memory. Tens of STM articles on "commit order" have already been published, and the technique is encumbered by a number of patents. With CO the desired serializability property is achieved by committing transactions only in chronological order that is compatible with the precedence order (as determined by chronological orders of operations in conflicts) of the respective transactions. To enforce CO some implementation of the ''Generic local CO algorithm'' needs to be utilized. The patent abstract quoted above describes a general implementation of the algorithm with a pre-determined commit order (this falls into the category of "CO generic algorithm with real-time constraints").


Implementation issues

One problem with implementing software transactional memory with optimistic reading is that it is possible for an incomplete transaction to read inconsistent state (that is, to read a mixture of old and new values written by another transaction). Such a transaction is doomed to abort if it ever tries to commit, so this does not violate the consistency condition enforced by the transactional system, but it is possible for this "temporary" inconsistent state to cause a transaction to trigger a fatal exceptional condition such as a segmentation fault or even enter an endless loop, as in the following contrived example from Figure 4 of "Language Support for Lightweight Transactions": Provided ''x''=''y'' initially, neither transaction above alters this invariant, but it is possible that transaction A will read ''x'' after transaction B updates it but read ''y'' before transaction B updates it, causing it to enter an infinite loop. The usual strategy for dealing with this is to intercept any fatal exceptions and abort any transaction that is not valid. One way to deal with these issues is to detect transactions that execute illegal operations or fail to terminate and abort them cleanly; another approach is the transactional locking scheme.


Implementations

A number of STM implementations (on varying scales of quality and stability) have been released, many under liberal licenses. These include:


C/C++


TinySTM
a word-based STM. * Th
Lightweight Transaction Library
(LibLTX), a C implementation by Robert Ennals focusing on efficiency and based on his papers "Software Transactional Memory Should Not Be Obstruction-Free" and "Cache Sensitive Software Transactional Memory".
LibCMT
an open-source implementation in C by Duilio Protti based on "Composable Memory Transactions". The implementation also includes
C# binding

TARIFA
is a prototype that brings the "atomic" keyword to C/C++ by instrumenting the assembler output of the compiler.
Intel STM Compiler Prototype Edition
implements STM for C/C++ directly in a compiler (the Intel Compiler) for Linux or Windows producing 32- or 64 bit code for Intel or AMD processors. Implements atomic keyword as well as providing ways to decorate (declspec) function definitions to control/authorize use in atomic sections. A substantial implementation in a compiler with the stated purpose to enable large scale experimentation in any size C/C++ program. Intel has made four research releases of this special experimental version of its product compiler.
stmmap
An implementation of STM in C, based on shared memory mapping. It is for sharing memory between threads and/or processes (not just between threads within a process) with transactional semantics. The multi-threaded version of its memory allocator is in C++.
CTL
An implementation of STM in C, based on TL2 but with many extensions and optimizations. * The TL2 lock-based STM from th
Scalable Synchronization
research group at Sun Microsystems Laboratories, as featured in the DISC 2006 article "Transactional Locking II".
Several implementations by Tim Harris & Keir Fraser
based on ideas from his papers "Language Support for Lightweight Transactions", "Practical Lock Freedom", and an upcoming unpublished work.
RSTM
The
University of Rochester The University of Rochester (U of R, UR, or U of Rochester) is a private research university in Rochester, New York. The university grants undergraduate and graduate degrees, including doctoral and professional degrees. The University of Roc ...
STM written by a team of researchers led by Michael L. Scott.
GCC 4.7
now supports STM for C/C++ directly in the compiler. The feature is still listed as "experimental", but may still provide the necessary functionality for testing. * STM is part of the picotm transaction framework for C


C#


Shielded
A strict and mostly obstruction-free STM for .NET, written in C#. Features include: conditional transactions, commutable (low conflict) operations, transactional collection types, and automatic generation of transactional proxy-subclasses for POCO objects.
STMNet
A pure C#, open-source, lightweight software transactional memory API. * SXM, an implementation of transactions for C# by
Microsoft Research Microsoft Research (MSR) is the research subsidiary of Microsoft. It was created in 1991 by Richard Rashid, Bill Gates and Nathan Myhrvold with the intent to advance state-of-the-art computing and solve difficult world problems through technologi ...

DocumentationDownload page
Discontinued.
LibCMT
an open-source implementation in C by Duilio Protti based on "Composable Memory Transactions". The implementation also includes
C# binding

NSTM
.NET Software Transactional Memory written entirely in C# offering truly nested transactions and even integrating with System.Transactions.
MikroKosmos
A Verification-Oriented Model Implementation of an STM in C#.
ObjectFabric
cf. Java implementations.

A pure C# implementation of software transactional memory.


Clojure


Clojure
has STM support built into the core language


Common Lisp


CL-STM
A multi-platform STM implementation for Common Lisp.
STMX
An open-source, actively maintained concurrency library providing software, hardware and hybrid memory transactions for Common Lisp.


Erlang

*
Mnesia Mnesia is a distributed, soft real-time database management system written in the Erlang programming language. It is distributed as part of the Open Telecom Platform. Description As with Erlang, Mnesia was developed by Ericsson for soft real ...
A distributed, transactional, in-memory DBMS built into Erlang/OTP, that performs the role of STM; Perhaps the oldest implementation of STM in the wild.


F#

* F# has them throug

FSharpX - sample a

F#


Groovy


GPars
- Th
Gpars
framework contains support for STM leveraging the Jav

implementation.


Haskell

* Th
STM
library, as featured i
"Composable Memory Transactions"
is part of the
Haskell Platform The Haskell Platform is a collection of software packages, tools and libraries that create a common platform for using and developing applications in Haskell. With the Haskell Platform, Haskell follows the same principle as Python: "Batteries inc ...
. * Th
DSTM
library, a distributed STM, based on the above library.


Java



s implementation of AtomJava.
JVSTM
implements the concept o
Versioned Boxes
proposed by João Cachopo and António Rito Silva, members of th
Software Engineering Group - INESC-ID
Beginning from version 2.0, JVSTM is completely lock-free.
Deuce
A runtime environment for Java Software Transactional Memory using byte code manipulation.
Multiverse
Is a Java 1.6+ based Software Transactional Memory (STM) implementation that uses Multi Version Concurrency Control (MVCC) as concurrency control mechanism.
DSTM2
Sun Lab's Dynamic Software Transactional Memory Library
ObjectFabric
is an open source implementation for Java and .NET. It can be turned into a Distributed STM through an extension mechanism. Other extensions allow logging, change notification, and persistence.

- A library-based STM written in Scala that additionally provides a Java-focused API to allow use with Runnable and Callable objects.


JavaScript


AtomizeJS
implements Distributed Software Transactional Memory to web browsers with a single NodeJS server to validate the effects of transactions.


OCaml


coThreads
a concurrent programming library of
OCaml OCaml ( , formerly Objective Caml) is a general-purpose programming language, general-purpose, multi-paradigm programming language which extends the Caml dialect of ML (programming language), ML with object-oriented programming, object-oriented ...
, offers STM (originall
STMLib
as a module. Just like any other components in this library, the STM module can be used uniformly with VM-level threads, system threads and processes.


Perl

* STM for Perl 6 has been implemented in
Pugs The Pug is a breed of dog originally from China, with physically distinctive features of a wrinkly, short-muzzled face and curled tail. The breed has a fine, glossy coat that comes in a variety of colors, most often light brown (fawn) or bla ...
via the
Glasgow Haskell Compiler The Glasgow Haskell Compiler (GHC) is an open-source native code compiler for the functional programming language Haskell. It provides a cross-platform environment for the writing and testing of Haskell code and it supports numerous extensions, ...
's STM library.


Python


Fork of CPython with atomic locks
- Armin Rigo explains his patch to CPython i



announcement from Armin Rigo for
PyPy PyPy () is an implementation of the Python programming language. PyPy often runs faster than the standard implementation CPython because PyPy uses a just-in-time compiler. Most Python code runs well on PyPy except for code that depends on CPytho ...
. * *


Ruby


MagLev
is an implementation of the Ruby interpreter built on top of the GemStone/S virtual machine
Concurrent Ruby
is a library providing concurrent features for Ruby, including STM
Ractor::TVar
is an implementation for Ractor and Thread on Ruby 3.0. Lbs


Scala


ScalaSTM
– A draft proposal along with reference implementation CCSTM to be included in the Scala standard library * Akka STM – Th
Akka
framework contains support for STM in both Scala & Java
MUTS
– Manchester University Transactions for ScalaD. Goodman, B. Khan, S. Khan, C. Kirkham, M. Luján and Ian Watson
MUTS: Native Scala Constructs for Software Transactional Memory
Proceedings of the 2011 Scala Days Workshop (Stanford).

ZIO
– Implementation in ZIO inspired by STM API in Haskell.
Cats STM
– An extension o
Cats Effect
with a software transactional memory implementation similar to that in Haskell'
stm
package.


Smalltalk

* GemStone/

A Transactional Memory Object Server for Smalltalk.
STM
for the open-source Smalltalk (MIT Licence)
Pharo


Other languages

* Fortress (programming language), Fortress is a language developed by Sun that use
DSTM2

STM.NET


References

{{Reflist


External links

* Morry Katz
PARATRAN: A transparent transaction based runtime mechanism for parallel execution of Scheme
MIT LCS, 1989 * Nir Shavit and Dan Touitou

''Proceedings of the 14th ACM
Symposium on Principles of Distributed Computing The Symposium on Principles of Distributed Computing (PODC) is an academic conference in the field of distributed computing organised annually by the Association for Computing Machinery (special interest groups SIGACT and SIGOPS). Scope and rela ...
'', pp. 204–213. August 1995. The paper originating STM. * Maurice Herlihy, Victor Luchangco, Mark Moir, and William N. Scherer III
Software Transactional Memory for Dynamic-Sized Data Structures
''Proceedings of the Twenty-Second Annual ACM SIGACT-SIGOPS
Symposium on Principles of Distributed Computing The Symposium on Principles of Distributed Computing (PODC) is an academic conference in the field of distributed computing organised annually by the Association for Computing Machinery (special interest groups SIGACT and SIGOPS). Scope and rela ...
(PODC)'', 92–101. July 2003. * Tim Harris and Keir Fraser
Language Support for Lightweight Transactions
'' Object-Oriented Programming, Systems, Languages, and Applications'', pp. 388–402. October 2003. * Robert Ennals
Software Transactional Memory Should Not Be Obstruction-Free
* Michael L. Scott et al
Lowering the Overhead of Nonblocking Software Transactional Memory
gives a good introduction not only to the RSTM but also about existing STM approaches. * Torvald Riegel and Pascal Felber and Christof Fetzer
A Lazy Snapshot Algorithm with Eager Validation
introduces the first time-based STM. * Dave Dice, Ori Shalev, and Nir Shavit
Transactional Locking II
* Knight, TF
An architecture for mostly functional languages
ACM Lisp and Functional Programming Conference, August 1986. * Knight, TF, System and method for parallel processing with mostly functional languages, US Patent 4,825,360, April 1989. * Ali-Reza Adl-Tabatabai, Christos Kozyrakis, Bratin Saha
Unlocking concurrency
ACM Queue 4, 10 (December 2006), pp 24–33. Ties multicore processors and the research/interest in STM together. * James R Larus, Ravi Rajwar
Transactional Memory
Morgan and Claypool Publishers, 2006.
Cambridge lock-free groupSoftware transactional memory Description; Derrick CoetzeeCritical discussion of STM in conjunction with imperative languagesJVSTM – Java Versioned Software Transactional MemoryDeuce - Java Software Transactional MemoryBlog about STM and the TLII algorithmFlexviews - materialized views act like software transactional memory for database relations
Concurrency control Programming language topics Programming language implementation Transaction processing Transactional memory de:Transaktionaler Speicher