BACKGROUND OF THE INVENTION 
     The present invention is directed to a multiprocessor system composed of a number of interconnected, individual processor units. More specifically, the present invention provides a method, and teaches apparatus for implementing that method, of maintaining each of the system clocks of each processor unit in synchronization with one another. 
     Data processing systems often produce data or values that are &#34;time-stamped&#34; when stored; that is, the time (and date) of creation, modification, or storing of the data or value will accompany the data or value for later use. Multiprocessor systems of the type to which the present invention is directed often maintain the fiction of a &#34;system clock,&#34; i.e., a single clock accessible to each processor unit of the system, so that any time-stamped actions or values will chronologically correspond to the time-stamped values or actions of other processor units. By providing each of the individual processor units that make up the system with its own clock, and keeping each processor clock synchronized with those of the other processor units, transactions processed by the system, or more particularly the individual processor units, can then be time-stamped (i.e., given a real time indication) by the processor unit, thereby providing an indication of when a particular transaction has been processed relative to other transactions (processed by that or other processor units). For example, multiprocessor systems have been used in the implementation of a number of networked automated teller machines in which large numbers of banking transactions (withdrawals, deposits, etc.) are made in short periods of time. The fictionalized &#34;system clock&#34; is used by each processor unit to provide a notation of the time and date of transaction occurrence. 
     It will be apparent that in these &#34;transaction processing&#34; environments, it is important that the system clocks of the individual processor units be coordinated or synchronized to one another, sometimes to within milliseconds. For example, the New York Stock Exchange utilizes multiprocessor systems for recording Stock Exchange transactions. It can be critical, therefore, that the transactions be accurately recorded in time in order to preserve transactional priority. 
     Any synchronization scheme for a multiprocessor system must ensure that the individual processor clocks be monotonically increasing. Were it otherwise, the system clock concept, for accuracy, would not be useful for measuring time between transactions or events, nor would their time stamps be useful as unique identifiers. If a clock jumped backwards, one might obtain the same time stamp more than once. 
     One previously used technique was to synchronize all clocks to the fastest processor clock in the system. This has the advantage of ensuring that no clock will ever be adjusted backwards. However, the disadvantage of this technique is that, even if crystal-controlled, the individual processor clocks are not perfect; there is a variation among crystals due to manufacturing tolerances. Synchronizing to the fastest processor clock in the system can result in an unacceptable accelerating of system time. 
     An alternative solution is to maintain, in hardware, a single clock system accessible by each of the multiprocessor units. This, unfortunately, has the disadvantage of instilling a certain amount of vulnerability for fault. If access to the clock is via some form of communication bus used by all processor units, this technique will tend to increase bus traffic, to the exclusion of other necessary interprocessor messaging. 
     BRIEF DESCRIPTION OF THE INVENTION 
     An alternative solution is to synchronize all of the individual processor clocks to the average value of those clocks. Because individual crystal frequencies have a normal distribution about the nominal crystal frequency, it can be expected that the average frequency of several crystals to be closer to the nominal value than the frequency of the fastest crystal in any sample. According to the present invention, therefore, there is a presented a method, and apparatus for implementing that method, that synchronizes multiple independent processor clocks by using the medium of transmitting messages over a high-speed interprocessor bus that operate to (1) obtain values of the individual processor clocks from which an average value is determined, and (2) communicating this average value for use in synchronizing the individual processor clocks. The method operates reliably, even though the duration of message transmissions cannot be accurately determined. 
     Broadly, the invention comprises the following steps: First, a processor unit of a multiprocessor system creates a time synchronization (TSYNC) message that is sequentially routed to the other individual processor units, and returned to the originator processor unit, obtaining values that are indicative of (1) the sum of the processor clocks to be synchronized, and (2) the processor-to-processor routing or transit time of the message. Second, the TSYNC message is then retransmitted by the originator processor unit and sequentially received (and, in turn, retransmitted) by each of the other processor units. Each processor unit extracts the sum and transit values and uses them to calculate an average clock time that is used by the processor unit to resynchronize its processor clock. 
     In order to preserve the monotonically increasing sequence of each processor clock, resetting of the processor clock for synchronization is performed in stages. Thus, when each processor unit receives the second pass of the TSYNC message, the average clock value is calculated (using the clock sum and the transit values contained in the TSYNC message), and an error value indicative of the difference between the processor clock and the average clock value (at a predetermined time) is obtained. This error value is used in small amounts to incrementally increase or decrease the processor clock over a period of time to bring the clock into synchronization with the calculated average. 
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS 
     FIG. 1 is a simplified block diagram of a portion of a representative multiprocessor system incorporating the present invention, illustrating a bus system that intercouples multiple ones of the processor unit for transmitting messages therebetween; 
     FIG. 2 illustrates, in greater detail, the portions of a processor unit that are important to the present invention; 
     FIGS. 3-6 are flow charts illustrating operation of the invention; and 
     FIG. 7 is a diagram for use in explaining, by an analogy, the method of the present invention. 
    
    
     DETAILED DESCRIPTION OF THE INVENTION 
     An Analogy: 
     Before proceeding to a detailed description of the invention, it will be beneficial to first consider an analogy. Suppose one awoke one day to find the sun shining, but the electric alarm clock (no battery back-up) reading &#34;01:20.&#34; It is determined that the electric power had been off during the night, and the need to find out what the correct time is realized. Unfortunately, another clock, a radio, a telephone, or any other source of correct time is not available. There are, however, nearby neighbors. Thus, it is decided to visit the closest neighbor. 
     It is known that the clock is running correctly, even though the time is not correct. As the trip to the neighbor begins, the clock&#39;s time is noted and recorded: It indicates &#34;01:30.&#34; Upon arrival at the neighbor&#39;s house, one is informed that the neighbor set his or her clock to a radio broadcast a little earlier, and that the clock now reads exactly 6:00 A.M. With this information, the trip home is begun. Upon return home it is noted that the clock now reads &#34;02:00.&#34; One can, therefore, correctly deduce that it took exactly one-half hour to walk to the neighbor&#39;s and back. Assuming that the trip was made at the same speed in both directions, and that negligible time was spent talking to the neighbor, it is concluded that it took 15 minutes to return from the neighbor&#39;s house. Because 15 minutes have elapsed since it was found that the time was 6:00 A.M., one can conclude that it must now be 6:15 A.M. The clock is immediately set to 6:15 A.M. One has now &#34;synchronized&#34; his or her clock to the neighbor&#39;s clock. 
     There are several assumptions that were made in the foregoing analogy. First, it was assumed the &#34;unsynchronized&#34; clock was fairly accurate, even though it might not be set to the correct time. Second, a constant speed was traveled between one&#39;s own house and the neighbor&#39;s. Third, clocks can be read instantaneously. And, finally, except for the transit time, all other activities were virtually instantaneous. 
     Analogy with Three Neighbors: 
     Let us now extend the foregoing analogy to assume that there are three neighbors with clocks, and that we want to compute the average of their clocks. The diagram set forth in FIG. 7 will facilitate this analogy. 
     The trip is started from (A), reading first the clock and saving the value as the starting time (Tφ). We travel to the first neighbor, (B), and read the time of arrival (T1), which value will begin a running total called CLKSUM. We then continue to the next neighbor, (C), and add the clock time we read there (T2) to CLKSUM. In similar fashion, we travel to the next neighbor (D), read the clock time (T3) and add it to our running total CLKSUM, and return home (A), read the clock (T4), add it to the running total CLKSUM, and save it as the ending time. 
     At this point, we can compute the elapsed time for the roundtrip. It is simply the difference between the ending time, T4, and the starting time, Tφ. We can also compute the average transit time, TA, which is equal to the elapsed time divided by the number of transits (4), (T4-Tφ)/4. 
     The running total (CLKSUM), similar to the earlier analogy, must be adjusted to account for the time in transit from A to neighbors B, C, D and return. Thus, for example, one average transit time must be added to the value of the clock obtained at D, T3, to compensate for the time in transit from D to A (and to bring the clock time read at D up to date with that read at A); adding TA will achieve this compensation. In similar fashion, the value of the clock obtained at C must be adjusted to compensate for the transit time from C to A, since two average transit times (2TA) have elapsed since the clock time read at C, i.e., T2. Adding 2TA, therefore, will achieve the desired adjustment of C&#39;s clock value. And, of course, following this reasoning, we must add three average transit times (3TA) to the clock value obtained at B. Adding 6TA to the running total (CLKSUM) of all clock values completes the compensation for all clock values. 
     The current instantaneous average of the clocks at B, C, D and A is: 
     
         (CLKSUM+6TA)/4. 
    
     As perhaps evident in the foregoing analogies, there are a number of considerations that must be kept in mind when synchronizing a number of processor clocks according to the present invention. First, as will be seen, it may be that certain of the processors are initially not in synchronization. Accordingly, using the values of their processor clock will throw off the average. Thus, as will be seen, the method of the present invention accumulates only the processor clock values of processor clocks that are synchronized. 
     Another consideration: Since each processor clock value is taken at a different time, each includes a different number of average transit times, depending upon where in the chain of transmission the processor clock value was obtained. The sum must be adjusted for these transit time accumulations. 
     Overview of the Apparatus Implementing the Invention: 
     Referring now to FIG. 1, there is illustrated in simplified block diagram a multiprocessor system, designated generally with the reference numeral 10. As shown, the multiprocessor system 10 includes a plurality of processor units 12 interconnected by an interprocessor bus (IPB) system 14. Each of the processor units 12 broadly includes a central processing unit (CPU) 16, an associated memory unit 18, and an interprocessor control unit 20 that connects the CPU to the IPB system 14 for communicating messages to and from other of the processor units 12. The processor unit 12 also includes an input/output (I/O) channel 22 that connects the individual processor units 12 to an input/output (I/O) bus 24 that, in turn, couples each processor unit to peripheral units (not shown) such as tape units, disc drives, terminals, and the like. 
     Interprocessor communications are conducted on the IPB system 14 using one or the other of the IPB buses 14a or 14b. Communications on the IPB system 14 are conducted under the general supervisory control of bus controllers 30 and 32, in combination with operation of the interprocessor control 20 of each processor unit 12. The structure and operation, including interprocessor messaging, is described more fully in U.S. Pat. No. 4,228,496, for MULTIPROCESSOR SYSTEM, which patent is hereby incorporated by reference. 
     Referring now to FIG. 2, there is illustrated, in somewhat greater detail, those parts of each processor 12 that are instrumental in carrying out the present invention. More specifically, as FIG. 2 illustrates, the CPU 16 and memory 18 are interconnected by an address bus 40 that carries addresses generated by the CPU 16 to access selected memory locations of the memory 18 for reading and/or writing data that is carried on the data bus 42. Also included in each processor 12 is a clock signal generator 44. Typically crystal-controlled, the clock generation 44 produces a number of clock signals, including a 1-MHz clock signal that is communicated to a clock counter 46. Clock counter 46 is configured to count the one microsecond increments, from zero to 10,000, of the 1-MHz clock signal. When the clock counter 46 reaches the count of 10,000 (representing 10 milliseconds), the next clock signal pulse causes it to reset to zero, and also generates an interrupt (CLKINTERRUPT) signal to the CPU 16. This causes the CPU 16 to increment a memory location 18a containing a value identified as CLKBASE. CLKBASE is a 64-bit word that forms, together with the clock counter 46, the processor clock for the processor unit 12. At any moment in time, the processor clock value for the processor unit 12 will be the sum of CLKBASE and the content of the clock counter 46. Any further reference to the processor clock value of a processor unit 12 shall be taken to mean this sum, unless otherwise explained. CLKBASE is normally initialized by the operating system to a value which represents the local civil time (i.e, wall clock time) in microseconds since midnight, Dec. 31, 1974. 
     CLKBASE is stored at a memory location 18a (FIG. 2) in the memory 18. Contained in another area of the memory 18, generally referred to as the time control block (TCB), is other state information related to time management of the system clock. For example, included in the TCB, at a memory location 18b, is an average adjustments value (AVGADJUSTMENTS) that is indicative of all adjustments made to CLKBASE by the method described herein. At memory location 18c of the TCB is a total adjustments (TOTALADJUSTMENTS) value that is indicative of all adjustments made to CLKBASE to ensure that it represents local civil time. This value, therefore, includes that adjustment made to set CLKBASE to represent time since Dec. 31, 1974, the AVGADJUSTMENTS value, and any value necessary to fix CLKBASE for daylight saving time adjustment. A &#34;RAW CLOCK&#34; value can be obtained by subtracting TOTALADJUSTMENTS from the sum of the CLKBASE value and the content of the clock counter 46. RAW CLOCK represents the amount of time, in microseconds, since the first processor unit 12 was powered on. During initial power-on sequencing, one of the processor units 12 comes up (begins operating) before the other processor units 12. The first processor unit 12 transfers some of its operating parameters, including RAW CLOCK, to the other processor units 12 as they come on-line. 
     Finally, at memory location 18d of the TCB, there is kept a flag value identified as SYNC. This is a Boolean attribute, identifying (depending upon its state: TRUE or FALSE) to the processor unit 12 whether or not its processor clock is in time synchronization with the processor clocks of the other processor units 12 of the multiprocessor system 10 (FIG. 1). 
     Time Synchronization: An Overview 
     Generally, there are two aspects to clock synchronization which the present invention addresses: First, the invention functions to maintain the synchronization of those processor clocks previously synchronized; second, the invention is used to allow an individual processor unit 12 which, for one reason or another, has just come on-line the needs to set its processor clock, to synchronize itself. 
     The first aspect of the invention involves two phases: In the first phase, a time synchronization (TSYNC) message is created by a designated one of the processor units 12 (called a &#34;locker&#34; processor) and sequentially circulated among all of the processor units 12, via the IPB system 14, to obtain a value from which can be obtained the average of all the processor clocks. The processor unit 12 designated as the locker processor then retransmits the TSYNC message along the same circuitous route of processor units 12 of the system 10. This time, however, each processor unit 12 uses values contained in the TSYNC message to determine the error between its processor clock and the average of all processor clocks. This error is subsequently used to adjust the CLKBASE value for that processor unit 12. 
     In the second aspect of the invention, an &#34;originator&#34; processor unit 12 sends a substantially identical TSYNC message along a substantially identical route of processor units 12 to collect an accumulated clock value from which an average of all processor clocks can be obtained. However, in this second aspect, the TSYNC message is not retransmitted, but is used by the originator processor unit to set its processor clock. 
     Details of the Invention: 
     Referring now to FIG. 3, there is illustrated in flow-chart form the steps taken by either a &#34;locker&#34; or a &#34;non-locker&#34; processor unit, the latter being a processor unit desiring to set or otherwise synchronize its processor clock. As FIG. 3 shows at step 50, the method begins with the creation of a TSYNC message that, at step 52, is sent to the other processor units 12 of the multiprocessor system 10, according to a prescribed routing list, which will be discussed more fully below. The time the message is sent is stored in memory 18 of the originating (locker or non-locker) processor unit 12 at step 54. 
     Referring now to FIG. 4, there is illustrated a diagram of the TSYNC message, designated with the reference numeral 60. The TSYNC message, be it created and sent by a processor unit 12 that is functioning as a locker processor, or by a processor unit 12 merely seeking to set its processor clock, is a 16-word packet (each word being two bytes in length). As FIG. 4 illustrates, the TSYNC message 60 generally includes a five-word header 62 that contains information used by the operating system for the transmission of such (and other) messages from one processor unit 12 to another. The five words of header information 62 is followed by a word 64 containing two fields, an identification (ID) field 66 and a vote count (VOTECNT) field 68. The ID field 66 contains the identification (ID) of the processor unit that created the particular TSYNC message 60. THE VOTECNT field 68 contains a count of those processor units that have contributed their processor clocks to the synchronization process. 
     Continuing, the seventh word 70 of the TSYNC message is a routing mask, containing information concerning the sequence of processor units 12 that the TSYNC message 60 will be circulated among. In the present system, there can be up to 16 individual processor units 12. Each of the processor units 12 is identified by a bit position of the routing mask word 70. If the bit position is TRUE, the processor is present; if the bit position is FALSE, the processor unit is, in effect, nonexistent. Conceptually, for purposes of the discussion of this invention, the topology of the processor unit 12 and the interprocessor bus 14 may be thought of as ring-like, with each processor unit 12 connected to two neighbor processor units 12. Thus, we can talk about the &#34;next processor unit on the right&#34; to mean the next highest-numbered processor unit 12, except in the case of the highest-numbered processor unit in the system, where the next processor unit on the right is the lowest-numbered processor unit in the system. The routing mask word 70 maintains this concept, where each processor unit in this &#34;hierarchy&#34; is identified by a predetermined bit position of the routing mask word 70. Each processor unit 12 contains a data structure, in memory 18 (FIG. 2), from which the routing mask 70 can be formed. 
     Following the routing mask word 70 is a group of four words 72 which provide space for a sum (CLKSUM) of all processor clocks (that are in synchronization) of the system 10. As the TSYNC word 60 is sequentially circulated among the processor units 12, each adds its processor clock value at the time of receipt to the CLCKSUM value and retransmits the message 60. 
     The four-word CLKSUM field 72 is followed in the TSYNC message 60 by message word 74, containing four fields: A first field (P1CPUCNT) contains information identifying the number of processor units 12 that have actually seen the TSYNC message during its first routing; a second field (P2CPUCNT) contains information identifying the number of processor units 12 that have seen the message at any point in time during its second passage among the processor units 12; a third field (P2) identifies whether the TSYNC message is in its first or second pass; and, finally, a fourth, one-bit field (L) identifies whether the TSYNC message 60 was initiated by a locker processor unit, or a non-locker processor unit (one desiring to set its processor clock). 
     Following the four field message word 74 is a message word containing a value identified in FIG. 4 as TRANSITSUM.P1. This value, as will be seen, is indicative of the amount of individual processor-to-processor transits, and is used in the computation that adjusts the CLKSUM value to account for the time elapsed in the first pass transit of the TSYNC message. 
     The TSYNC message 60 terminates in another four-word group that contains a value indicative of the average processor-unit-to-processor-unit transit time during a first pass of the TSYNC message 60. 
     Receipt of the Time Synchronization Message: First Pass 
     FIG. 5 diagrams the steps taken by each processor unit 12 when a TSYNC message is received. As the flow chart of FIG. 5 indicates, the first activity performed by the receiving processor unit 12 is to store, in the TCB, (FIG. 2) the time of receipt (using RAW CLOCK) of the TSYNC message, together with the identification (ID--from message word 64) of the creator of the TSYNC message being received. At 82, the receiving processor unit 12 determines whether the just-received TSYNC message is on its first pass or second pass by checking the P2 field of the TSYNC message word 74. If FALSE, indicating the message is in its first pass, activity presses to step 83. If, however, the P2 flag is TRUE, activity is transferred to routine C, illustrated in FIG. 6, which will be discussed below. 
     The processor unit 12 next checks, at 83, memory location 18d of the TCB to determine if its processor clock has previously been set and is in synchronization with the clock of at least one other processor unit 12 of the multiprocessor system 10. The reason for this step, as indicated earlier, is to ensure that the method is not degraded by creating large variances by incorporating processor clocks that are not in synchronization. For example, the system is structured for fault-tolerant operation, allowing processor units to be removed and replaced almost at will. When they are replaced, the system clock of that processor is indeterminate until set, and could significantly affect any averaging method if incorporated. Accordingly, until set, each processor unit contains in its TCB area of memory 18 the SYNC flag at memory location 18d which, when the system clock of the processor unit is set and synchronized, is set to a TRUE. 
     If, however, the SYNC flag is FALSE, indicating that the system clock of the processor is yet to be synchronized, the processor unit 12 will proceed to step 86 to determine if the TSYNC message was originated by this processor unit 12 by checking the ID again. If not, processor unit 12, at step 88, with resend the TSYNC message to the next processor unit 12 on its right. 
     If, on the other hand, the test at step 84 is TRUE, indicating the processor unit 12 is in synchronization (and, therefore, eligible to contribute to the synchronization process), the processor unit will proceed from step 84 to step 90, and perform the following steps: 
     a. First, it will add the value of its processor clock (more accurately, RAW CLOCK) to the CLKSUM field 72 (FIG. 4) of the TSYNC message; 
     b. The VOTECNT field 68 (message word 64) will be incremented to indicate that the processor unit 12 has contributed to the synchronization method; and 
     c. The processor unit 12 will add the value of VOTECNT to the value contained in the TRANSITSUM field, creating or maintaining a value that indicates how many processor-to-processor transits are incorporated in the CLKSUM value. 
     The processor unit 12 proceeds to step 86 to check the ID field 66 of the TSYNC message 60. If the ID value matches that of the processor, indicating that the message originated from that processor unit, the path to step 100 is taken. On the other hand, if the ID value does not match that of the processor unit 12, it will then proceed to step 88, where the TSYNC message is sent to the processor unit 12 &#34;on its right&#34; according to the routing mask 70, and return to other activity. 
     To pause and review briefly, the method of the invention so far described, synchronization of the processor clocks proceeds, initially, substantially as follows: A processor unit 12 (locker or non-locker) creates and sends a TSYNC message 60 (FIG. 3) that includes a routing mask (word 70) specifying the order of circulation of the TSYNC message by the other processor units 12 of the multiprocessor system 10 (FIG. 1). In turn, each of the other processor units 12 will receive the TSYNC message and, depending upon whether or not its own system clock is in synchronization, will add its system clock to the CLKSUM value carried by the TSYNC message 60, update various &#34;counters&#34; (fields of the TSYNC message 60) to indicate that (1) it had seen the message and (2) it &#34;voted&#34; (i.e., added its system clock to CLKSUM), and then send the message to the next processor unit in line. 
     Ultimately, the TSYNC message 60 will travel its full route, being passed by each processor unit 12 to the next, returning to the processor unit 12 that created it. The processor unit 12 that originated the TSYNC message, regardless of whether it is the locker processor (i.e., one given responsibility of periodically creating and sending TSYNC messages to maintain the synchronization of all processor clocks of the system 10) or a non-locker processor unit (one that created and sent the TSYNC message in order to synchronize its processor clock) proceeds initially in the same manner as other processor units 12 did, i.e., executing the steps 80, 82, 84 and 90 described above. And, reaching step 86, the processor unit 12 discovers from an evaluation of the ID that it was the one that created the TSYNC message. 
     Proceeding to step 100, the processor unit 12 computes an average processor-to-processor transit time (AVGTRANSITIME.P1) for the first pass. This value is computed by subtracting the time value stored in step 54 (FIG. 3) from the time value stored in step 80 (FIG. 5), giving the elapsed time for pass one, and dividing the result by the number of processor units 12 that had seen the message, which number is indicated by the value of P1CPUCNT of the TSYNC message 60. 
     If there is heavy bus traffic, the TSYNC message could be delayed. If it is delayed, it may not be useable; the invention relies upon relatively equal first pass transit times. In order to determine whether or not an unacceptable delay has been encountered between the time the TSYNC message was sent and ultimately received by the originator processor unit 12, a minimum first pass average transit time is maintained in the TCB of memory 18. For locker processor units, the computed first pass average transit time, TRANSITIME.P1, is compared at step 102 to a minimum observed transit time, and if found to exceed the minimum time by more than 100 microseconds the TSYNC message is not allowed to proceed into the second pass. If the originator processor unit was one that needed to set its system clock, and the message unacceptably delayed, a new TSYNC message 60 is created and sent. 
     For non-locker (unsynchronized) processor units, there is no maintained minimum average transit time. There is, in its place, however, an initial pre-determined minimum used for synchronization purposes (installed during an initial boot of the processor unit). It is this value that the computed TRANSITIME.P1 is compared, as described. If the comparison is unfavorable, the method ends. 
     If the comparison at step 102 is deemed acceptable, however, for either a locker or non-locker processor unit, TRANSITSUM.P1 is stored in the TSYNC message (at message word 76) by step 104, the pass two (P2) flag is set (step 106), and the method proceeds to routine C (FIG. 6). 
     Time Synchronization, Initiation of Pass Two: 
     Routine C is entered from step 82 (FIG. 5) when the TSYNC message is received by a processor unit and found to be in a second pass. This situation is discussed further below in the section designated &#34;Second Pass Processing.&#34; 
     Routine C is also entered at the completion of the first pass circulation of the TSYNC message from step 106. Step 106, however, has transformed the TSYNC message from a first pass message to a second pass message by setting the P2 flag in message word 74. Thus, in effect, regardless of how routine C is entered, its purpose is to process pass two TSYNC messages. The first processor unit 12 to process the now pass-two TSYNC message is the locker. 
     Second Pass Processing: 
     Routine C begins by comparing the ID value of the TSYNC message to that of the processor unit 12. If they do not match, the message is discarded, and operation ends. If, on the other hand, the check is VALID, TRANSITIME.P2 is computed in a manner described below. Next, using CLKSUM, an average clock time is computed at step 118 (also described further below). Assume, for the moment, that the TSYNC message was created by a processor unit 12 desiring to synchronize its processor clock, i.e., a non-locker processor unit, and that this processor unit 12 has now received back the TSYNC message it created. At step 120, the processor unit 12 finds (under the assumption here) that it is not in synchronization (i.e., it is a non-locker processor unit that created the TSYNC message), and, therefore, proceeds to step 122 where it sets its processor clock using the computed average clock time. The processor unit 12, at step 124, sets the SYNC flag at memory location 18d (FIG. 2) and ends the synchronization operation. 
     If, on the other hand, step 120 determines that the TSYNC message is one created by a locker processor unit 12, processing proceeds from step 120 to 126 for second-pass processing. 
     The TSYNC message 60, during its second pass circulation, carries to each of the processor units 12 the sum of the synchronized system clocks of the processor units 12, as opposed to a calculated average. When received by a processor unit 12, it processes the second pass of the TSYNC message 60 initially in the same manner as it did the first pass message--illustrated in FIG. 5. The TSYNC message is received and processed according to step 80; that is, the time the second pass TSYNC message is received is stored in memory 18 by the processor unit 12, together with the ID value. The P2 value is checked at step 82 to determine which pass this TSYNC message is traveling. This time, however, the P2 field will be found to be TRUE, indicating the message is on its second pass. Therefore, rather than continuing to step 84, processing branches to that portion of the sequence of steps illustrated as routine C in FIG. 6. 
     At step 112 (FIG. 6) the ID value is checked and compared with the ID value stored in step 80 (FIG. 2) to ensure that this is the proper TSYNC message. If the values do not match, the TSYNC message is not valid, and the processor unit 12 discards the message; it is not retransmitted. If, on the other hand, the ID fields match, the TSYNC message received is considered a valid second pass message. The processor unit 12 proceeds to step 116, and computes the pass-two average transit time, that is, the average processor-unit-to-processor-unit transit time in the second pass. This value is obtained by the processor unit 12 by proceeding as follows: 
     a. First, the total time that elapsed since the processor unit 12 first saw the TSYNC message (in its first pass) is computed by subtracting the RAW CLOCK value saved in the TCB at step 80 (FIG. 5) during first-pass processing from the RAW CLOCK value stored at step 80 during receipt of the second pass of the message. 
     b. The processor unit 12 then determines how many processor-to-processor transits there were between it and the locker processor unit 12 from the routing mask, and multiplies this number by the TRANSITSUM.P1 value contained in word 76 of the TSYNC message. This value represents the time the TSYNC message took to end its first pass travels and return to the processor unit 12. 
     c. The processor unit 12 then computes the time the TSYNC message has been in transit during this second pass by subtracting the first pass transit time (computed above in &#34;b&#34;) from the total elapsed time found in &#34;a&#34; above. This is TRANSITIME.P2. 
     Next, at step 118, the instantaneous average of all synchronized processor clocks (AVGCLOCK) is computed by the processor unit 12. At this time, it may be advantageous to look more closely at the CLKSUM value contained in the second pass of the TSYNC message. As indicated above, CLKSUM is the sum of the values of each processor clock of each processor unit 12 plus the time the TSYNC message was in transit to any particular processor unit 12. For example, if a particular processor unit was fourth in line as determined by the routing mask word 70 (i.e., there are three processors between it and the processor unit that created and sent the TSYNC message), the processor clock value that is added to CLKSUM by that (fourth in line) processing unit (during first pass processing of the TSYNC message) incorporates four processor-to-processor transit times. In similar fashion, the next processor unit 12 that adds its processor clock value to CLKSUM, will again add the same four transit times, plus the additional transit time. It can be seen, therefore, that the particular way CLKSUM is derived includes a number of transit times that are somewhat like a triangular summation. The total number of transits that are represented in CLKSUM are found in the TRANSITSUM.P1. 
     With the foregoing in mind, each processor unit 12 that receives the second pass TSYNC message (and is eligible to do so) computes the instantaneous updated average of all synchronized processor clocks of processor units 12 in the following manner: 
     a. The amount CLKSUM must be adjusted to account for time in transit (first pass). A value, T ADJ , is computed by multiplying the pass one TRANSITIME value by the number of pass one transits, i.e., TRANSITSUM.P1. 
     b. This value T ADJ , is added to the CLKSUM value, and the result divided by the number of processor units 12 that contributed to CLKSUM by adding the value of their processor clocks thereto, i.e., VOTECNT. 
     c. Finally, to account for second pass transit time, the second pass transit time computed above is added to the previously computed average to obtain the instantaneous average for the processor 12 then possessing the TSYNC message. 
     Next, at step 120, the &#34;sync&#39;d?&#34; check is made. If the processor unit 12 is not in synchronization, the branch to step 122, described above, is taken. If it is synchronized, step 126 is entered and the difference between the processor unit 12 system clock and the computed instantaneous average is determined and stored in the processor&#39;s memory 18 is an &#34;error&#34; value. This error value is used to synchronize the system clock of the processor unit 12 in the following manner: TSYNC messages are created and sent by the locker processor unit approximately every ten seconds. Accordingly, during the time that any processor unit 12 receives sequential second pass messages, it will increment or decrement its CLKBASE value at 0.3 second intervals during this approximate ten-second period. Any 0.3 second change will not exceed 50 microseconds. This is the maximum amount CLKBASE can be changed transparently to the system because the time spent adjusting CLKBASE exceeds 50 microseconds. In this manner, the processor clock appears monotonically increasing. 
     Finally, at step 130, the TSYNC message is sent to the processor unit at the right. 
     Attached hereto, and identified as Appendix I, is the source code listing for the method of the above-described invention. ##SPC1##
Disclosed is a method, and apparatus implementing that method, for synchronizing and managing the "system clocks" maintained by each of a number of processor units forming a multiprocessor system. Based on an averaging technique, the method includes creating a synchronization message by an originator processor unit and routing that message to other of the processor units to obtain clock values representative of each of the system clocks of each processor unit. The average clock value is then determined and that average clock value then rerouted to each of the processor units to permit them to update, if necessary, their individual system clocks to the average of all. The method further includes determining the transit times encountered by the various messages so that each processor unit can adjust the average clock value it will use to update or synchronize its system clock to account for such transit times.