Synchronization is the act of synchronizing (Webster's Ninth New Collegiate Dictionary [1.1]) i.e. making synchronous (cf. the Greek etymon σύγχρoυoς) the operation of different devices or the evolving of different processes by aligning their time scales.
Many operations in digital systems must obey a precedence relationship. If two operations obey some precedence, then synchronization ensures that operations follow in the correct order [1,2]. At the hardware level, synchronization is accomplished by distributing a common timing signal to all the modules of the system. At a higher level of abstraction, software processes synchronize by exchanging messages.
Depending on the application field, different systems of abstractions are adopted usefully, structured in a hierarchical fashion, where each level of abstraction relies on the features of the abstraction level below and hides unnecessary details to the higher level. Abstractions enable designers to ignore such unnecessary details and focus on the essential features, thus making easier achieving a greater complexity of the system designed.
In digital hardware systems, a common approach is to structure the system representation in abstraction levels such as the physical level, in which the designer is concerned about the physical laws governing semiconductor properties; the circuit level, where he deals with transistors, resistors, etc.; the element level, focused on gates, logical ports, etc.; the module level, ...