<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ideawaza.com/index.php?action=history&amp;feed=atom&amp;title=About_distributed_computing</id>
	<title>About distributed computing - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://ideawaza.com/index.php?action=history&amp;feed=atom&amp;title=About_distributed_computing"/>
	<link rel="alternate" type="text/html" href="https://ideawaza.com/index.php?title=About_distributed_computing&amp;action=history"/>
	<updated>2026-09-29T02:07:29Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://ideawaza.com/index.php?title=About_distributed_computing&amp;diff=68501&amp;oldid=prev</id>
		<title>wikademia&gt;Wikademia: http://en.wikipedia.org/wiki/Distributed_computing</title>
		<link rel="alternate" type="text/html" href="https://ideawaza.com/index.php?title=About_distributed_computing&amp;diff=68501&amp;oldid=prev"/>
		<updated>2009-10-31T18:08:10Z</updated>

		<summary type="html">&lt;p&gt;http://en.wikipedia.org/wiki/Distributed_computing&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Distributed computing&amp;#039;&amp;#039;&amp;#039; is a field of [[computer science]] that studies distributed systems. A &amp;#039;&amp;#039;&amp;#039;distributed system&amp;#039;&amp;#039;&amp;#039; consists of multiple autonomous [[computer]]s that communicate through a [[computer network]]. The computers interact with each other in order to achieve a common goal. A [[computer program]] that runs in a distributed system is called a &amp;#039;&amp;#039;&amp;#039;distributed program&amp;#039;&amp;#039;&amp;#039;, and  &amp;#039;&amp;#039;&amp;#039;distributed programming&amp;#039;&amp;#039;&amp;#039; is the process of writing such programs.&amp;lt;ref&amp;gt;{{harvtxt|Andrews|2000}}. {{harvtxt|Dolev|2000}}. {{harvtxt|Ghosh|2007}}, p. 10.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Distributed computing also refers to the use of distributed systems to solve computational problems. In distributed computing, a problem is divided into many tasks, each of which is solved by one computer.&amp;lt;ref&amp;gt;{{harvtxt|Godfrey|2002}}.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
The word &amp;#039;&amp;#039;distributed&amp;#039;&amp;#039; in terms such as &amp;quot;distributed computing&amp;quot;, &amp;quot;distributed system&amp;quot;, &amp;quot;distributed programming&amp;quot;, and &amp;quot;[[distributed algorithm]]&amp;quot; originally referred to computer networks where individual computers were physically distributed within some geographical area.&amp;lt;ref&amp;gt;{{harvtxt|Lynch|1996}}, p. 1.&amp;lt;/ref&amp;gt; The terms are nowadays used in a much wider sense, even when referring to autonomous [[Process (computing)|processes]] that run on the same physical computer and interact with each other by message passing.&amp;lt;ref&amp;gt;{{harvtxt|Andrews|2000}}, p. 291–292. {{harvtxt|Dolev|2000}}, p. 5.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
While there is no single definition of a distributed system,&amp;lt;ref&amp;gt;{{harvtxt|Ghosh|2007}}, p. 10.&amp;lt;/ref&amp;gt; the following defining properties are commonly used:&lt;br /&gt;
* There are several autonomous computational entities, each of which has its own local [[Memory (computers)|memory]].&amp;lt;ref&amp;gt;{{harvtxt|Andrews|2000}}, p. 8–9, 291. {{harvtxt|Dolev|2000}}, p. 5. {{harvtxt|Ghosh|2007}}, p. 3. {{harvtxt|Lynch|1996}}, p. xix, 1. {{harvtxt|Peleg|2000}}, p. xv.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The entities communicate with each other by [[message passing]].&amp;lt;ref&amp;gt;{{harvtxt|Andrews|2000}}, p. 291. {{harvtxt|Ghosh|2007}}, p. 3. {{harvtxt|Peleg|2000}}, p. 4.&amp;lt;/ref&amp;gt;&lt;br /&gt;
In this article, the computational entities are called &amp;#039;&amp;#039;computers&amp;#039;&amp;#039; or &amp;#039;&amp;#039;[[Node (networking)|nodes]]&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
A distributed system may have a common goal, such as solving a large computational problem.&amp;lt;ref&amp;gt;{{harvtxt|Ghosh|2007}}, p. 3–4. {{harvtxt|Peleg|2000}}, p. 1.&amp;lt;/ref&amp;gt; Alternatively, each computer may have its own user with individual needs, and the purpose of the distributed system is to coordinate the use of shared resources or provide communication services to the users.&amp;lt;ref&amp;gt;{{harvtxt|Ghosh|2007}}, p. 4. {{harvtxt|Peleg|2000}}, p. 2.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other typical properties of distributed systems include the following:&lt;br /&gt;
* The system has to [[Fault-tolerance|tolerate failures]] in individual computers.&amp;lt;ref&amp;gt;{{harvtxt|Ghosh|2007}}, p. 4, 8. {{harvtxt|Lynch|1996}}, p. 2–3. {{harvtxt|Peleg|2000}}, p. 4.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The structure of the system (network topology, network latency, number of computers) is not known in advance, the system may consist of different kinds of computers and network links, and the system may change during the execution of a distributed program.&amp;lt;ref&amp;gt;{{harvtxt|Lynch|1996}}, p. 2. {{harvtxt|Peleg|2000}}, p. 1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Each computer has only a limited, incomplete view of the system. Each computer may know only one part of the input.&amp;lt;ref&amp;gt;{{harvtxt|Ghosh|2007}}, p. 7. {{harvtxt|Lynch|1996}}, p. xix, 2. {{harvtxt|Peleg|2000}}, p. 4.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Distributed-parallel.svg|thumb|right|260px|(a)–(b)&amp;amp;nbsp;A&amp;amp;nbsp;distributed system.&amp;lt;br/&amp;gt; (c)&amp;amp;nbsp;A&amp;amp;nbsp;parallel system.]]&lt;br /&gt;
&lt;br /&gt;
===Parallel or distributed computing?===&lt;br /&gt;
&lt;br /&gt;
The terms &amp;quot;[[concurrent computing]]&amp;quot;, &amp;quot;[[parallel computing]]&amp;quot;, and &amp;quot;distributed computing&amp;quot; have a lot of overlap, and no clear distinction exists between them.&amp;lt;ref&amp;gt;{{harvtxt|Ghosh|2007}}, p. 10. {{harvtxt|Keidar|2008}}.&amp;lt;/ref&amp;gt; The same system may be characterised both as &amp;quot;parallel&amp;quot; and &amp;quot;distributed&amp;quot;; the processors in a typical distributed system run concurrently in parallel.&amp;lt;ref&amp;gt;{{harvtxt|Lynch|1996}}, p. xix, 1–2. {{harvtxt|Peleg|2000}}, p. 1.&amp;lt;/ref&amp;gt; Parallel computing may be seen as a particular tightly-coupled form of distributed computing,&amp;lt;ref&amp;gt;{{harvtxt|Peleg|2000}}, p. 1.&amp;lt;/ref&amp;gt; and distributed computing may be seen as a loosely-coupled form of parallel computing.&amp;lt;ref&amp;gt;{{harvtxt|Ghosh|2007}}, p. 10.&amp;lt;/ref&amp;gt; Nevertheless, it is possible to roughly classify concurrent systems as &amp;quot;parallel&amp;quot; or &amp;quot;distributed&amp;quot; using the following criteria:&lt;br /&gt;
* In parallel computing, all processors have access to a [[shared memory]]. Shared memory can be used to exchange information between processors.&amp;lt;ref&amp;gt;{{harvtxt|Papadimitriou|1994}}, Chapter 15. {{harvtxt|Keidar|2008}}.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* In distributed computing, each processor has its own private memory ([[distributed memory]]). Information is exchanged by passing messages between the processors.&amp;lt;ref&amp;gt;See references in [[#Introduction|Introduction]].&amp;lt;/ref&amp;gt;&lt;br /&gt;
The figure on the right illustrates the difference between distributed and parallel systems. Figure (a) is a schematic view of a typical distributed system; as usual, the system is represented as a [[Graph (mathematics)|graph]] in which each node (vertex) is a computer and each edge (line between two nodes) is a communication link. Figure (b) shows the same distributed system in more detail: each computer has its own local memory, and information can be exchanged only by passing messages from one node to another by using the available communication links. Figure (c) shows a parallel system in which each processor has a direct access to a shared memory.&lt;br /&gt;
&lt;br /&gt;
The situation is further complicated by the traditional uses of the terms parallel and distributed &amp;#039;&amp;#039;algorithm&amp;#039;&amp;#039; that do not quite match the above definitions of parallel and distributed &amp;#039;&amp;#039;systems&amp;#039;&amp;#039;; see the section [[#Theoretical foundations|Theoretical foundations]] below for more detailed discussion. Nevertheless, as a rule of thumb, high-performance parallel computation in a shared-memory multiprocessor uses parallel algorithms while the coordination of a large-scale distributed system uses distributed algorithms.&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
The use of concurrent processes that communicate by message-passing has its roots in [[operating system]] architectures studied in 1960s.&amp;lt;ref&amp;gt;{{harvtxt|Andrews|2000}}, p. 348.&amp;lt;/ref&amp;gt; The first wide-spread distributed systems were [[local-area networks]] such as [[Ethernet]] that was invented in 1970s.&amp;lt;ref&amp;gt;{{harvtxt|Andrews|2000}}, p. 32.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[ARPANET]], the predecessor of the [[Internet]], was introduced in the late 1960s, and ARPANET [[e-mail]] was invented in the early 1970s. E-mail became the most successful application of ARPANET,&amp;lt;ref&amp;gt;{{harvtxt|Peter|2004}}, [http://www.nethistory.info/History%20of%20the%20Internet/email.html The history of email].&amp;lt;/ref&amp;gt; and it is probably the earliest example of a large-scale distributed application. In addition to ARPANET and its successor Internet, other early worldwide computer networks included [[Usenet]] and [[FidoNet]] from 1980s, both of which were used to support distributed discussion systems.&lt;br /&gt;
&lt;br /&gt;
The study of distributed computing became its own branch of computer science in the late 1970s and early 1980s. The first conference in the field, [[Symposium on Principles of Distributed Computing]] (PODC), dates back to 1982, and its European counterpart [[International Symposium on Distributed Computing]] (DISC) was first held in 1985.&lt;br /&gt;
&lt;br /&gt;
==Applications==&lt;br /&gt;
&lt;br /&gt;
There are two main reasons for using distributed systems and distributed computing. First, the very nature of the application may &amp;#039;&amp;#039;require&amp;#039;&amp;#039; the use of a communication network that connects several computers. For example, data is produced in one physical location and it is needed in another location.&lt;br /&gt;
&lt;br /&gt;
Second, there are many cases in which the use of a single computer would be possible in principle, but the use of a distributed system is &amp;#039;&amp;#039;beneficial&amp;#039;&amp;#039; for practical reasons. For example, it may be more cost-efficient to obtain the desired level of performance by using a [[Cluster (computing)|cluster]] of several low-end computers, in comparison with a single high-end computer. A distributed system can be more reliable than a non-distributed system, as there is no [[single point of failure]]. Moreover, a distributed system may be easier to expand and manage than a monolithic uniprocessor system.&amp;lt;ref&amp;gt;{{harvtxt|Elmasri|Navathe|2000}}, Section 24.1.2.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Examples of distributed systems and applications of distributed computing include the following:&amp;lt;ref&amp;gt;{{harvtxt|Andrews|2000}}, p. 10–11. {{harvtxt|Ghosh|2007}}, p. 4–6. {{harvtxt|Lynch|1996}}, p. xix, 1. {{harvtxt|Peleg|2000}}, p. xv. {{harvtxt|Elmasri|Navathe|2000}}, Section 24.&amp;lt;/ref&amp;gt;&lt;br /&gt;
*[[Telecommunication]] networks:&lt;br /&gt;
**[[Telephone network]]s and [[cellular network]]s.&lt;br /&gt;
**[[Computer network]]s such as the [[Internet]].&lt;br /&gt;
**[[Wireless sensor networks]].&lt;br /&gt;
**[[Routing algorithm]]s.&lt;br /&gt;
*Network applications:&lt;br /&gt;
**[[World wide web]] and [[peer-to-peer network]]s.&lt;br /&gt;
**[[Massively multiplayer online game]]s and [[virtual reality]] communities.&lt;br /&gt;
**[[Distributed database]]s and [[distributed database management system]]s.&lt;br /&gt;
**[[Network file system]]s.&lt;br /&gt;
**Distributed information processing systems such as banking systems and airline reservation systems.&lt;br /&gt;
*Real-time process control:&lt;br /&gt;
**[[Aircraft]] control systems.&lt;br /&gt;
**[[Industrial control systems]].&lt;br /&gt;
*[[Parallel computation]]:&lt;br /&gt;
**[[Scientific computing]], including [[cluster computing]] and [[grid computing]] and various [[volunteer computing]] projects; see the [[list of distributed computing projects]].&lt;br /&gt;
**[[Distributed rendering]] in computer graphics.&lt;br /&gt;
&lt;br /&gt;
==Theoretical foundations==&lt;br /&gt;
{{main|Distributed algorithm}}&lt;br /&gt;
&amp;lt;!-- Many citations are still missing, will add later --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Models===&lt;br /&gt;
&lt;br /&gt;
Many tasks that we would like to automate by using a computer are of question–answer type: we would like to ask a question and the computer should produce an answer. In [[theoretical computer science]], such tasks are called [[computational problem]]s. Formally, a computational problem consists of &amp;#039;&amp;#039;instances&amp;#039;&amp;#039; together with a &amp;#039;&amp;#039;solution&amp;#039;&amp;#039; for each instance. Instances are questions that we can ask, and solutions are desired answers to these questions.&lt;br /&gt;
&lt;br /&gt;
Theoretical computer science seeks to understand which computational problems can be solved by using a computer ([[Computability theory (computer science)|computability theory]]) and how efficiently ([[computational complexity theory]]). Traditionally, it is said that a problem can be solved by using a computer if we can design an [[algorithm]] that produces a correct solution for any given instance. Such an algorithm can be implemented as a [[computer program]] that runs on a general-purpose computer: the program reads a problem instance from [[input]], performs some computation, and produces the solution as [[output]]. Formalisms such as [[random access machine]]s or [[universal Turing machine]]s can be used as abstract models of a sequential general-purpose computer executing such an algorithm.&lt;br /&gt;
&lt;br /&gt;
The field of concurrent and distributed computing studies similar questions in the case of either multiple computers, or a computer that executes a network of interacting processes: which computational problems can be solved in such a network and how efficiently? However, it is not at all obvious what is meant by “solving a problem” in the case of a concurrent or distributed system: for example, what is the task of the algorithm designer, and what is the concurrent and/or distributed equivalent of a sequential general-purpose computer?&lt;br /&gt;
&lt;br /&gt;
The discussion below focusses on the case of multiple computers, although many of the issues are the same for concurrent processes running on a single computer.&lt;br /&gt;
&lt;br /&gt;
Three viewpoints are commonly used:&lt;br /&gt;
;Parallel algorithms in shared-memory model&lt;br /&gt;
*All computers have access to a shared memory. The algorithm designer chooses the program executed by each computer.&lt;br /&gt;
*One theoretical model is the [[parallel random access machine]]s (PRAM) are used.&amp;lt;ref&amp;gt;{{harvtxt|Cormen|Leiserson|Rivest|1990}}, Section 30.&amp;lt;/ref&amp;gt; However, the classical PRAM model assumes synchronous access to the shared memory.&lt;br /&gt;
*A model that is closer to the behavior of real-world multiprocessor machines and takes into account the use of machine instructions such as [[Compare-and-swap]] (CAS) is that of  &amp;#039;&amp;#039;asynchronous shared memory&amp;#039;&amp;#039;. There is a wide body of work on this model, a summary of which can be found in the literature. &amp;lt;ref&amp;gt;{{harvtxt|Herlihy|Shavit|2008}}, Chapters 2-6.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{harvtxt|Lynch|1996}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Parallel algorithms in message-passing model&lt;br /&gt;
*The algorithm designer chooses the structure of the network, as well as the program executed by each computer.&lt;br /&gt;
*Models such as [[Boolean circuits]] and [[sorting network]]s are used.&amp;lt;ref&amp;gt;{{harvtxt|Cormen|Leiserson|Rivest|1990}}, Sections 28 and 29.&amp;lt;/ref&amp;gt; A Boolean circuit can be seen as a computer network: each gate is a computer that runs an extremely simple computer program. Similarly, a sorting network can be seen as a computer network: each comparator is a computer.&lt;br /&gt;
;Distributed algorithms in message-passing model&lt;br /&gt;
*The algorithm designer only chooses the computer program. All computers run the same program. The system must work correctly regardless of the structure of the network.&lt;br /&gt;
*A commonly used model is a [[graph (mathematics)|graph]] with one [[finite-state machine]] per node.&lt;br /&gt;
&lt;br /&gt;
In the case of distributed algorithms, computational problems are typically related to graphs. Often the graph that describes the structure of the computer network &amp;#039;&amp;#039;is&amp;#039;&amp;#039; the problem instance. This is illustrated in the following example.&lt;br /&gt;
&lt;br /&gt;
===An example===&lt;br /&gt;
&lt;br /&gt;
Consider the computational problem of finding a coloring of a given graph &amp;#039;&amp;#039;G&amp;#039;&amp;#039;. Different fields might take the following approaches:&lt;br /&gt;
;Centralized algorithms&lt;br /&gt;
*The graph &amp;#039;&amp;#039;G&amp;#039;&amp;#039; is encoded as a string, and the string is given as input to a computer. The computer program finds a coloring of the graph, encodes the coloring as a string, and outputs the result.&lt;br /&gt;
;Parallel algorithms&lt;br /&gt;
*Again, the graph &amp;#039;&amp;#039;G&amp;#039;&amp;#039; is encoded as a string. However, multiple computers can access the same string in parallel. Each computer might focus on one part of the graph and produce a colouring for that part.&lt;br /&gt;
*The main focus is on high-performance computation that exploits the processing power of multiple computers in parallel.&lt;br /&gt;
;Distributed algorithms&lt;br /&gt;
*The graph &amp;#039;&amp;#039;G&amp;#039;&amp;#039; is the structure of the computer network. There is one computer for each node of &amp;#039;&amp;#039;G&amp;#039;&amp;#039; and one communication link for each edge of &amp;#039;&amp;#039;G&amp;#039;&amp;#039;. Initially, each computer only knows about its immediate neighbours in the graph &amp;#039;&amp;#039;G&amp;#039;&amp;#039;; the computers must exchange messages with each other to discover more about the structure of &amp;#039;&amp;#039;G&amp;#039;&amp;#039;. Each computer must produce its own colour as output.&lt;br /&gt;
*The main focus is on coordinating the operation of an arbitrary distributed system.&lt;br /&gt;
&lt;br /&gt;
While the field of parallel algorithms has a different focus than the field of distributed algorithms, there is a lot of interaction between the two fields. For example, the [[Cole–Vishkin algorithm]] for graph colouring&amp;lt;ref&amp;gt;{{harvtxt|Cole|Vishkin|1986}}. {{harvtxt|Cormen|Leiserson|Rivest|1990}}, Section 30.5.&amp;lt;/ref&amp;gt; was originally presented as a parallel algorithm, but the same technique can also be used directly as a distributed algorithm.&lt;br /&gt;
&lt;br /&gt;
Moreover, a parallel algorithm can be implemented either in a parallel system (using shared memory) or in a distributed system (using message passing).&amp;lt;ref&amp;gt;{{harvtxt|Andrews|2000}}, p. ix.&amp;lt;/ref&amp;gt; The traditional boundary between parallel and distributed algorithms (choose a suitable network vs. run in any given network) does not lie in the same place as the boundary between parallel and distributed systems (shared memory vs. message passing).&lt;br /&gt;
&lt;br /&gt;
===Complexity measures===&lt;br /&gt;
&lt;br /&gt;
A centralised algorithm is efficient if it does not require much time (number of computational steps) or space (amount of memory). These complexity measures give rise to complexity classes such as [[P (complexity)|P]] ([[decision problem]]s solvable in polynomial time) and  [[PSPACE]] (decision problems solvable in polynomial space).&lt;br /&gt;
&lt;br /&gt;
In parallel algorithms, yet another resource in addition to time and space is the number of computers. Indeed, often there is a trade-off between the running time and the number of computers: the problem can be solved faster if there are more computers running in parallel (see [[speedup]]). If a decision problem can be solved in polylogarithmic time by using a polynomial number of processors, then the problem is said to be in the class [[NC (complexity)|NC]].&amp;lt;ref&amp;gt;{{harvtxt|Arora|Barak|2009}}, Section 6.7. {{harvtxt|Papadimitriou|1994}}, Section 15.3.&amp;lt;/ref&amp;gt; The class NC can be defined equally well by using the PRAM formalism or Boolean circuits – PRAM machines can simulate Boolean circuits efficiently and vice versa.&amp;lt;ref&amp;gt;{{harvtxt|Papadimitriou|1994}}, Section 15.2.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the analysis of distributed algorithms, more attention is usually paid on communication operations than computational steps. Perhaps the simplest model of distributed computing is a synchronous system where all nodes operate in a lockstep fashion. During each &amp;#039;&amp;#039;communication round&amp;#039;&amp;#039;, all nodes in parallel (1)&amp;amp;nbsp;receive the latest messages from their neighbours, (2)&amp;amp;nbsp;perform arbitrary local computation, and (3)&amp;amp;nbsp;send new messages to their neighbours. In such systems, a central complexity measure is the number of synchronous communication rounds required to complete the task.&amp;lt;ref&amp;gt;{{harvtxt|Lynch|1996}}, p. 17–23.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This complexity measure is closely related to the [[Diameter (graph theory)|diameter]] of the network. Let &amp;#039;&amp;#039;D&amp;#039;&amp;#039; be the diameter of the network. On the one hand, any computable problem can be solved trivially in a synchronous distributed system in approximately 2&amp;#039;&amp;#039;D&amp;#039;&amp;#039; communication rounds: simply gather all information in one location (&amp;#039;&amp;#039;D&amp;#039;&amp;#039; rounds), solve the problem, and inform each node about the solution (&amp;#039;&amp;#039;D&amp;#039;&amp;#039; rounds).&lt;br /&gt;
&lt;br /&gt;
On the other hand, if the running time of the algorithm is much smaller than &amp;#039;&amp;#039;D&amp;#039;&amp;#039; communication rounds, then the nodes in the network must produces their output without having the possibility to obtain information about distant parts of the network. In other words, the nodes must make globally consistent decisions based on information that is available in their &amp;#039;&amp;#039;local neighbourhood&amp;#039;&amp;#039;. Many distributed algorithms are known with the running time much smaller than &amp;#039;&amp;#039;D&amp;#039;&amp;#039; rounds, and understanding which problems can be solved by such algorithms is one of the central research questions of the field.&amp;lt;ref&amp;gt;{{harvtxt|Peleg|2000}}, Sections 2.3 and 7. {{harvtxt|Linial|1992}}. {{harvtxt|Naor|Stockmeyer|1995}}.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other commonly used measures are the total number of bits transmitted in the network (cf. [[communication complexity]]).&lt;br /&gt;
&lt;br /&gt;
===Other problems===&lt;br /&gt;
&lt;br /&gt;
Traditional computational problems take the perspective that we ask a question, a computer (or a distributed system) processes the question for a while, and then produces an answer and stops. However, there are also problems where we do not want the system to ever stop. Examples of such problems include the [[dining philosophers problem]] and other similar [[mutual exclusion]] problems. In these problems, the distributed system is supposed to continuously coordinate the use of shared resources so that no conflicts or [[deadlock]]s occur.&lt;br /&gt;
&lt;br /&gt;
There are also fundamental challenges that are unique to distributed computing. The first example is challenges that are related to &amp;#039;&amp;#039;fault-tolerance&amp;#039;&amp;#039;. Examples of related problems include [[Consensus (computer science)|consensus problems]],&amp;lt;ref&amp;gt;{{harvtxt|Lynch|1996}}, Sections 5–7. {{harvtxt|Ghosh|2007}}, Chapter 13.&amp;lt;/ref&amp;gt; [[Byzantine fault tolerance]],&amp;lt;ref&amp;gt;{{harvtxt|Lynch|1996}}, p. 99–102. {{harvtxt|Ghosh|2007}}, p. 192–193.&amp;lt;/ref&amp;gt; and [[self-stabilisation]].&amp;lt;ref&amp;gt;{{harvtxt|Dolev|2000}}. {{harvtxt|Ghosh|2007}}, Chapter 17.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A lot of research is also focused on understanding the &amp;#039;&amp;#039;asynchronous&amp;#039;&amp;#039; nature of distributed systems:&lt;br /&gt;
* [[Synchronizer (algorithm)|Synchronizers]] can be used to run synchronous algorithms in asynchronous systems.&amp;lt;ref&amp;gt;{{harvtxt|Lynch|1996}}, Section 16. {{harvtxt|Peleg|2000}}, Section 6.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[Logical clock]]s provide a causal [[happened-before]] ordering of events.&amp;lt;ref&amp;gt;{{harvtxt|Lynch|1996}}, Section 18. {{harvtxt|Ghosh|2007}}, Sections 6.2–6.3.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[Clock synchronization]] algorithms provide globally consistent physical time stamps.&amp;lt;ref&amp;gt;{{harvtxt|Ghosh|2007}}, Section 6.4.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Properties of distributed systems===&lt;br /&gt;
&lt;br /&gt;
So far the focus has been on &amp;#039;&amp;#039;designing&amp;#039;&amp;#039; a distributed system that solves a given problem. A complementary research problem is &amp;#039;&amp;#039;studying&amp;#039;&amp;#039; the properties of a given distributed system.&lt;br /&gt;
&lt;br /&gt;
The [[halting problem]] is an analogous example from the field of centralised computation: we are given a computer program and the task is to decide whether it halts or runs forever. The halting problem is [[Undecidable problem|undecidable]] in the general case, and naturally understanding the behaviour of a computer network is at least as hard as understanding the behaviour of one computer.&lt;br /&gt;
&lt;br /&gt;
However, there are many interesting special cases that are decidable. In particular, it is possible to reason about the behaviour of a network of finite-state machines. One example is telling whether a given network of interacting (asynchronous and non-deterministic) finite-state machines can reach a deadlock. This problem is [[PSPACE-complete]],&amp;lt;ref&amp;gt;{{harvtxt|Papadimitriou|1994}}, Section 19.3.&amp;lt;/ref&amp;gt; i.e., it is decidable, but it is not likely that there is an efficient (centralised, parallel or distributed) algorithm that solves the problem in the case of large networks.&lt;br /&gt;
&lt;br /&gt;
==Architectures==&lt;br /&gt;
&lt;br /&gt;
Various hardware and software architectures are used for distributed computing. At a lower level, it is necessary to interconnect multiple CPUs with some sort of network, regardless of whether that network is printed onto a circuit board or made up of loosely-coupled devices and cables. At a higher level, it is necessary to interconnect [[Process (computing)|processes]] running on those CPUs with some sort of [[communication system]].&lt;br /&gt;
&lt;br /&gt;
Distributed programming typically falls into one of several basic architectures or categories: [[Client-server]], [[Three-tier (computing)|3-tier architecture]], [[Multitier architecture|N-tier architecture]], [[Distributed object]]s, [[loose coupling]], or [[Computer cluster|tight coupling]].&lt;br /&gt;
&lt;br /&gt;
* [[Client-server]] &amp;amp;mdash; Smart client code contacts the server for data, then formats and displays it to the user. Input at the client is committed back to the server when it represents a permanent change.&lt;br /&gt;
* [[Three-tier (computing)|3-tier architecture]] &amp;amp;mdash; Three tier systems move the client intelligence to a middle tier so that stateless clients can be used. This simplifies application deployment. Most web applications are 3-Tier.&lt;br /&gt;
* [[Multitier architecture|N-tier architecture]] &amp;amp;mdash; N-Tier refers typically to web applications which further forward their requests to other enterprise services. This type of application is the one most responsible for the success of [[application server]]s.&lt;br /&gt;
* [[Computer cluster|Tightly coupled]] (clustered) &amp;amp;mdash; refers typically to a cluster of machines that closely work together, running a shared process in parallel. The task is subdivided in parts that are made individually by each one and then put back together to make the final result.&lt;br /&gt;
* [[Peer-to-peer]] &amp;amp;mdash; an architecture where there is no special machine or machines that provide a service or manage the network resources. Instead all responsibilities are uniformly divided among all machines, known as peers. Peers can serve both as clients and servers.&lt;br /&gt;
* [[Space based architecture|Space based]]  &amp;amp;mdash; refers to an infrastructure that creates the illusion (virtualization) of one single address-space. Data are transparently replicated according to application needs. Decoupling in time, space and reference is achieved.&lt;br /&gt;
&lt;br /&gt;
Another basic aspect of distributed computing architecture is the method of communicating and coordinating work among concurrent processes. Through various message passing protocols, processes may communicate directly with one another, typically in a [[Master-slave (technology)|master/slave]] relationship. Alternatively, a [[Database-centric architecture|&amp;quot;database-centric&amp;quot; architecture]] can enable distributed computing to be done without any form of direct [[inter-process communication]], by utilizing a shared [[database]].&amp;lt;ref&amp;gt;[http://www.ncbi.nlm.nih.gov/sites/entrez?db=pubmed&amp;amp;list_uids=16711722&amp;amp;cmd=Retrieve A database-centric virtual chemistry system, J Chem Inf Model. 2006 May-Jun;46(3):1034-9]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[List of important publications in concurrent, parallel, and distributed computing]]&lt;br /&gt;
* [[Edsger W. Dijkstra Prize in Distributed Computing]]&lt;br /&gt;
* [[List of distributed computing conferences]]&lt;br /&gt;
* [[List of distributed computing projects]]&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
{{reflist|2}}&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
;Books&lt;br /&gt;
*{{citation&lt;br /&gt;
| last=Andrews | first=Gregory R.&lt;br /&gt;
| title=Foundations of Multithreaded, Parallel, and Distributed Programming&lt;br /&gt;
| publisher=[[Addison–Wesley]]&lt;br /&gt;
| year=2000&lt;br /&gt;
| isbn=0-201-35752-6&lt;br /&gt;
}}. &amp;lt;!--{{harvtxt|Andrews|2000}}--&amp;gt;&lt;br /&gt;
*{{citation&lt;br /&gt;
| last1=Arora | first1=Sanjeev | authorlink1=Sanjeev Arora&lt;br /&gt;
| last2=Barak | first2=Boaz&lt;br /&gt;
| title=Computational Complexity – A Modern Approach&lt;br /&gt;
| publisher=[[Cambridge University Press|Cambridge]]&lt;br /&gt;
| year=2009&lt;br /&gt;
| isbn=978-0-521-42426-4&lt;br /&gt;
}}. &amp;lt;!--{{harvtxt|Arora|Barak|2009}}--&amp;gt;&lt;br /&gt;
*{{citation&lt;br /&gt;
| last1=Cormen | first1=Thomas H. | authorlink1=Thomas H. Cormen&lt;br /&gt;
| last2=Leiserson | first2=Charles E. | authorlink2=Charles E. Leiserson&lt;br /&gt;
| last3=Rivest | first3=Ronald L. | authorlink3=Ron Rivest&lt;br /&gt;
| title=[[Introduction to Algorithms]]&lt;br /&gt;
| publisher=[[MIT Press]]&lt;br /&gt;
| year=1990&lt;br /&gt;
| edition=1st&lt;br /&gt;
| isbn=0-262-03141-8&lt;br /&gt;
}}. &amp;lt;!--{{harvtxt|Cormen|Leiserson|Rivest|1990}}--&amp;gt;&lt;br /&gt;
*{{citation&lt;br /&gt;
| last=Dolev | first=Shlomi | authorlink=Shlomi Dolev&lt;br /&gt;
| title=Self-Stabilization&lt;br /&gt;
| publisher=[[MIT Press]]&lt;br /&gt;
| year=2000&lt;br /&gt;
| isbn=0-262-04178-2&lt;br /&gt;
}}. &amp;lt;!--{{harvtxt|Dolev|2000}}--&amp;gt;&lt;br /&gt;
*{{citation&lt;br /&gt;
| last1=Elmasri | first1=Ramez&lt;br /&gt;
| last2=Navathe | first2=Shamkant B. | authorlink2=Shamkant Navathe&lt;br /&gt;
| title=Fundamentals of Database Systems&lt;br /&gt;
| publisher=[[Addison–Wesley]]&lt;br /&gt;
| edition=3rd&lt;br /&gt;
| year=2000&lt;br /&gt;
| isbn=0-201-54263-3&lt;br /&gt;
}}. &amp;lt;!--{{harvtxt|Elmasri|Navathe|2000}}--&amp;gt;&lt;br /&gt;
*{{citation&lt;br /&gt;
| last=Ghosh | first=Sukumar&lt;br /&gt;
| title=Distributed Systems – An Algorithmic Approach&lt;br /&gt;
| publisher=Chapman &amp;amp; Hall/CRC&lt;br /&gt;
| year=2007&lt;br /&gt;
| isbn=978-1-58488-564-1&lt;br /&gt;
}}. &amp;lt;!--{{harvtxt|Ghosh|2007}}--&amp;gt;&lt;br /&gt;
*{{citation&lt;br /&gt;
| last=Lynch | first=Nancy A. | authorlink=Nancy Lynch&lt;br /&gt;
| title=Distributed Algorithms&lt;br /&gt;
| publisher=[[Morgan Kaufmann Publishers|Morgan Kaufmann]]&lt;br /&gt;
| year=1996&lt;br /&gt;
| isbn=1-55860-348-4&lt;br /&gt;
}}. &amp;lt;!--{{harvtxt|Lynch|1996}}--&amp;gt;&lt;br /&gt;
*{{citation&lt;br /&gt;
| last1=Herlihy| first1=Maurice P. | authorlink1=Maurice Herlihy&lt;br /&gt;
| last2=Shavit | first2=Nir N. | authorlink2=Nir Shavit&lt;br /&gt;
| title=The Art of Multiprocessor Programming&lt;br /&gt;
| publisher=[[Morgan Kaufmann Publishers|Morgan Kaufmann]]&lt;br /&gt;
| year=2008&lt;br /&gt;
| isbn=0-12-370591-6&lt;br /&gt;
}}. &amp;lt;!--{{harvtxt|Herlihy|Shavit|2008}}--&amp;gt;&lt;br /&gt;
*{{citation&lt;br /&gt;
| last=Papadimitriou | first=Christos H. | authorlink=Christos Papadimitriou&lt;br /&gt;
| title=Computational Complexity&lt;br /&gt;
| publisher=[[Addison–Wesley]]&lt;br /&gt;
| year=1994&lt;br /&gt;
| isbn=0-201-53082-1&lt;br /&gt;
}}. &amp;lt;!--{{harvtxt|Papadimitriou|1994}}--&amp;gt;&lt;br /&gt;
*{{citation&lt;br /&gt;
| last=Peleg | first=David | authorlink=David Peleg (scientist)&lt;br /&gt;
| title=Distributed Computing: A Locality-Sensitive Approach&lt;br /&gt;
| publisher=[[Society for Industrial and Applied Mathematics|SIAM]]&lt;br /&gt;
| year=2000&lt;br /&gt;
| isbn=0-89871-464-8&lt;br /&gt;
| url=http://www.ec-securehost.com/SIAM/DT05.html&lt;br /&gt;
}}. &amp;lt;!--{{harvtxt|Peleg|2000}}--&amp;gt;&lt;br /&gt;
;Articles&lt;br /&gt;
* {{Citation&lt;br /&gt;
| last1 = Cole | first1 = Richard&lt;br /&gt;
| last2 = Vishkin | first2 = Uzi | authorlink2=Uzi Vishkin&lt;br /&gt;
| year = 1986&lt;br /&gt;
| title = Deterministic coin tossing with applications to optimal parallel list ranking&lt;br /&gt;
| journal = Information and Control&lt;br /&gt;
| volume = 70&lt;br /&gt;
| issue = 1&lt;br /&gt;
| pages = 32–53&lt;br /&gt;
| doi = 10.1016/S0019-9958(86)80023-7&lt;br /&gt;
}}.&lt;br /&gt;
*{{citation&lt;br /&gt;
| last1=Keidar | first1=Idit&lt;br /&gt;
| title=Distributed computing column 32 – The year in review&lt;br /&gt;
| journal=[[ACM SIGACT News]]&lt;br /&gt;
| volume=39&lt;br /&gt;
| issue=4&lt;br /&gt;
| year=2008&lt;br /&gt;
| pages=53–54&lt;br /&gt;
| url=http://webee.technion.ac.il/~idish/sigactNews/#column%2032&lt;br /&gt;
}}. &amp;lt;!--{{harvtxt|Keidar|2008}}--&amp;gt;&lt;br /&gt;
*{{citation&lt;br /&gt;
| last=Linial | first=Nathan&lt;br /&gt;
| doi=10.1137/0221015&lt;br /&gt;
| title=Locality in distributed graph algorithms&lt;br /&gt;
| journal=SIAM Journal on Computing&lt;br /&gt;
| volume=21&lt;br /&gt;
| number=1&lt;br /&gt;
| year=1992&lt;br /&gt;
| pages=193–201&lt;br /&gt;
}}.&lt;br /&gt;
*{{citation&lt;br /&gt;
| last1=Naor | first1=Moni | authorlink1=Moni Naor&lt;br /&gt;
| last2=Stockmeyer | first2=Larry | authorlink2=Larry Stockmeyer&lt;br /&gt;
| doi=10.1137/S0097539793254571&lt;br /&gt;
| title=What can be computed locally?&lt;br /&gt;
| journal=SIAM Journal on Computing&lt;br /&gt;
| volume=24&lt;br /&gt;
| number=6&lt;br /&gt;
| year=1995&lt;br /&gt;
| pages=1259–1277&lt;br /&gt;
}}.&lt;br /&gt;
;Web sites&lt;br /&gt;
*{{cite web&lt;br /&gt;
| last=Godfrey | first=Bill&lt;br /&gt;
| url=http://www.bacchae.co.uk/docs/dist.html&lt;br /&gt;
| title=A primer on distributed computing&lt;br /&gt;
| year=2002&lt;br /&gt;
}}&lt;br /&gt;
*{{cite web&lt;br /&gt;
| last=Peter | first=Ian&lt;br /&gt;
| url=http://www.nethistory.info/History%20of%20the%20Internet/&lt;br /&gt;
| title=Ian Peter&amp;#039;s History of the Internet&lt;br /&gt;
| year=2004&lt;br /&gt;
| accessdate=2009-08-04&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Further reading==&lt;br /&gt;
&lt;br /&gt;
;Books&lt;br /&gt;
*{{cite book|first=Gerard|last=Tel |title=Introduction to Distributed Algorithms| publisher=Cambridge University Press| year=1994}}&lt;br /&gt;
*{{cite book|author=Attiya, Hagit and Welch, Jennifer|title=Distributed Computing: Fundamentals, Simulations, and Advanced Topics| publisher=Wiley-Interscience| year=2004}} ISBN 0471453242.&lt;br /&gt;
&lt;br /&gt;
;Articles&lt;br /&gt;
*{{citation&lt;br /&gt;
| editor1-last=Keidar | editor1-first=Idit&lt;br /&gt;
| editor2-last=Rajsbaum | editor2-first=Sergio&lt;br /&gt;
| url=http://webee.technion.ac.il/~idish/sigactNews/&lt;br /&gt;
| contribution=Distributed computing column&lt;br /&gt;
| title=[[ACM SIGACT News]]&lt;br /&gt;
| year=2000–2009&lt;br /&gt;
}}.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
&lt;br /&gt;
*{{dmoz|Computers/Computer_Science/Distributed_Computing/|Distributed computing}}&lt;br /&gt;
*{{dmoz|Computers/Computer_Science/Distributed_Computing/Publications/|Distributed computing journals}}&lt;br /&gt;
&lt;br /&gt;
{{Parallel_computing}}&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Distributed Computing}}&lt;br /&gt;
[[Category:Distributed computing| ]]&lt;/div&gt;</summary>
		<author><name>wikademia&gt;Wikademia</name></author>
	</entry>
</feed>