The present application relates generally to methods and systems for just-in-time static translation for emulated computing environments. In particular, the present application relates to an event logger for a just-in-time static translation system.
Many software applications, in particular those that require a large degree of data security and recoverability, are traditionally supported by mainframe data processing systems. Such software applications may include those associated with utility, transportation, finance, government, and military installations and infrastructures. Such applications are generally supported by CMOS based mainframe systems, because mainframes provide a large degree of data redundancy, enhanced data recoverability features, and sophisticated data security features. These mainframes implement proprietary instruction sets and architectures.
As “off-the-shelf” commodity data processing systems have increased in processing power, there has been movement towards using such systems to support industries that historically employed mainframes for their data processing needs. These computer systems may be used to update legacy data, which may include records from any of the aforementioned sensitive types of applications. This scenario presents several challenges.
First, as previously alluded to, the Operating Systems (OS's) that are generally available on commodity-type systems do not include the security and protection mechanisms needed to ensure that legacy data is adequately protected. For instance, when a commodity-type OS such as Windows or Linux experiences a critical fault, the system must generally be entirely rebooted. This involves reinitializing the memory and re-loading software constructs. As a result, in many cases, the operating environment, as well as much or all of the data that was resident in memory at the time of the fault, are lost. The system is therefore incapable of re-starting execution at the point of failure. This is unacceptable in applications that require very long times between system stops.
In addition, commodity OS's such as UNIX and Linux allow operators a large degree of freedom and flexibility to control and manage the system. For instance, a user within an UNIX environment may enter a command from a shell prompt that could delete a large amount of data stored on mass storage devices without the system either intervening or providing a warning message. Such actions may be unintentionally initiated by novice users who are not familiar with the often cryptic command shell and other user interfaces associated with these operating systems. In such situations, it is important to restrict access to the underlying infrastructure to ensure security and reliability.
In some cases, these concerns are addressed by executing a mainframe emulator upon a Linux operating system that is in turn executing upon commodity instruction processors. One example arrangement of such an emulated environment is illustrated in
In operation, the server 10 cannot natively execute instructions of the emulated operating system 26 or applications 28a-x, as they are written using a different instruction set architecture that is incompatible with that provided by the server 10. Accordingly, the emulator 18 fetches one non-native (e.g., mainframe) instruction at a time from emulated main memory (via an interface to the memory management subsystem 22), and translates that instruction to one or more native instructions of the instruction set architecture supported by the server 10. The server 10 then executes the instruction using the native instruction set architecture.
Such systems have a number of drawbacks. For example, instruction-by-instruction dynamic translation can be resource intensive. Furthermore, for such translated code streams, it is necessary to ensure that the computing system is capable of performing each of the operations required by the software. This is especially the case when mainframe software is executed, because that type of software typically is required to have a higher degree of reliability and less tolerance for downtime. Addition of validation features to an instruction-by-instruction, dynamic translation system can be resource intensive.
In general three levels of debug and test are necessary to verify that the translation mechanism is working correctly, and to determine its performance: unit testing, product testing, and system testing. Such testing features typically must be accounted for in a system that executes or emulates a mainframe system, to ensure continued reliability. Inclusion of robust testing, debug, and performance monitoring features is often inconsistent with execution on a commodity system, which is typically not as robust as a mainframe system. As such, existing solutions do not provide a compelling solution for performance testing and validation of emulated systems, and in particular emulated mainframe systems. Nevertheless, such testing systems are necessary in many cases to determine performance advantages of various system configurations.
System testing for such emulated systems is further complicated because, when testing such systems for performance or validation reasons, it can be difficult to determine an appropriate time to add such performance testing features. Additionally, none of these existing testing arrangements provide for testing or benchmarking of comparative execution between static and dynamic translation within the same system, or would provide an integrated solution for testing advantages of at least partially static translation systems.
For these and other reasons, improvements are desirable.
In accordance with the following disclosure, the above and other issues are addressed by the following:
In a first aspect, a method includes executing a workload in a computing system having a native instruction set architecture, the workload stored in one or more banks of non-native instructions. At least a portion of the workload is further included in one or more banks of native instructions and executing the workload comprises executing at least part of the workload from the one or more banks of native instructions. The method also includes determining an amount of time during execution of the workload in which the execution of the workload occurs from the one or more banks of native instructions. The method includes generating a log including performance statistics generated during execution of the workload, the performance statistics including the amount of time.
In a second aspect, an event logger for a just-in-time static translation system is disclosed. The event logger includes program instructions executable on a computing system having a native instruction set architecture and upon which the just-in-time static translation system is implemented. The instructions cause that computing system to execute a workload stored in one or more banks of non-native instructions, wherein at least a portion of the workload is further included in one or more banks of native instructions and at least a part of the workload is capable of execution from the one or more banks of native instructions. The instructions also cause the computing system to determine an amount of time during execution of the workload in which the execution of the workload occurs from the one or more banks of native instructions, and generate a log including performance statistics generated during execution of the workload, the performance statistics including the amount of time.
In a third aspect, a computer-storage medium having computer-executable instructions stored thereon is disclosed. The computer-executable instructions include instructions written for execution on a computer having a native instruction set architecture. The computer-executable instructions, when executed, cause the computing system to perform a method including executing a workload on the computing system. The workload is stored in one or more banks of non-native instructions, and at least a portion of the workload is further included in one or more banks of native instructions and executing the workload comprises executing at least part of the workload from the one or more banks of native instructions. The method also includes detecting one or more bank transfer instructions during execution of the workload, thereby determining an amount of time during execution of the workload in which the execution of the workload occurs from a bank of native instructions selected from among the one or more banks of native instructions. The method further includes generating a log including performance statistics generated during execution of the workload, the performance statistics including the amount of time.
Various embodiments of the present invention will be described in detail with reference to the drawings, wherein like reference numerals represent like parts and assemblies throughout the several views. Reference to various embodiments does not limit the scope of the invention, which is limited only by the scope of the claims attached hereto. Additionally, any examples set forth in this specification are not intended to be limiting and merely set forth some of the many possible embodiments for the claimed invention.
The logical operations of the various embodiments of the disclosure described herein are implemented as: (1) a sequence of computer implemented steps, operations, or procedures running on a programmable circuit within a computer, and/or (2) a sequence of computer implemented steps, operations, or procedures running on a programmable circuit within a directory system, database, or compiler.
In general the present disclosure relates to methods and systems for event logging in a just-in-time static translation system. The methods and systems disclosed herein are particularly applicable in the context of execution of workloads, including known workloads such as benchmarks, on a system that emulates execution of a non-native system by executing from one or more banks of instructions that are native instructions, pretranslated from the non-native instructions that represent the workload. According to the various embodiments herein, a variety of types of information can be captured describing performance of a just-in-time static translation system on a particular workload. In some embodiments, known workloads, such as benchmarks, can be used to determine relative performance of a just-in-time static translation system as compared to a traditional static or dynamically translated emulation system, to determine comparative performance, or to otherwise identify possible areas for performance improvement.
Referring now to
In the embodiment shown, the server 110 includes a firmware layer 112, an interface layer 114, and an installation layer 116. The firmware layer 112 and the installation layer 116 are each communicatively connected to the interface layer 114. As with other emulation systems, the firmware layer 112 and installation layer 116 can be used for booting the server 110, as well as starting one or more system services required to interact with hardware present in the server 110. The interface layer 114 generally represents an operating system maintaining the interface between hardware resources of the server 110. The interface layer 114 can be, in certain embodiments, an operating system compiled for execution on a native instruction set architecture, such as a Linux- or Unix-based operating system. In alternative embodiments, other operating systems could be used, such as a Windows operating system provided by Microsoft Corporation of Redmond, Wash.
In the embodiment shown, the interface layer 114 includes an emulator 118, as well as hardware interface systems such as one or more I/O drivers 120, as well as a memory management subsystem 122 and a clock 124. The hardware interface systems 120-124 generally are used by the interface layer 114 for generalized operation, and are made available to an emulated operating system 126 by the emulator 118 hosted within the interface layer 114. Any of a variety of emulated operating systems can be used, such that the emulated operating system is implemented using a non-native instruction set architecture. In one possible embodiment, the emulated operating system is the OS2200 operating system provided by Unisys Corporation of Blue Bell, Pa. Other emulated operating systems could be used as well, but generally refer to operating systems of mainframe systems.
The emulated operating system 126 can host execution or one or more applications 128a-x (in the illustration shown, 3 such applications 128a, 128b, and 128x are shown). The applications 128a-x are generally maintained in a memory managed by the emulated operating system 126 by separating that memory into memory banks In the context of the present disclosure, these memory banks are also referred to as non-native memory banks, or banks of non-native instructions. This means that the applications 128a-x defined by the instructions maintained in those banks are written for execution on a non-native instruction set architecture not directly executable by the server 110. Although the size of such memory banks may vary based on the emulated operating system used, in a possible embodiment each memory bank has a size of 262 k words. Other memory bank sizes may be used as well.
In contrast to prior art systems, the interface layer 114 as illustrated in this embodiment also includes a linker component 130, an unlinker component 132, and a bank transfer module 134, each of which are interfaced to one or more translated memory banks in a data store 136. The translated memory banks correspond to emulated, non-native memory banks managed by the emulated operating system 126, but are translated into native instructions, which can be directly executed on the server 110 without requiring further instruction-by-instruction translation.
The linker component 130 manages association of one or more of the translated memory banks in the data store 136 to the emulator 118, which selectively directs execution either (1) from a translated memory bank, natively on the server 110, or (2) based on instruction-by-instruction translation from a non-native memory bank defined by the emulated operating system 126, if no translated memory bank exists or is capable of being linked to the emulator 118.
The unlinker 132 disassociates translated memory banks from the emulator 118. For example, in certain embodiments, only a predetermined number of memory banks can be associated at once with the emulator, for example due to physical memory constraints of the server 110. In such circumstances, only a subset of the available translated memory banks in the data store 136 may be linked to the emulator 118 at once. When a maximum number of translated memory banks has been reached but operation of an application has transferred to an unlinked (but translated) memory bank, one of the currently linked memory banks is disassociated from the emulator 118 by the unlinker 132 (e.g., based on being a least recently used translated memory bank, or other analogous scheme). This will allow the linker 130 to associate the relevant unlinked translated memory bank with the emulator 118 for native execution on the server 110.
The bank transfer module 134 transfers memory banks of non-native instructions to the data store 136, where they can be accessed and translated by a translator component. Additional details regarding translation are provided below.
In use, when the emulator 118 fetches an instruction that transfers control from one bank to another a check is made to see if a translated version of that memory bank has been linked to the emulator 118 within the interface layer 114. If the bank has been linked, the emulator 118 will call the bank directly within the interface layer. The bank executes directly on the instruction processor associated with the server 110, and continues to execute within that environment until another bank transfer or an error exception occurs.
In certain embodiments, overall management of memory banks is provided by the emulated operating system 126, such that the emulated operating system defines one or more memory banks of non-native instructions forming an application to be executed; as needed, the emulated operating system can then trigger translation of the non-native instructions in a particular memory bank to native instructions. The emulated operating system 126 can, when the translated memory bank is formed, trigger operation of the linker 130 to link the translated memory bank to the emulator 118, which can direct execution to occur from the native instructions included in that linked, translated memory bank. As such, the loading, linking, and unlinking of memory banks is controlled by the emulated operating system 126. This provides the necessary reliability in that the emulated operating system controls memory bank management, as opposed to allowing translation at a lower level (e.g., by the emulator 118 or interface layer 114.
It is noted that, if a problem occurs during translation of a memory bank or native execution from that memory bank, operation can revert to execution from an emulated memory bank of non-native instructions, using traditional instruction-by-instruction translation. The translated memory bank can then be examined for errors. Furthermore, the emulated operating system 126 can generate hash values associated with each of the translated memory banks, such that a mismatched hash value may indicate an error or tampering with that translated memory bank, and would trigger retranslation of the non-native version of that memory bank. Additionally, by translating the memory banks to native instructions, those native instructions can be scheduled and executed using the interface layer 114 and instruction set architecture of the server 110. Accordingly, the particular instruction set architecture and organization of the processing units in the server 110 can be utilized, including registers, memory, out-of-order execution techniques, and other efficiencies that would otherwise be unavailable if instruction-by-instruction translation in an emulator were the only mechanism available. Furthermore, using the system 100 as illustrated, it is unnecessary to translate an entire environment to be emulated before execution; rather, only portions might be pretranslated, such as banks containing frequently-executed code. Additionally, in multiprocessor or multithreaded hardware systems, separate cores or threads could be used for execution of translated banks and translation of untranslated, non-native code to native instructions. Other advantages are realized through use of the system 100 as well.
It is noted that in some cases, execution of an instruction using the emulator 118 for instruction-by-instruction translation and execution can be more efficient than execution from a translated bank of instructions. This would be the case, for example, with instructions or instruction sequences that are complex, such that an exception that would occur at bank execution time would result in reduced efficiency of execution from the bank of instructions (i.e., in a non-predictable manner). For example, if an instruction causes an out-of-bounds memory reference, the emulator would better handle such an arrangement, as compared to using JIT execution, which would require roll-back to the pre-instruction state and hand-off of execution back to the emulator. Additionally, instructions that interface with the hardware or any host software or operating system software may involve inefficiencies if executed from pretranslated instruction banks In such cases, using performance and event logging can detect such circumstances, and would indicate to a developer of a JIT static translation system how to judiciously provide translated banks for execution to maximize performance of such a system.
Referring now to
In the embodiment shown, the memory 200 includes instructions and data stored according to both a native format (executable directly by hardware of a computing system), and a non-native format (e.g., requiring translation or emulation by software on the computing system). In the embodiment shown, the memory 200 has separate partitions, including a non-native partition 204 and a native partition 206. However, in various embodiments, separate partitioning of the memory may not be required.
In the embodiment shown, the non-native partition 204 stores instructions and data that would be associated with or directly executable on a non-native system, such as the OS2200 system described above. In this embodiment, the non-native partition includes the emulated operating system 126 of
In the embodiment shown, the native partition 206 includes a variety of native applications discussed above which are required to perform the JIT translation and/or bank management, including the linker and/or unlinker 130,132 and the bank transfer module 134. Operation of these modules is discussed generally above, and in further detail in copending U.S. patent application Ser. No. ______, filed ______, and entitled “JUST-IN-TIME STATIC TRANSLATION SYSTEM FOR EMULATED COMPUTING ENVIRONMENTS” (Docket No. RA5939), the disclosure of which is hereby incorporated by reference in its entirety.
The native partition 206 includes additional native instructions and data; in the embodiment shown, this includes native operating system and application data 212, as well as one or more translated banks 210. The translated banks 210 generally correspond to native translations of some or all of the non-native banks 208, for example as might be pretranslated and stored for execution by the JIT system 100 of
The native operating system and application data 212 corresponds to software written for execution on a computing system according to a native instruction set architecture; in the example illustrated above in
In the embodiment shown, the non-native partition 204 also includes a logger component 214 which is configured to execute in conjunction with a JIT system such as the one illustrated in
Overall, the data structures illustrated in
Referring now to
The code streams 300a-b represent best case (in the example of stream 300b) and worst case (in the example of stream 300a) performance when executing a code stream, because executing only translated banks means that no translation overhead need occur during execution of the workload. In contrast, executing only untranslated, non-native code (as in the workload 302 of code stream 300a) represents a great deal of overhead, since each instruction must be serially fetched, decoded, translated to native code, and executed (thereby introducing a great deal of translation overhead).
As can be seen in
Referring now to
Referring now to
Referring now to
A start operation 602 generally corresponds to initialization of execution of the JIT system. A boot system operation 604 boots the system into a testing mode, for execution of one or more workloads with associated event logging enabled. The one or more workloads, which can include benchmarks or other application programs, are loaded into the non-native memory, and optionally one or more of the application programs is pre-translated into native banks, as previously discussed. A test execution operation 606 executes a test based on one or more of the loaded workloads. One example implementation of the test execution operation 606 is illustrated in
A stop operation 608 ends the test and associated counter gathering operations, to the extent applicable/enabled. A performance monitoring assessment operation 610 determines whether performance monitoring was enabled during execution of the workload. If performance monitoring was enabled, operational flow branches “YES” to a counters operation 612, which gathers counters from the non-native memory resources (e.g., the emulated register file 504 discussed above), and processes the gathered counters to generate one or more log files illustrating an execution profile associated with the workload. An example of a log file generated from a benchmark workflow is discussed below in conjunction with
Following the counters operation 612, or alternatively upon determining that performance monitoring was not enabled as determined by the performance monitoring assessment operation 610 (and associated branch “NO”), operational flow proceeds to an exit operation 614. The exit operation 614 corresponds to completion of the workload and associated statistical gathering, and termination of operation of the JIT system.
Referring now to
In the embodiment shown, the method 700 is instantiated at a start operation 702, which starts operation of the emulator (e.g., emulator 502 of
If the instruction fetched is a bank transfer instruction as determined by the bank transfer assessment operation 706, a bank transfer call occurs, and operational flow branches “YES” to a bank transfer operation 708, which is executed to change operational banks from which the system executes. The bank transfer operation 708 can include a variety of different types of operations; one example bank transfer operation is illustrated in further detail in
Regardless of whether the instruction was a bank transfer instruction or not, operational flow then proceeds to a performance monitoring operation 712, which assesses whether performance monitoring has been activated for the currently-active bank being executed. If performance monitoring has been activated, operational flow branches “YES” to a counters operation 714, which tracks and updates counters relating to current execution. For example, the counters operation 714 may increment the number of non-native instructions which have been performed in the bank, the elapsed time during which the bank has been executed, or other counter values. Following updating of the counters, or alternatively if performance monitoring was not activated (resulting in an operational flow branch “NO”), flow proceeds to a stop assessment operation 716. The stop assessment operation 716 determines whether the emulator is to be stopped. This may be because, for example, the emulator has received a command to stop, or has reached the end of a particular workflow, or other reasons.
If the emulator is not intended to stop, operational flow branches “NO” and returns to the next instruction operation 704, described above. However, if the emulator is intended to stop, operational flow branches “YES” to a stop operation 718.
Referring now to
In the embodiment shown, the method 800 is instantiated at detection of a bank transfer instruction, depicted as a bank transfer instruction detection operation 802. A bank execution assessment operation 804 determines whether the bank is intended to be executed directly (i.e., from a native, translated bank), or whether the bank is intended to be emulated, using instruction-by-instruction fetching and emulated execution of non-native instructions. If the bank execution assessment operation 804 determines that a native bank should not be executed (e.g., is unavailable, erroneous, or otherwise should not be used), operational flow branches “NO” to an execution operation 806, which receives the instruction and emulates execution of the instruction based on a single-instruction decode and execution process. However, if the bank execution assessment operation 804 determines that a native bank is available and should be executed, operational flow branches “YES” to a bank execution operation 808 which calls the bank of native, translated instructions to be executed. For example, the bank execution operation 808 can include a call to an ExecuteBank( ) function, referencing the identity of the bank which is to be natively executed.
From the bank execution operation 808, a performance monitoring operation 810, which assesses whether performance monitoring has been activated for the currently-active bank being executed. If performance monitoring has been activated, operational flow branches “YES” to a counters operation 812, which tracks and updates counters relating to current execution. For example, the counters operation 812 may increment the number of non-native instructions which have been performed in the bank, the elapsed time during which the bank has been executed, or other counter values. Following updating of the counters, or alternatively if performance monitoring was not activated (resulting in an operational flow branch “NO”), flow proceeds to a stop assessment operation 814. Additionally, the stop assessment operation 814 is reached from the execution operation 806.
Referring to
The results output from the JIT system (and collected by data collection component 508 of
Referring now to
In the embodiment shown, the text file includes an identifier of a plurality of different native banks, a number of times each of those banks was invoked during execution of a particular workflow, a total number of equivalent non-native instructions that were performed by those banks, as well as a total number of native cycles of a native processing unit that have elapsed. From this data, a variety of different types of additional information could optionally also be generated, such as a total amount of time elapsed during execution of each bank (e.g. cycles as adjusted by a known clock speed of the native processing unit), average instructions per clock within each bank, or other statistical information.
In alternative embodiments, other types of data could be captured using the event logging arrangements described herein. For example, cache hit rates, branch-mis-predictions, or other performance-affecting counters available on the native instruction set architecture could be captured. These may be useful, in connection with information about the particular non-native instructions executed and numbers of such non-native instructions executed, to determine reasons why the JIT translation execution either is or is not more efficiently-executed than the traditional, instruction-by-instruction emulation provided by emulator 118.
Additionally, as discussed above, various permutations of a single workload could be performed using different activated banks, to see relative performance differences of the overall system when one or more banks are either available or unavailable for native execution. Using such comparative tests, it is possible to determine and quantify performance advantages that are gained from pretranslation of banks, to allow a user to determine an optimal number and selection of banks to be pretranslated. Various other advantages relating to performance analysis are made possible by the event logging described herein as well.
Referring now to
In the example of
The processing system 1004 includes one or more processing units. A processing unit is a physical device or article of manufacture comprising one or more integrated circuits that selectively execute software instructions. In various embodiments, the processing system 1004 is implemented in various ways. For example, the processing system 1004 can be implemented as one or more processing cores. In another example, the processing system 1004 can include one or more separate microprocessors. In yet another example embodiment, the processing system 1004 can include an application-specific integrated circuit (ASIC) that provides specific functionality. In yet another example, the processing system 1004 provides specific functionality by using an ASIC and by executing computer-executable instructions.
The secondary storage device 1006 includes one or more computer storage media. The secondary storage device 1006 stores data and software instructions not directly accessible by the processing system 1004. In other words, the processing system 1004 performs an I/O operation to retrieve data and/or software instructions from the secondary storage device 1006. In various embodiments, the secondary storage device 1006 includes various types of computer storage media. For example, the secondary storage device 1006 can include one or more magnetic disks, magnetic tape drives, optical discs, solid state memory devices, and/or other types of computer storage media.
The network interface card 1008 enables the computing device 1000 to send data to and receive data from a communication network. In different embodiments, the network interface card 1008 is implemented in different ways. For example, the network interface card 1008 can be implemented as an Ethernet interface, a token-ring network interface, a fiber optic network interface, a wireless network interface (e.g., Wi-Fi, WiMax, etc.), or another type of network interface.
The video interface 1010 enables the computing device 1000 to output video information to the display unit 1012. The display unit 1012 can be various types of devices for displaying video information, such as a cathode-ray tube display, an LCD display panel, a plasma screen display panel, a touch-sensitive display panel, an LED screen, or a projector. The video interface 1010 can communicate with the display unit 1012 in various ways, such as via a Universal Serial Bus (USB) connector, a VGA connector, a digital visual interface (DVI) connector, an S-Video connector, a High-Definition Multimedia Interface (HDMI) interface, or a DisplayPort connector.
The external component interface 1014 enables the computing device 1000 to communicate with external devices. For example, the external component interface 1014 can be a USB interface, a FireWire interface, a serial port interface, a parallel port interface, a PS/2 interface, and/or another type of interface that enables the computing device 1000 to communicate with external devices. In various embodiments, the external component interface 1014 enables the computing device 1000 to communicate with various external components, such as external storage devices, input devices, speakers, modems, media player docks, other computing devices, scanners, digital cameras, and fingerprint readers.
The communications medium 1016 facilitates communication among the hardware components of the computing device 1000. In the example of
The memory 1002 stores various types of data and/or software instructions. For instance, in the example of
Although particular features are discussed herein as included within an electronic computing device 1000, it is recognized that in certain embodiments not all such components or features may be included within a computing device executing according to the methods and systems of the present disclosure. Furthermore, different types of hardware and/or software systems could be incorporated into such an electronic computing device.
In accordance with the present disclosure, the term computer readable media as used herein may include computer storage media and communication media. As used in this document, a computer storage medium is a device or article of manufacture that stores data and/or computer-executable instructions. Computer storage media may include volatile and nonvolatile, removable and non-removable devices or articles of manufacture implemented in any method or technology for storage of information, such as computer readable instructions, data structures, program modules, or other data. By way of example, and not limitation, computer storage media may include dynamic random access memory (DRAM), double data rate synchronous dynamic random access memory (DDR SDRAM), reduced latency DRAM, DDR2 SDRAM, DDR3 SDRAM, DDR4 SDRAM, solid state memory, read-only memory (ROM), electrically-erasable programmable ROM, optical discs (e.g., CD-ROMs, DVDs, etc.), magnetic disks (e.g., hard disks, floppy disks, etc.), magnetic tapes, and other types of devices and/or articles of manufacture that store data. Computer storage media generally excludes transitory wired or wireless signals. Communication media may be embodied by computer readable instructions, data structures, program modules, or other data in a modulated data signal, such as a carrier wave or other transport mechanism, and includes any information delivery media. The term “modulated data signal” may describe a signal that has one or more characteristics set or changed in such a manner as to encode information in the signal. By way of example, and not limitation, communication media may include wired media such as a wired network or direct-wired connection, and wireless media such as acoustic, radio frequency (RF), infrared, and other wireless media.
The above specification, examples and data provide a complete description of the manufacture and use of the composition of the invention. Since many embodiments of the invention can be made without departing from the spirit and scope of the invention, the invention resides in the claims hereinafter appended.